如何把从串口接收到的字符型数据转换为double型并显示出波形(求救)
本帖最后由 bingliang06 于 2009-3-7 09:40 编辑单片机通过串口发给PC机的数据是字符型的,但是我要把字符型数组转换为double型数组,并以double型数组为画图的数据画出相应的波形,但是不知道为什么,发现转换的数据不正确,显示不出波形来,请大家帮我看看那里有问题???本人是初学者,所以请大家对对指教,其中转换部分代码如下:
int CVICALLBACK Receive (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int inputqueuelength;
int bytesread;
char *charmatched=0 ;
double value;
int i;
double valuebuf;
switch (event)
{
case EVENT_COMMIT:
//获得指定端口输入队列字符数
inputqueuelength = GetInQLen (1);
//读取输入队列中字符串
bytesread = ComRd (1, buffer, inputqueuelength);
for (i = 0; i <= bytesread; i ++)
{
charmatched = buffer+1+i;
//将字符串格式数据转化为双精度格式
Fmt (&value, "%f<%s", charmatched);
//把转换的值一个个存入valuebuf数组中
valuebuf=value;
}
break;
}
return 0;
}
然后用想用 PlotY(PANEL, PANEL_GRAPH, valuebuf, 2048, VAL_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED); 函数画波形,但是发现无论输入多少伏的电压,曲线都是在X轴,根本没变化。发现什么错误请大家帮我改正,这个是课程设计来的,月底要交了,请大家救救小弟了。 将项目传上来。不调试不好找出问题。 1、buffer的数据类型是什么?——如果要我猜的话,它应该是char(?)
2、你的单片机中有double型吗?它在下位机中占几个字节?
3、Fmt (&value, "%f<%s", charmatched); 在这里就转换,只能得到错误结果!
4、PlotY(PANEL, PANEL_GRAPH, valuebuf, 2048, VAL_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED); 这里编译就通不过:因为valuebuf和VAL_INTEGER类型不匹配! 另外,还是把你的源码传上来吧!
这样我看起来比较容易! 1、buffer的数据类型是什么?——如果要我猜的话,它应该是char(?)
2、你的单片机中有double型吗?它在下位机中占几个字节?
3、Fmt (&value, "%f<%s", charmatched); 在这里就转换,只能得到错误结果!
4、PlotY(PANEL, PANEL_GRAPH, valuebuf, 2048, VAL_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED); 这里编译就通不过:因为valuebuf和VAL_INTEGER类型不匹配!
回答: 1.没错,是char型。
2.没有double型,只是发送八位的二进制数,串口调试软件接收到的是2E 68 98之类的数。
3.我知道转换的结果是错误的,而且数据错得很离谱,但是就是不知道该怎么样修改,因为是初学者,很多都不会。
4.那是我写错而已。
#include "toolbox.h"
#include <rs232.h>
#include <formatio.h>
#include <cvirte.h>
#include <userint.h>
#include "test_win.h"
static int panelHandle;
int valuebuf;
char buffer;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "test_win.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK Graph (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
PlotY (PANEL, PANEL_GRAPH, valuebuf, 2048, VAL_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
break;
}
return 0;
}
int CVICALLBACK Receive (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int inputqueuelength;
int bytesread;
char *matched=0 ;
int value;
int i;
switch (event)
{
case EVENT_COMMIT:
//获得指定端口输入队列字符数
inputqueuelength = GetInQLen (1);
//读取输入队列中字符串
bytesread = ComRd (1, buffer, inputqueuelength);
for (i = 0; i <=bytesread; i ++)
{
matched = buffer+1+i;
//将字符串格式数据转化为双精度格式
Fmt (&value, "%d<%s", matched);
valuebuf=value;
}
break;
}
return 0;
}
/*int CVICALLBACK Clear (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
// ResetTextBox (PANEL, PANEL_RECEIVETEXT, "\0");
break;
}
return 0;
} */
int CVICALLBACK Reset (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
OpenComConfig (1, "COM1", 9600, 0, 8, 1, 2048, 2048);
SetCTSMode (1, LWRS_HWHANDSHAKE_OFF);
FlushInQ (1);
FlushOutQ (1);
break;
}
return 0;
}
int CVICALLBACK Quit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
CloseCom (1);
QuitUserInterface (0);
break;
}
return 0;
} 完整工程如下,是9.0版本的,不知道你们能不能打开?不能的话就看上面的程序了,希望版主和大家帮我的错误改正过来。 串口通讯的核心问题是双方的通讯协议,没有这些,看程序是看不出任何东西的!
比如:“ 2.没有double型,只是发送八位的二进制数,串口调试软件接收到的是2E 68 98之类的数。”——如果你不了解下位机的数据类型,就根本无法解码!例如:有些单片机中的int型只占两个字节,而上位机(32位平台)中int型占4个字节!
所以,你即便将上位机程序发上来也无法看出实际问题!重要的是你的通讯协议!!! 不明白你说什么,先不管单片机那边吧。如果把串口通信的2和3脚短接,然后发送一些字符再接收后转换为数字显示出来该怎么编程啊。现在就是把缓存中的每个单元的ASII码直接转换为相应的数字。 在C中,收到的是CHAR型数据。CHAR型本身可以直接可以显示。如果不行,直接赋给INT或DOUBLE也可行的。 无语。。。
你对串口通讯毫无概念!
关于串口通讯的流程我以前在论坛中说过,你先搜索一下!现有个正确概念吧! 另外,你传上来的工程文件是什么?! 兄弟啊,你上传的文件中怎么没有源码啊?这叫别人怎么看得明白啊!串口通信一定要先弄懂协议,不然你收到的数据,也不知道是什么意思,怎么看得出来是对还是错啊!最好是先在网上下个串口调试的软件,先玩玩,之后再用CVI来写,可能会容易点! 非常赞同你的观点,我目前在做PC通过串口监控变频器的东东,串口的基本读写程序其实很易理解,但是你如果不好好理解通讯协议的话,程序就会报出很多莫名其妙的错误。 7# netcreature 看晕了~~
看来cvi不好弄
页:
[1]