发送命令Visa Write:发送命令时,其按初始化打开串口的格式操作,如波特率,奇偶检验,结束符等。返回变量 return count 大小仅指 write buffer 的长度,write buffer 是"#01",那么return count 返回3。
读取缓冲区Visa Read:首先应该输入想要读取多少字节 byte count,return count为实际读取到的字节数量。读取之后串口缓冲区字节数将相应减少return count。比如缓冲区现在存有22个字节,
如果输入 byte count 等于22,那么将读出所有22字节,同时 return count返回22;
如果输入 byte count 等于20,那么将读出缓冲区前面20字节,return count返回20,此时缓冲区内还有2字节,这时如紧接着Visa Read调用串口属性 Number of Bytes at Serial Port,其值为2,在其它情况下,其值为0。但是如果在 Visa Read后先调用VISA高级节点Visa Flush IO Buffer,清空缓冲区,再调用属性 Number of Bytes at Serial Port,其值也将返回0;
如果输入 byte count 大于22,那么将读出所有22字节,同时 return count返回22。
串口写入读取操作的以上特点,决定了在实际编写串口程序时应考虑的一些问题:
通常情况下,一个串行通信程序由数据采集与信号控制组成。数据采集需要循环采集,而信号控制只在有需要时发出控制命令。控制命令发出后,一般需要判断设备是否响应了命令,这就需要读取输入缓冲区。但在发送控制命令时,数据采集命令可能也正在发送,因为数据采集是不断循环采集的,因此此时输入缓冲区可能是采集到的数据,也有可能是控制命令的响应报文,采集的数据与控制命令响应报文在字节大小与报文格式上一般不同。比如采集的数据为: >+0022.3 ,控制命令响应报文为 !01 ,那么此时
如果程序先读取数据,那么读取byte count等于8,之后缓冲区大小为0,而此时再读取响应就为空,程序会认为设备未能正确响应控制,将放弃此次操作,重新发送控制命令;
如果程序先读取响应,那么读取 byte count等于3,如果此时对应的缓冲区为 >+0022.3,那读取到的格式与响应报文不一致,程序应判断为设备未正常响应控制命令,应放弃此次操作。读取响应之后缓冲区变为022.3,此时读取采集数据,将只读到5个字节,且与数据格式不一致,程序应放弃数据,重新发送数据采集命令。
这就会造成在发送控制命令时,采集与控制混乱。可能造成报文丢失,且程序需多次发送命令,运行效率降低。
解决办法:设置一采集中断位,在发送信号控制命令前,采集中断位置位,然后再发送控制命令,待控制命令正常响应后,采集中断位复位。
示例程序:
数据采集:
信号控制: