RS-485 串行端口波特率性能效率

Posted

技术标签:

【中文标题】RS-485 串行端口波特率性能效率【英文标题】:RS-485 Serial Port Baud Rate Performance Efficiency 【发布时间】:2013-12-07 04:49:39 【问题描述】:

我正在用 Python 开发一个应用程序,它通过 RS-485 两线半双工与设备通信。 我有足够的应用程序工作,可以执行一些性能测试。 我正在使用带有 USB 到 485 转换器的笔记本电脑。通讯设置为 9600,N,8,1。

对于我的速度测试,我发送了一条包含校验字节在内的总长度为 10 个字节的消息。然后我等待 13 个字节的回复。我在回复进来时对其进行解码。当回复完成时。然后我发送下一条消息。我尽可能快地重复这 100 次。这需要 2.895 秒。

据此计算,我正在发送/接收 23 字节 * 100 次迭代 / 2.895 秒 = 794 字节/秒。

如果我理解正确的话,9600 N-8-1 的串口通信有 1 个起始位、8 个数据位和 1 个停止位。这意味着它有 2 位开销。所以实际的理论传输速率为(9600 bits/s)*(8 data bits/10 transmission bits)*(1 Byte / 8 bits)=960 bytes/s。

我的程序在可能的 960 字节/秒 = 82.7% 中以 794 字节/秒的组合速率发送/接收。

我应该能够达到接近 100% 的 960 字节/秒吗?还是通常没有使用这么多带宽?

【问题讨论】:

【参考方案1】:

当交流的方向颠倒时,你会放弃一些时间。因此,在一侧接收到最后一个停止位与将第一个响应字节加载到 UART 发送器并开始驱动第一个起始位之间存在一些“死区时间”。

我计算出这个死区时间是每次双向运行 5 毫秒(几乎 5 位时间,即半字节计算帧开销),或 2.895 总秒数中的 0.495 秒。这还不错,但可能会好一点。但是,如果不编写自己的 UART 驱动程序,我不确定您是否会获得很大的改进。

(当然,这一切都假设两台计算机使用的时钟都是精确的。这并不总是正确的,因为 8N1 的 UART 可以容忍两端之间高达 2% 的时钟差异。)

在嵌入式领域,如果我们想以绝对最小的带宽损失做到这一点,我们会将驱动程序编写为标准的双向全双工驱动程序,并通过某种方式知道何时切换方向(例如在数据包边界上) )。然后,该驱动程序只会将字节推送到正确的方向,而不会使用其他队列。

在用户(应用程序)级别,我们必须确保这些队列永远不会被饿死。这意味着,在您的示例中,13 字节的响应数据包需要在完全接收到 10 字节的传入数据包之前准备好。另一端也需要这样做。

对于较大的机器,通常的做法是在每个方向“合并”几个数据包并连续传输它们,以最大限度地减少您必须改变方向的次数。不过,这会增加延迟,并且需要更多内存,这对于只有几 kB RAM 的小型微控制器来说可能是个问题。

恕我直言,考虑到您的小数据包、频繁的方向反转以及缺乏驱动程序级别的优化,带宽看起来是正确的。

【讨论】:

如果我考虑到 5ms 的反向时间(从 2.895 秒中减去 0.495 秒),那么传输速率是 2,300 字节/2.4 秒 = 958 字节/秒。这非常接近 960 b/s 的理论速率。这正是我正在寻找的信息。

以上是关于RS-485 串行端口波特率性能效率的主要内容,如果未能解决你的问题,请参考以下文章

RS232 RS485 以太网之间的区别是啥?它们的波特率可达到多少?

波特率19200 RS485信号能传多远

485接口原理

RS485通讯中,为啥波特率越高,能够传输的距离越短?

TTL/RS485/RS232串口通信中波特率|校验位|数据位|停止位的区别和含义

RS485通讯中,为啥波特率越高,能够传输的距离越短?