在日常使用LabVIEW串口通讯过程中,难免涉及到数字的发送。如果将数字直接写入串口,下位机得到的是对应数字字符的ASCII码。例如:写入的是数字50,直接发送时,下位机得到的是字符“50”。如果利用串口中断,会发生两次中断,得到的是字符“5”和“0”,得到的是数字53(字符5的ASCII码值)以及48(字符0的码值)。这样在下位机直接使用时有可能会产生错误。
对此解决的方案有两种,如下:
1、下位机收到字符后进行强转;
2、LabVIEW编写数字到ASCII码转换的函数。
对于方法一,下位机通常执行速率较慢。但也可以将字符存到数组后利用强转函数完成。以下对方法二做出进一步阐述。
在数字转换过程中,我们需要考虑两个问题:1、数字是否大于255,这将决定需要采用几位十六进制数完成传输。2、输入的数字转化为十六进制数后是几位,如果为偶数位,将其两两拆分后发送即可;如果是奇数位,要在前面补0。
以下是我编写的一个数字至ASCII字符转换函数后面板。
在上图所示VI中,输入为数字,输出为ASCII码字符串。程序执行过程中,数字先转换为十六进制整型字符串,之后利用条件结构将得到的十六进制字符串转化为偶数长度的字符串。转换具体实现为:偶数长度字符串不变,奇数长度字符串前面补“0”字符。最终,利用循环依次将所得字符串转换为十六进制数组后利用“字节数组至字符串转换”控件生成ASCII码字符串。
最终,示例运行如下:
输入120,得到其十六进制数为78H,对应转换得到ASCII为x。传输中,将x发出,下位机得到数值120。
输入300,对应十六进制数为12C,此时要在前面补0,得到转换数012C,01H转化为一个ASCII码,2CH转为另外一个。这里要注意01才是16进制数字,1不是,这也是前面补0的原因。此时下位机得到数字1以及44,下位机将高位左移八位加上低位即可。
其余实例此处不再过多赘述,需要提示的是,可以前面板右击更改显示格式,这样可以方便观察结果。
以下是我利用这个代码做的小Demo,是一个24步进电机驱动程序的上位机程序的数据包。
上图中,旋转角度和脉冲频率的输出都用到了上述子VI。可以看到我在发送角度字符之前增加了一个字符长度的发送,这样可以方便单片机运行时判断共有几个字符是数字部分,方便左移组合。