我正在尝试编写一个小的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),因此它应该立即返回,但它不是。有没有人有任何想法,为什么会有延迟?
谢谢, 标记
答案 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。