繁体   English   中英

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

[英]RS-485 Serial Port Baud Rate Performance Efficiency

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

为了进行速度测试,我发送了一条消息,该消息的总长度为10个字节,其中包括校验字节。 然后,我等待13个字节的答复。 我对收到的答复进行解码。响应完成后。 然后,我发送下一条消息。 我会尽快重复此操作100次。 这需要2.895秒。

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

如果我理解正确,9600 N-8-1的串行端口通信具有1个起始位,8个数据位和1个停止位。 这意味着它有2位的开销。 因此,实际的理论传输速率为(9600位/ s)*(8个数据位/ 10个传输位)*(1字节/ 8位)= 960字节/ s。

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

我是否应该能够达到960字节/秒的接近100%的速度。 还是有这么多带宽未被利用是典型的?

当通信方向相反时,您将放弃一些时间。 因此,当一侧接收到最后一个停止位与将第一个响应字节加载到UART发送器并开始驱动第一个起始位之间有一段“死时间”。

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

(当然,所有这些都假设两台计算机使用的时钟都非常精确。这并不总是正确的,因为在8N1的UART可以容忍两端之间大约2%的时钟差。)

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

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

对于大型机器,通常的做法是在每个方向上“突显”多个数据包并连续传输,以最大程度地减少更改方向的次数。 但是,这会增加延迟,并且需要更多的内存,这对于只有几KB RAM的小型微控制器可能是个问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM