C linux: 串行通信在接收数据时丢失了一些首字节

C linux: Serial communication lost some first bytes when receive data

我正在研究 Linux 使用 modbus rtu RS485 发送和接收数据的系统。我的设备是主机,每 1 秒发送一次“请求最新数据”(8 字节包括 2 字节 CRC)到从机(从现在开始只有 1 个从机)。当 Slaver 收到请求时,他们将准备数据(71Bytes 包括 CRC)并发送回 Master。我看不到 Slaver 的来源,因为这是商业产品。 Master和Slave都使用相同的波特率38400.

结果:

  1. 当检查Master和Slaver之间的通信时,有时(平均为1-2小时)来自Slaver的数据会丢失一些第一个字节,并且接收到的第一个字节已被从Slaver发送的其他值修改(有时会先丢失一些仅字节)
  2. 有时Slaver 的数据收不到(超时但收不到任何数据)。我尝试将超时增加 500 毫秒或 1 秒,但仍然没有任何变化
  3. 我通过Teraterm通讯测试了Slaver,没有出现上述错误。发送和接收的数据都正常。用Master,我也用Teraterm测试过,也没有报错。
  4. 当我尝试在Master和Slaver发送和接收数据时捕获数据时,在Master端和我的PC端都出现问题(没有接收到任何数据或丢失了一些第一个字节)(尝试捕获数据byte Teraterm on PC).

我认为是Master端的问题,也可能是串口设置的问题,但不知道是哪里出了问题。请帮忙。

抱歉我的英语不好!

我以前经常使用 RS485 总线。有时出现的一个问题与您的非常相似。由于RS485是半双工总线,在RS485总线驱动上有切换接收模式和发送模式的机制。这正是我遇到问题的原因。

当主设备发送一些数据时,在总线驱动程序(在主设备端)切换到接收模式之前,从设备准备好回复(并回复)。此行为以数据丢失结束。

我可以建议你用示波器检查一下slave发送的数据是否正确吗?如果是这样,您可能没有太多选择,因为可能的解决方案是:

  • Slave 必须等待一段时间才能向 Master 发送回复。
  • 更改硬件,一些 RS485 驱动程序可以更快地切换模式或使用不同的总线。