我有一个简单的 Python 脚本,用于使用串口与微 Controller (STM32F103C8T6) 通信。我正在使用 pySerial 一次写入几条 44 字节的消息。
[...]
serial = serial.Serial(serial.tools.list_ports.comports()[0].device, 115200)
packet0 = bytearray(INSERT_RELEVANT_44-BYTES)
packet1 = bytearray(INSERT_RELEVANT_44-BYTES)
serial.write(packet0)
time.sleep(0.1) # Delay between communications
serial.write(packet1)
[...]
我必须在通信之间插入一个延迟,否则它不会工作。我的理由是,对于 115200 bps 的波特率,发送消息需要 44*8/115200 = ~0,003 秒,因此这应该是发送数据包之间的最小理想间隔。但是,该代码不适用于小于 0,1 的值。
为什么?我错过了什么吗?我想由于操作系统和 USB 会有一些延迟,但它不应该占 ~0.7 秒。我如何优化它以使用尽可能少的延迟?
最佳答案
无需根据 UART 链接计算标称延迟,您可以简单地轮询串行驱动程序以确定 Tx 缓冲区是否为空:
serial.write(packet0)
while serial.outWaiting() > 0 :
pass
serial.write(packet1)
这具有自动计算应用程序代码、库、驱动程序、USB 串行桥链中任何位置的任何延迟、软件开销和缓冲区限制的优势。然而,它不会解决 STM32 串行 I/O 实现的任何问题,您可能应该解决为什么数据无法流式传输的根本问题,这很可能归结为 STM32 设备端的实现不佳。
关于python - 使用 Python 通过串行通信的最小延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943031/