使用Python从串口延迟

时间:2014-11-18 00:20:07

标签: 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),因此它应该立即返回,但它不是。有没有人有任何想法,为什么会有延迟?

谢谢, 标记

1 个答案:

答案 0 :(得分:2)

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

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

Python 2.x **主要是缓冲到C stdio库,所以有关完整的详细信息,您希望查找您的平台fopen以及可能{{1}实现。 open的文档解释了Python为控制缓冲提供的选项,command line and environment文档解释了如何影响stdio流的打开方式。但实际上,不是强迫每个人都使用fwrite来运行您的程序,只要明确-u,就可以确保输出显示出来。

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

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