当前位置:文档之家› labview中 我现在在做一个上位机对串口发送 ASCII码和十六

labview中 我现在在做一个上位机对串口发送 ASCII码和十六

在LabVIEW中使用串口
第一部分使用LabVIEW系统VI
一、串口VI介绍
LabVIEW的串口通讯VI位于Instrument I/O Platte的Serial中,包括:
VI名称 VI功能
VISA Configure Serial
Port
初始化VISA resource name指定的串口通讯参数 VISA Write 将输出缓冲区中的数据发送到VISA resource name指定的串口
VISA Read 将VISA resource name指定的串口接收缓冲区中的数据读取指定字节数的数据到
计算机内存中
VISA Serial Break 向VISA resource name指定的串口发送一个暂停信号
VISA Bytes at Serial
Port
查询VISA resource name指定的串口接收缓冲区中的数据字节数 VISA Close 结束与VISA resource name指定的串口资源之间的会话
VISA Set I/O Buffer
Size
设置VISA resource name指定的串口的输入输出缓冲区大小
VISA Flush I/O Buffer 清空VISA resource name指定的串口的输入输出缓冲区
二、使用说明
在LabVIEW环境中使用串口与在其它开发环境中开发过程类似,基本的流程框图如下。

图1、串口操作数据流图
首先需要调用VISA Configure Serial Port完成串口参数的设置,包括串口资源分配、波特率、数据位、停止位、校验位和流控等等。

图2、初始化串口
如果初始化没有问题,就可以使用这个串口进行数据收发。

发送数据使用VISA Write,接收数据使用VISA Read。

在接收数据之前需要使用VISA Bytes at Serial Port查询当前串口接收缓冲区中的数据字节数,如果VISA Read要读取的字节数大于缓冲区中的数据字节数,VISA Read操作将一直等待,直至Timeout或者缓冲区中的数据字节数达到要求的字节数。

当然也可以分批读取接收缓冲区或者只从中读取一定字节的数据。

图3、从串口发送数据图4、从串口接收数据
在某些特殊情况下,需要设置串口接收/发送缓冲区的大小,此时可以使用VISA Set I/O Buffer Size;而使用VISA Flush I/O Buffer则可以清空接收与发送缓冲区。

在串口使用结束后,使用VISA Close结束与VISA resource name指定的串口之间的会话。

图5、设置缓冲区大小图6、清空缓冲区图7、结束会话/线程
具体的例子可以参考:examples\instr\smplserl.llb。

第二部分使用MSCOMM控件
在LabVIEW中使用MSCOMM控件,与在VC、VB中使用一样。

同样可以使用中断方式进行接收。

图8、使用控件的串口收发程序
图9、程序数据流图
首先通过LabVIEW的工具菜单“Tools >> Advanced >> Import ActiveX Controls”将Microsoft的串口控件-“Microsoft Communications Control,version 6.0”添加到LabVIEW环境中,存放在缺省路径即可,这样在User Controls Palette里面可以找到这个控件。

图10、添加ActiveX控件菜单
图11、选择添加用户控件
图12、用户控件
将串口控件放置在Front Panel上,在框图程序中用控件属性对其进行编程,实现所需要的功能。

注意:一个串口资源要有一个MSCOMM控件与之相对应。

第三部分注意事项
一、串口通讯的波特率设置要精确,比如要求9600的波特率,则晶振应选择11.0593MHz 或其倍数。

二、由于通常情况下LabVIEW串口VI接收或发送的都是字符串(Normal),所以如果需要发送或接收十六进制数值(Hex),请在发送或接收之前进行必要的转换。

2.1、数值型数据的处理方法:
1.如果这些数据是静态的,也就说在程序设计阶段要传输的数据就已经确定了,在这
种情况下,首先设置VISA Write的write buffer的显示属性为Hex Display,然后直
接输入要发送的16进制字符串就可以了。

串口设备的控制命令通常是由一个或多个16进制字符组成的,当我们需要对其进行控制时经常会采用这种方法发送控制命
令。

2.数据是动态的;即要传输的数值型数据是动态产生和变化的,在发送之前首先要将
其转换成对应的16进制字符串,才能赋给VISA Write发送。

