关于在串口通信时遇到的问题debug记录
最近遇到一个比较有意思的问题,在此记录一下
问题描述:
在java的PC工具与开发板进行串口通信时,在我自己的电脑上通信正常,但是将java工程打包成jar后放到别的电脑上使用,通信仅一个字节后中止
猜测问题原由:
1.串口驱动版本\java的串口通信dll文件与系统位数不对应
2.java运行环境(jdk/jre)不对应
3.串口通信参数设置不对(数据位/停止位/校验位/波特率)
然后在调试过程中开始了漫长的实验(事实表明自己的经验还是不足,怀疑问题的方向都过于应用层,其实应该从通信数据和方式开始着手,而不是从上层开始)
调试过程:
1.更换我自己的java环境到另外一台电脑上(失败)
2.下载对应版本的串口驱动(失败)
3.退回到最初的软件版本,看是否是因为其他代码内容的影响(失败)
4.利用串口监测工具查看串口通信数据(得到了数据出问题在于设计数据握手过程没有完成)
5.尝试改变握手通信数据的发送方式(之前是一串字符互逐个相发送无误后代表握手成功),java工具改为一次将字符串发送过去等待对方一次性的回应(通信开始正常)
定位原因:
在开发板上的串口逐个等待字符的时候是带超时时间的,如果串口缓存区中没有数据可以取的时候,开发板软件会重新从第一个字符开始等待接受,但是更换电脑后,可能对存取数据到缓存区的速度有所改变,导致开发板未在设置时间中取到按顺序发送的字符串进行握手,导致二者死锁,通信无法正常进行
总结:
在设计这类串口通信的程序时握手过程要尽量避免出现这类因为超时发生的死锁,尽量采用死等的方式去进行握手操作,实在要用超时等待的时候需要根据通信类型合理设置超时时间,避免造成双方通信过程异常
小疑问:
不同电脑之间串口通信速率主要由电脑主板的集成芯片和数据线决定?而不是由理想设定的波特率决定吗?应该要达到最低标准吧,哈哈哈,真是一个奇怪的现象