关于LabVIEW VISA串口读取的属性节点bytes at port的值为0的问题分析

项目概况:
采用LabVIEW编写了一个上位机软件,主要作用是通过串口给下位机发送各种指令;以Arduino mega2560作为下位机,编写了一段程序,接收到上位机的指令之后进行相应的串口操作。当上位机按下某个按钮之后,LabVIEW执行相应的事件结构,通过串口发送指令,当下位机开始执行对应的程序时,给上位机发送一个字符“D”,作为准备就绪指令,上位机接收到字符,就开始发送数据。

下位机程序段:
下位机程序段
项目问题
在使用过程中,发现串口通讯老是失败,上位机读取下位机发送的准备就绪指令时,VISA的属性节点,bytes at port(读取串口缓冲区字节数),返回的值是0,表示未读取到串口缓冲区有数据,即下位机未发送准备就绪指令。
下位机软件用串口助手进行调试,可以收到准备就绪命令的字符,同样,创建一对虚拟串口,采用串口调试助手对上位机进行调试,发现上位机也可以正常的接受到字符,并运行接下来的程序。
问题分析
查找各大论坛,进行了多次调试,都没有找到有效的解决办法,后来总结问题出现的规律,发现第一次的程序可以正常执行,第二次及以后的操作,都会出错。多次运行之后发现,当上位机第二次发送操作指令的时候,Arduino mega2560上面的串口指示灯闪烁,表明这个时候Arduino的串口被重新打开,而Arduino mega2560在打开串口的时候,程序是会自动复位的,程序从头开始执行。
分析上位机,我在执行了事件结构之后添加了串口关闭,然后执行下一个事件结构的时候,执行到串口发送,会再次打开Arduino mega2560的串口,而此时Arduino程序复位,可能导致了我的串口指令发送失败,下位机没有接收到指令,自然也不会进行相应的操作,下位机也不会发送出准备就绪的命令,所以属性节点bytes at port返回的字节数是0,导致通讯失败。

未加串口打开的程序:
未加串口打开的程序
串口判断是否接收到准备就绪指令的程序:
串口接收准备就绪指令
串口关闭程序:
串口关闭
问题解决
判断出可能导致的原因之后,我在每个事件结构前面都加上了一个串口打开,再去发送数据,目的是提前打开串口,使程序复位,保证下一次串口发送的数据可以被有效接收。改完上位机程序之后,上位机和下位机就可以实现完美通讯了。

加入串口打开的程序:
加入串口打开

猜你喜欢

转载自blog.csdn.net/qq_42806093/article/details/86656914