关于在串口通信时遇到的问题记录

本文记录了Java的PC工具与开发板串口通信时,打包成jar在其他电脑使用仅通信一个字节就中止的问题。经调试,发现是开发板串口等待字符有超时时间,换电脑后缓存区存取速度改变致握手失败。总结指出设计串口通信程序要避免超时死锁,合理设置超时时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

小疑问:
不同电脑之间串口通信速率主要由电脑主板的集成芯片和数据线决定?而不是由理想设定的波特率决定吗?应该要达到最低标准吧,哈哈哈,真是一个奇怪的现象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值