Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python的串行端口延迟_Python_Serial Port - Fatal编程技术网

使用Python的串行端口延迟

使用Python的串行端口延迟,python,serial-port,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()

我试图编写一个小的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字节

Python2.x**主要将缓冲区留给C
stdio
库,因此,要了解完整的详细信息,您需要查看平台的,可能还有
fwrite
实现。用于解释Python为您提供的用于控制缓冲的选项的文档,以及如何影响stdio流的打开方式的文档。但实际上,与其强迫每个人都用
-u
运行程序,不如在希望确保输出显示时显式地
刷新

*如果以二进制模式打开文件,即
-u
PYTHONUNBUFFERED
控件,则会得到无缓冲输出。如果在文本模式下打开文件,并且
isatty()
为真或不可用,则通常使用行缓冲模式。否则,您通常会得到“完全缓冲”模式,这意味着有一个固定大小的缓冲区,当该缓冲区被填满时会发生写操作


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

可能与默认情况下在
sys.stdout
中打开的缓冲有关。您能否在无缓冲模式下运行python-u以查看问题是否仍然存在这是另一个深入研究缓冲方面的问题。或者在
写入
之后执行
sys.stdout.flush()
。文档中解释了缓冲(而不是关于如何打开
sys.stdout
的具体细节,这显然是在您获得控制权之前发生的)。在许多系统上,“系统默认值”是缓冲,直到打印换行符或达到某个最大行长(如1024)为止,这似乎正是您所看到的。谢谢,abarnert!!工作得很有魅力。