通过 RS485 写入消息的两个字符之间的间隙

通过 RS485 写入消息的两个字符之间的间隙

我正在使用 ATMEL 嵌入式控制器 (at91sam9x25e) 及其串行端口通过 RS485 Modbus RTU 发送/接收。正常通信工作正常,但有时(在写入时)某些包会在消息中的两个字符之间以大约 3.5 毫秒的延迟被分割,因此被检测为新消息。

设置:

  • 单声道3.2.8
  • Modbus RTU 19.2 kBaud
  • RS485
  • 自动RTS

我立即发送整个包裹:

try  
{
  Thread.Sleep(_timePreSend);
  _serialPort.Write(buffer, offset, count);
} catch(Exception err)
{
   log.Error(err.Message);
} finally
{
   Thread.Sleep(2);
}

我之前使用了 2 毫秒,当时我手动启用/禁用 RTS,以便它传输缓冲区(UART 或 FIFO)中的最后一位。

从示波器捕获:

120318000100020032000403200000001C000500000000000000003D <- 间隙 -> B6

Modbus 消息

stty 的输出:

stty -F /dev/ttyS4 -a
speed 19200 baud; rows 0; columns 0; line = 0;    
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl    -ixon  -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
 echoctl echoke

造成这种差距的原因可能是什么?我可以做什么来避免它?

答案1

很难确切地说出是什么原因造成的。不幸的是,Linux 串行端口不提供时序保证,并且普通的 UART 协议不应该有这样严格的时序要求。如果你的协议需要这种时序保证,你将不得不深入研究你的内核驱动程序,也许编写你自己的驱动程序来保证所有字节的原子传递没有间隙,可能使用中断来确保 UART 缓冲区是总是及时补充。如果没有内核的帮助,您无法从用户空间做出这种保证。

也就是说,您可以尝试找出导致分裂的原因,也许可以解决它,并凭经验确定它在实践中足够可靠,可以满足您的目的。延迟总是在最后一个字节之前吗?如果是这样,听起来堆栈中的某些东西由于某种原因正在缓冲一个字符,也许是为了通过一次向硬件传递多个字节来优化吞吐量,并且在短暂的超时后仅传递单个字节。您应该首先确保您的用户空间应用程序运行正常:通过运行它来检查系统调用,并确保数据包在单个系统调用strace中写入内核。write如果是,则需要阅读 UART 驱动程序的内核源代码并查看是否涉及任何奇怪的缓冲。

另一种可能性是内核驱动程序只是处理内核线程中的数据(或直接在进程上下文中),而您看到的间隙是另一个正在调度的进程。如果是这样,解决这个问题的唯一方法是修改内核驱动程序或编写自己的驱动程序,以便它以严格实时的方式处理传输,而不允许其他进程优先(例如,在中断上下文中执行所有操作)。

答案2

我终于发现了这种行为的问题所在。我在通信循环中使用了一些繁忙等待,这导致 CPU 负载过重。然后我读到,使用 SerialPort 命令,例如BytesToRead 和 Read根本不理想: 如果必须使用.NET System.IO.Port.Serialport

因此我尝试使用 ByteStream 的异步函数ReadAsync 和 WriteAsync正如我的新问题中所述使用串口和 ReadAsync 超时的正确方法而且我的 CPU 使用率少了很多,而且不再有任何间隙。

相关内容