VC6.0 mfc的mscomm控件与单片机串口通信 接收数据不成功
单片机每次发送5个int型数据,串口接收到后把这5个数据分别存入5个edit控件中。不知什么原因我无法读出5个完整数据?哪位高手帮我指点迷津?
补充:代码:
void CDirexitongDlg::OnOnCommMscomm1()
{
VARIANT variant;
COleSafeArray safearray;
long len=0, k=0; //转换为数组时使用的变量
BYTE rxdata[100]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString stremp;
variant = m_comm1.GetInput();//读缓冲区
safearray = variant; //VARIANT型变量转换为ColeSafeArray型变量
len = safearray.GetOneDimSize(); //得到有效数据长度
for(k = 0; k < len; k++) //将ColeSafeArray型变量转换为BYTE型数组
{safearray.GetElement(&k, rxdata +k);//转换为BYTE型数组 }
if(len>10)
{
stremp.Format("%2.1f",((rxdata[0]+rxdata[1]*256)/10));//计算成实际电压值
SetDlgItemText(IDC_STATIC1,("进水温度: "+stremp+" V")); //更新静态文本
stremp.Format("%2.1f",((rxdata[2]+rxdata[3]*256)/10));
SetDlgItemText(IDC_STATIC2,("出水温度: "+stremp+" V"));
stremp.Format("%2.1f",((rxdata[4]+rxdata[5]*256)/10));
SetDlgItemText(IDC_STATIC3,("进水温度: "+stremp+" V"));
后面代码重复
}
}
用串口调试助手接收单片机数据能正确接收。
追问:试过了,还是不行,好行不是这方面原因。我现在的疑惑是safearray.GetElement(&k, rxdata +k);是怎么转化成BYTE型数组的,我感觉错误就出在这里,因为我总是无法读出数据。有时读出的数据也不是自己发送的。初始化 com1 9600 无校验 8位数据 一个停止位台式机,有串口。串口初始化正确,因为能接收到数据。我用串口助手就能正确收到数据
答案:进制问题,看我的例子
str1.Format("%2x",rxdata[20]);
int d1;
sscanf(str1,"%x",&d1);
d1=d1*165;
str1.Format("%d",d1);
float d3;
sscanf(str1,"%f",&d3);
d3=d3/10000;
str1.Format("%0.3f",d3);
其他:不贴出代码,看不出问题呀 似乎 是 VB 编程 问题
推荐看书
Visual_Basic与_RS-232_串行通信控制 串口通信的步骤。
(1)初始化串口,这里包括串口是几,传送波特率,发送和接受缓冲区
(2)接收监听函数,就是监听接收缓冲区有没有数据。
我估计你是接收监听函数里面处理有问题,把你的串口初始化,和监听函数放出来看看。 mscomm控件属性页的“缓存”页下的“R阀值”改成10,这样保证串口控件每读入5个字(int)产生一次触发事件。 rxdata是字节型……很容易溢出……
先用串口调试工具看看你的单片机有没有把数据正确发来吧。 stremp.Format("%2.1f",((rxdata[0]+rxdata[1]*256)/10));//计算成实际电压值
我觉得这句有问题,(rxdata[0]+rxdata[1]*256)/10全是整数,你强行将之转换成浮点型字符串
应该这样写
stremp.Format("%2.1f",((rxdata[0]+rxdata[1]*256)/10.0));
把/10换成/10.0
上一个:vc ado中结构体数据存到sql数据库中
下一个:VC中Tab控件怎么能够动态的增加标签,删除标签,就像浏览器那样的,能给个具体例子更好,谢谢了哈