LabVIEW与单片机通讯(2)
由于LabVIEW中接收到的数据都是以字符串的形式显示出来的,所以需要将字符串转换为ASCII码,一般可以直接使用“转换为U8数组”这个函数,如下图所示:
图 5 字符串转换为U8字节
转换为U8字节后,得到的是所传输字符的ASCII码,我们就很容易进行数据帧的判断了,现收到以下的字符串数据:,
©图 6 实际接收到的字符串
上图中下半部分显示的数组是使用“字符串转换为U8数组”的函数转换之后得到的数组,一个是十六进制显示,另一个为十进制显示。对照定义的数据帧格式,就很容易得到我们需要的数据了。
首先是要看从哪里开始才是完整的第一帧,从上面十六进制显示的数组中我们可以看到,并不是第一个
字节就是我们需要的帧头,因为下位机是一直处于发送数据的状态,很可能在串口发送一帧数据的过程中串口就被初始化或者被清空了一次缓冲区,那么这一帧数据的前面部分数据可能就会丢失,只留下后面一部分数据。
以上图为例子,第一二个字节为0x32、0x22,显示不是我们要的帧头,我们要的帧头是在第6、7个字节,以程序来实现的话就是先查找第一个帧头,使用“搜索字符串”,如果找到则判断它下一个字节是否是第二个帧头,如果是,表明已经找到帧头,输出帧头的位置;如果它下一个字节不是第二个帧头,说明这里不是真正的帧头,继续查找下一个帧头,直到找到帧头或搜索完整个字符串都找不到帧头。
这是一个程序的算法问题,具体实现的程序如下图所示:
图 7 帧头查找程序
帧头查找到以后,再找数据就容易了,根据之前的定义,第4、5、6个字节是才是我们要的数据,所以直接使用索引号进行索引输出即可。
图 8 获取实际数据
一般情况下,如果是用三个字节表示一个数据的话,那么这三个字节分别表示为一个数据的高中低字节,即高字节要乘以25536再加上中字节乘以256再加上低字节的,这样定义后可表示的数据的范围就会扩大很多,但这里为了说明问题,直接认为三个字节的数据相加就是我们要的实际数据,在实际使用过程中应该根据帧格式的字义来解析这个数据。
另外帧格式中定义了最后一个字节为状态标志位,所以提取数据前还要检查一下这个标志位是否正常,不正常时要进行相应的处理,这里不再详细描述。
至此完成一次数据帧的提取。
如果是没什么特殊的要求的话,这里应该也算到一段落了,有一些对测试时间有要求的地方,就会要求在最短的时间内得到最多的信息。图6中我们可以看到,接收到的数据帧中,除了中间一个完整的帧之外,头尾还有一些无用的数据,其实这些数据中也包含了有用的信息的!
比如我们可以从0xAC、0x96这二个帧的位置中推断中它前面的0x22、0x2A、0x38这三个字节也是我们想要的数据字节,但是由于没有接收到它的帧头,所以程序没能提取出来,但我们可以从后一帧的帧头推算出前面那一帧的数据字节是哪些,即使没收到前面那一帧的帧这里只给出一个流程,不再给出具体的程序。
另外有可能接收的数据长度比较长,可能就不止包含了一帧的数据在里面,所以在程序中也要判断一下剩下的数据还够不够一帧的数据长度,如果够则可以根据上一次查找的帧头位置+数据帧长度来确定下一个数据帧的帧头位置了,不需要使用搜索的方法。也可能存在处理完一帧数据后,剩下的数据不够一个帧的,这时可以将这些剩下的数据保留起来,将它添加到下一次接收到的数据前面,组成新的数据再进行处理。去掉已经处理的数据可以使用“删除数组元素”这个函数来实现。这里也不再给出具体的程序。
6.串口数据类型的转换
由于LabVIEW中VISA Read/Write这二个函数都是只能读取/写入字符串类型的数据的,而有时候需要接收/写入的数据类型不一定是字符串,导致在刚开始接触的时候会有一点困惑。
在进行数据转换时,只要记住计算机中所有数据都是以二进制保存这个原则就容易解决问题了。串口线上传输的也是高低,串口接收到的也是二进制数据,只是到LabVIEW后被转换为字符串格式了。还是以例子进行解释。
6.1LabVIEW从串口接收数据
①假设LabVIEW从串口接收到的数据为“1234”(正常显示模式下),那么这个数据在串口底层的时候其实是这样的二进制数据:
00110001 00110010 00110011 00110100
只是在LabVIEW中,这些二进制数据是以字符串形式显示出来的,它们的实质还是二进制数据,这几个二进制数据转换为十进制数据分别是“49,50,51,52”,由于字符串都是以ASCII码形式保存在计算机中的,那么49,50,51,52这几个数在ASCII表中就表示是字符串“1,2,3,4”。所以这几个数据在LabVIEW中就显示为字符串的1,2,3,4了。
如果明白这里面的转换关系,那么要进行数据转换时就很容易了,比如上面的例子中,如果LabVIEW中接收到的是字符串“1234”,而原本下位机传送的是数值型数据,只需要将“1234”字符串转换为对应的ASCII值就是实际上下位机传上来的数据了,就是“49,50,51,52”
LabVIEW中将字符串转换为对应的ASCII值的函数是“字符串至字节数组转换”
这个函数:
图 9 字符串转换为字节数组
上面说的是下位机发送的是数值类型的数据的,使用“字符串至字节数组转换”这个函数.
②如果是下位面发送的是字符串类型的数据,那么LabVIEW已经直接转换好了。
个人总结:无论下位机发送的是何种类型的数据,LABVIE从串口接收的时候,总是将每8位二进制数,作为字符的ASCII码解读。
6.2使用LabVIEW发送数据
还有一个问题是使用LabVIEW发送数据的问题
①如果下位机接收的是字符串数据类型的话,直接用VISA写入对应的字符串就行了,现在的仪器一般都是接收字符串的,所以可以直接使用VISA发送而不需要转换。
②如果下位机接收的是数值型数据的话,就需要转换一下,其中数值型又是十进制和十六进制二种用得比较多,这二种数据间相互转换一下就行了,其实是一样的。
由于在LabVIEW中字符串直接有十六进制的显示方式,所以发送十六进制的数据比较方便,比如要发送十六进制数值类型的“0xAF”,那么在VISA Write的写入缓冲区字符串常量上右键>>十六进制显示,如图1,直接输入“AF”即可,那么下位机接收到的就是正确的数据(十六进制数值类型)了。
但实际使用过程中,一般都是需要将某个子VI输出一个动态的字符串通过VISA Write发送到下位机的,这时候就需要对数据进行转换一下,这个转换过程描述起来就是:将字符串A转换为字符串B,使得正常显示的字符串A跟十六进制显示的字符串B是一样的。
由于转换目标(十六进制显示的字符串)的数据类型是十六进制,要想十六进制显示的字符串跟正常显示的字符串一样,这个正常显示的字符串必须都是十六进制的字符,即只能由0-9,A-F这十六个字母中的字母组合而成。否则就没办法使二种显示方式的字符串一致了。
这个转换过程首先将字符串转换为十六进制数值型,然后再通过将这个十六进制数值创建为一个数组,最后再使用“字节数组至字符串转换”这个函数转换为字符串即可,实际上就是图5字符串转换为U8字节的反向操作,只不过是这个十六进制的值初始类型是十六进制,要先转换为数值类型。具体程序如下图所示。
图 10 正常显示字符串转换为相同的十六进制显示的字符串
由于十六进制数据由二个字节构成,而 …… 此处隐藏:2274字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [专业资料]《蜜蜂之家》教学反思
- [专业资料]过去分词作定语和表语1
- [专业资料]苏州工业园区住房公积金贷款申请表
- [专业资料]保安管理制度及处罚条例细则
- [专业资料]2018年中国工程咨询市场发展现状调研及
- [专业资料]2015年电大本科《学前教育科研方法》期
- [专业资料]数字信号处理实验 matlab版 离散傅里叶
- [专业资料]“十三五”重点项目-虎杖白藜芦醇及功
- [专业资料]2015-2020年中国竹木工艺市场需求及投
- [专业资料]国际贸易理论与实务作业五:理论案例分
- [专业资料]财政部修订发布事业单位会计制度
- [专业资料]BCA蛋白浓度测定试剂盒(增强型)
- [专业资料]工程进度总计划横道图模板(通用版)
- [专业资料]七年级地理同步练习(天气与气候)
- [专业资料]X光安检机介绍火灾自动报警系统的组成
- [专业资料]衢州市人民政府办公室关于印发衢州市区
- [专业资料]经济全球化及其影响[1]
- [专业资料]质粒DNA限制性酶切图谱分析
- [专业资料]国家安全人民防线工作“六项”制度
- [专业资料]劳动力投入计划及保证措施
- 电子账册联网监管培训手册
- 人教版语文七年级上第1课《在山的那边
- 对我区担保行业发展现状的思考与建议
- 平面四边形网格自动生成方法研究
- 2016年党课学习心得体会范文
- 如何设置电脑定时关机
- 全球最美人妖排行榜新鲜出炉
- 社会实践调查报告及问卷
- Visual Basic习题集
- 《鱼我所欲也》课件2
- 浙江省会计从业资格考试试卷
- 全遥控数字音量控制的D 类功率放大器资
- 鞍钢宪法与后福特主义
- 电表的改装与校准实验报告(1)
- 2014年高考理科数学真题解析分类汇编:
- Windows 7 AIK 的使用
- 风电场全场停电事故应急处置方案
- 化工原理选填题题库(下)
- 关于产学研合作教育模式的学习与思考
- 西安先锋公馆项目前期定位报告




