gpt4 book ai didi

python - RS-485串口波特率性能效率

转载 作者:行者123 更新时间:2023-11-28 22:52:25 24 4
gpt4 key购买 nike

我正在用 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比特/s)*(8数据比特/10传输比特)*(1字节/8比特)=960字节/s。

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

我应该能够达到 960 字节/秒的接近 100% 吗?或者有这么大的带宽未被利用是典型的吗?

最佳答案

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

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

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

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

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

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

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

关于python - RS-485串口波特率性能效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20437735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com