cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 2173|回复: 14

怎么让CVI接收一个单片机的完整数据帧呢?

[复制链接]
发表于 2009-1-15 14:54:19 | 显示全部楼层 |阅读模式
单片机按照一定的格式往电脑发送不同类型的数据帧,在labwindows/cvi怎么完整的接收啊?
比如:
F5 36 00 00 36  是一个数据帧,
怎样让它分别完整的接收啊?
我看了CVI中串口通信提供的例子,但接收到的是乱码
不能将上述的数据帧显示出来
该怎么办?
发表于 2009-1-15 15:29:50 | 显示全部楼层
拜托了!不要老是这样不明不白地乱贴东西!
“F5 36 00 00 36  是一个数据帧”——这是什么数据?ASCII字符码?还是十六进制字节码?
通讯协议是怎样的?
这些东西都不提,谁能看明白!
发表于 2009-1-15 19:35:03 | 显示全部楼层
兄弟啊,先要搞清楚通信协议啊!如果在CVI中用串口不好使用的话,先在网上下载一个串口调试的程序,先玩玩再用CVI来写!
 楼主| 发表于 2009-1-16 09:31:08 | 显示全部楼层
是我没说明白。
发送的是十六进制字节码,不是ASCII字符码
现在可以把单片机上的这帧数据传到CVI中,但显示的却是十进制。
发表于 2009-1-16 10:27:35 | 显示全部楼层
 楼主| 发表于 2009-1-16 16:25:56 | 显示全部楼层
串口设置是程序里的默认设置
传上来的却是十进制的,用串口调试工具进行十六进制显示应该是:F5 20 A1 11 D2
该怎么办呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2009-1-16 16:38:20 | 显示全部楼层
我试着用Fmt(string,"%x",in_data),在string控件也能显示,但显示出来的却是fffffff5 20 ffffffa1 11 ffffffd2
怎么能让它显示成F5 20 A1 11 D2呢?
发表于 2009-1-16 19:41:25 | 显示全部楼层
兄弟啊,你串口读到的数据是字符型的!你最好把收到的字符型数据(存在字符数组里的)一个个转换成十六进制的数据!用Fmt(String,"%x",in_data)不能那样直接转的!去看下Help里面的Fmt()的用法,介绍得很详细的!
发表于 2009-1-19 13:33:16 | 显示全部楼层
刚才大致看了一下你的程序:你将程序的接收和发送过程都放在定时器的回调函输中。
对于发送过程,这样安排也可以。但是,对于接收过程,你这样能保证连续接受的数据都是完整的吗?
“我试着用Fmt(string,"%x",in_data),在string控件也能显示,但显示出来的却是fffffff5 20 ffffffa1 11 ffffffd2
怎么能让它显示成F5 20 A1 11 D2呢?”——这是因为你的in_data定义为int类型,它在32位系统中占4个字节,所以,格式化后有8个字符!要显示为两个字符时,应该先将它强制转化为Byte类型或char类型!
发表于 2009-1-19 19:39:53 | 显示全部楼层
CVI中可以定义成Byte类型的数据吗????要帮别人看程序是件很郁闷的事,每个人写程序都有自己的习惯,如果很长的话真的很难啊!CVI中可以设断点,查看变量的变化过程,自己查看下就出来了,下次写的时候印象就会更深刻了!

评分

参与人数 1经验 +8 收起 理由
netcreature + 8 呵呵!我记错了! CVI中只有char类型。

查看全部评分

发表于 2009-1-20 08:50:13 | 显示全部楼层
呵呵...
说错话了。一不留神,就将C++/CLI中的数据类型和CVI中的混淆了!CVI中没有Byte数据类型。
发表于 2009-1-20 11:20:06 | 显示全部楼层
首先要要明白从串口传上来的是字符串,要对收到的字符串正确的处理才可以得到正确的结果.
数据格式:包括起始位、数据位、停止位、奇偶校验等.
帧格式: 帧头+符号位+数据+帧尾

兄弟可参考下面的程序:
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位停止位,无奇偶校验.

希望对你有帮助!

评分

参与人数 1经验 +8 收起 理由
netcreature + 8 我很赞同

查看全部评分

发表于 2009-1-20 11:26:36 | 显示全部楼层
另外在串口的启用函数中要指定串口的回调函数,在串口的回调函数中对收到的字符串进行处理.
指定串口回调函数可参考"InstallComCallback();"函数.
发表于 2009-4-12 16:01:01 | 显示全部楼层
别人不会才来问的嘛,有谁一生下来就什么都明白?希望大家心平气和的交流
发表于 2022-3-7 14:22:23 | 显示全部楼层
int x;
char y[250];
x=ComRdByte(comSelect);
sprintf(y,"%x ",x);
SetCtrlVal(PANEL,PANEL_RECIVETEXT,y);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-6 17:13 , Processed in 1.110193 second(s), 11 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表