python - 使用 Python 通过串行通信的最小延迟

标签 python serial-port embedded microcontroller pyserial

我有一个简单的 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/

相关文章:

python - GCM python 服务器端实现 : Error=MissingRegistration

python - 在 Python 中创建 n 个字符串

c++ - ctypes C++ 函数返回未知大小的数组

linux - 使/dev/pts/XX 在客户端重新连接时持久化

Python Twisted 从 TCP 接收命令写入串行设备返回响应

c++ - c++ 类中的 static const 和 const 变量在存储方面有区别吗

python - 在 help() 调用中填充数据

linux - 通过 Raspberry PI 3 中的串行 TX 和 RX 端口进行数据传输

c - 字符串初始值设定项会不会有点浪费内存?

c - 如何将 uint8_t 从 uart_read_bytes 转换为 char 或可以添加到 cJSON 对象的内容?