使用Python的串行端口延迟
我试图编写一个小的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()
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**主要将缓冲区留给Cstdio
库,因此,要了解完整的详细信息,您需要查看平台的,可能还有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!!工作得很有魅力。