将这些数据构成一个
数组,用Byte Array To String进行转换,转换的结果就是对应数组数值的字符串,可以提交VISA Write发送。

或者使用Type Cast也可以实现同样的功能。

图13、串口数据转换界面
图14、串口数据转换数据流图
图15、操作界面
图16、单片机C程序
2.2、字符串型数据的处理方法:
我们在处理过程当中,传输的数据可能具有一定格式或协议,比如一个完整的数据帧包括起始段、数据段、校验段等等,而每一段往往又有几个部分组成,这几个部分的类型和长度可能又不尽相同,可能是数值型的,可能是字符型的,也可能是布尔型的,单字节或者是多字
节。

此时我们往往都采用统一的字符形式来处理这些数据,因此有时候我们说,字符是LabVIEW里最方便的数据类型。

经过打包的字符数据要经过串口发送需要进行必要的转换,否则传输将出错。

比如我们打包过后需要发送的的字符串为:34 12 56 78 94(空格为了区分),如果直接将其赋给VISA Write 发送,串口上的数据将是:33 34 31 32 35 36 37 38 39 34。

正确的转换程序如下。

图17、字符型数据处理
数据接收:
从计算机串口接收到的数据是16进制的ASCII码,要转换成对应的数值型数据,可以使用String To Byte Array或者Type Cast。

三、LabVIEW串口VI不能使用中断方式传输。

关于串口通信的一个问题
labview中我现在在做一个上位机对串口发送 ASCII码和十六位进制转换问题
问题内容:
比如我的上位机打算发一个0x55 我的意图是发十六进制的55
但是串口输入输出都只能是字符串格式 55的字符串格式就变成发送ASCII码的55了就变成发送十六进制的3535了这个怎么解决?收发都有这个问题~ 分数不多急用谢谢各位了~
问题补充:
可能写的不清楚
比如我要发55 就是二进制的01010101 但是输入端不让直接发数字要转化成字符
我怎么转化成字符使字符还是01010101
最佳回答:
你的意思我大概清楚了。

这么给你解释下吧:且不管你的老师说的是什么,首先,在LabVIEW里,不管你的上位机发送的具体内容是什么,其给串口的指令对于LabVIEW来说都应是字符。

比如你要发的是字符“a”,那么发送的就是“a”;如果你要发送数字“15”,则LabVIEW实际能发送的是ASCII码为15的那个字符。

所以如果要发字符或者文本,直接发就是了,如果要发数字,则先将其转换为字符,我记得LabVIEW里有这样的vi,可以将15转换为其对应字符而不是转成文本的“15”。

当然如果你要发的是字符串“15”,那就按照字符的做法直接发就是了。

接收也是一样的,你收到的永远是字符或文本,这个不用担心。

其次,关于进制的问题。

这个只是指令设计者自己为了指令形式易懂易操作而弄的,对于程序,它不知道这是多少进制,它只需要发送的字符是正确的就可以。

比如你发55H,一定要事先将其变为十进制的85,这样发送的字符才是正确的。

至于它是什么01010101 的形式还是其他什么形式程序是不管的,它只要85对应的字符。

最后,如果你是为了输入指令方便想要弄成16进制输入或者显示,将基数改为16进制即可。

总结下就是:不管发什么,最终都应发送字符或文本,不要管指令的具体形式是什么,只要知道你发送的数据10进制是多少就OK了。

提问者回复:
ok~万分感谢
追问:
不好意思打扰了
0x55 0xAA 这类数字我懂了
但是如果我想输入文本呢?我做了一个读取文本文档的东西里面读出的都是ASCII码的形式吧?
如果我想发这类的也可以直接从ASCII码转为十六进制数么??
实在是不好意思~我们老师也不太懂救命稻草呀~
回答:
你指的文本是什么意思,是你要发送给下位机的字符串还是ascii组成的16进制数构成的一串“字符串”
评价回答:
ok~万分感谢
其他回答:
发送的就是ascii中55H对应的字符,创建数组,基数改为16进制,第一个元素输入55,然后接u8数组
转字符串,然后写入visa即可。

相关主题