python - 使用Python实现串口延迟

标签 python serial-port

我正在尝试编写一个小的Python脚本来从串行端口读取数据并将其简单地显示到屏幕上。它似乎有效,但当我看到屏幕上显示的数据时似乎有延迟。

import serial
import sys

SerialGF = serial.Serial(port='/dev/ttyAMA0', baudrate=115200, parity='N', stopbits=1, xonxoff=0, rtscts=0, timeout=0)

def main():
    # openSerial_GF()
    print SerialGF.isOpen()
    SerialGF.flush()
    SerialGF.flushInput()
    SerialGF.flushOutput()
    try:
        while True:
            readSerial_GF()
    except KeyboardInterrupt:
        pass
    SerialGF.close()
    print SerialGF.isOpen()

# def openSerial_GF():
#     global SerialGF = serial.Serial(port='/dev/ttyAMA0', baudrate=115200, parity='N', stopbits=1, xonxoff=0, rtscts=0, timeout=0)

def readSerial_GF():
    s = SerialGF.read(SerialGF.inWaiting())
    sys.stdout.write(s)

if __name__ == "__main__":
    main()

串行端口上的数据是一串破折号字符“-”,直到某个事件发生。当数据显示到屏幕上时,我看到了延迟。奇怪的是一次显示 1024 个字符。我已将超时设置为零 (0),因此它应该立即返回,但事实并非如此。有谁知道为什么会出现延迟吗?

谢谢, 标记

最佳答案

这几乎肯定是缓冲问题。简而言之,如果您希望立即显示输出,请在每个 sys.stdout.write(…) 之后执行 sys.stdout.flush()

在大多数平台上,默认情况下,* stdio 流最终会进行行缓冲。这意味着写入的任何内容都会被缓冲,直到您写入换行符或填充 stdio 内的缓冲区为止,这通常是一些不错的轮长度,例如 1024 字节。

Python 2.x** 主要将缓冲留给 C stdio 库,因此有关完整详细信息,您需要查找平台的 fopen以及可能的 fwrite 实现。 open 的文档解释 Python 为您提供的用于控制缓冲的选项,以及 command line and environment文档解释了如何影响 stdio 流的打开方式。但实际上,与其强制每个人都使用 -u 运行您的程序,不如在您想要确保输出出现时显式地 flush

* 如果您以二进制模式打开文件(这是 -uPYTHONUNBUFFERED 控制的),您将获得无缓冲的输出。如果您以文本模式打开文件,并且 istty() 为 true 或不可用,则通常会进入行缓冲模式。否则,您通常会获得“完全缓冲”模式,这意味着有一个固定大小的缓冲区,并且当该缓冲区被填满时会发生写入。

** 请注意,这都是 Python 2.x 特定的; 3.x 有自己的文件对象,直接在 native 文件描述符/句柄之上工作,而不是使用 C stdio。

关于python - 使用Python实现串口延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26984449/

相关文章:

python - 获取数据框中n个最大值的行和列名称

ubuntu - 如何在设备连接时自动设置波特率?

php - Arduino fopen 错误

python - 如何将两个列表中的每个元素与其他列表中的每个元素进行比较,然后将结果合并到一个字符串中

python - 当 Python 脚本运行并以 sys.exit(0) 结束时出现错误 : exited with status 2

python - 作为 REST api 的一部分返回多行字符串

linux - 为什么我的计算机在使用 USB 串行端口运行程序时一直暂停?

python - 我可以在 Linux 上使用 RS-232 并行端口吗?

android - eclipse无法解析android native 代码

python - Pandas DataFrame 循环遍历所有列