当前位置:编程学习 > VC++ >>

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控件怎么能够动态的增加标签,删除标签,就像浏览器那样的,能给个具体例子更好,谢谢了哈

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,