怎么让CVI接收一个单片机的完整数据帧呢?
单片机按照一定的格式往电脑发送不同类型的数据帧,在labwindows/cvi怎么完整的接收啊?比如:
F5 36 00 00 36是一个数据帧,
怎样让它分别完整的接收啊?
我看了CVI中串口通信提供的例子,但接收到的是乱码
不能将上述的数据帧显示出来
该怎么办? 拜托了!不要老是这样不明不白地乱贴东西!
“F5 36 00 00 36是一个数据帧”——这是什么数据?ASCII字符码?还是十六进制字节码?
通讯协议是怎样的?
这些东西都不提,谁能看明白! 兄弟啊,先要搞清楚通信协议啊!如果在CVI中用串口不好使用的话,先在网上下载一个串口调试的程序,先玩玩再用CVI来写! 是我没说明白。
发送的是十六进制字节码,不是ASCII字符码
现在可以把单片机上的这帧数据传到CVI中,但显示的却是十进制。 楼主直接把你的程序发上来吧!
这样交流实在太累了! 串口设置是程序里的默认设置
传上来的却是十进制的,用串口调试工具进行十六进制显示应该是:F5 20 A1 11 D2
该怎么办呢? 我试着用Fmt(string,"%x",in_data),在string控件也能显示,但显示出来的却是fffffff5 20 ffffffa1 11 ffffffd2
怎么能让它显示成F5 20 A1 11 D2呢? 兄弟啊,你串口读到的数据是字符型的!你最好把收到的字符型数据(存在字符数组里的)一个个转换成十六进制的数据!用Fmt(String,"%x",in_data)不能那样直接转的!去看下Help里面的Fmt()的用法,介绍得很详细的! 刚才大致看了一下你的程序:你将程序的接收和发送过程都放在定时器的回调函输中。
对于发送过程,这样安排也可以。但是,对于接收过程,你这样能保证连续接受的数据都是完整的吗?
“我试着用Fmt(string,"%x",in_data),在string控件也能显示,但显示出来的却是fffffff5 20 ffffffa1 11 ffffffd2
怎么能让它显示成F5 20 A1 11 D2呢?”——这是因为你的in_data定义为int类型,它在32位系统中占4个字节,所以,格式化后有8个字符!要显示为两个字符时,应该先将它强制转化为Byte类型或char类型! CVI中可以定义成Byte类型的数据吗????要帮别人看程序是件很郁闷的事,每个人写程序都有自己的习惯,如果很长的话真的很难啊!CVI中可以设断点,查看变量的变化过程,自己查看下就出来了,下次写的时候印象就会更深刻了!allqq-mogudiandian-46all 呵呵...
说错话了。一不留神,就将C++/CLI中的数据类型和CVI中的混淆了!CVI中没有Byte数据类型。 首先要要明白从串口传上来的是字符串,要对收到的字符串正确的处理才可以得到正确的结果.
数据格式:包括起始位、数据位、停止位、奇偶校验等.
帧格式: 帧头+符号位+数据+帧尾
兄弟可参考下面的程序:
if (ComRdTerm (Port, bufD, 10, 0x0D)<0)
{
ReCloseCom();
MessagePopup("ERROR","Please make sure the port parameter is right!");
}
else
{
CopyString(bufD1,0,bufD,1,9); //从上传的字符串中提取数值字符
readvalue=(atof(bufD1)/100);//类型转换
..........
像上面,帧结束标志就是"0x0D" .数据格式为10位,1位起始位,8位数据位,1位停止位,无奇偶校验.
希望对你有帮助! 另外在串口的启用函数中要指定串口的回调函数,在串口的回调函数中对收到的字符串进行处理.
指定串口回调函数可参考"InstallComCallback();"函数. 别人不会才来问的嘛,有谁一生下来就什么都明白?希望大家心平气和的交流 int x;
char y;
x=ComRdByte(comSelect);
sprintf(y,"%x ",x);
SetCtrlVal(PANEL,PANEL_RECIVETEXT,y);
页:
[1]