gpt4 book ai didi

python - 使用Python实现串口延迟

转载 作者:行者123 更新时间:2023-12-01 04:57:46 25 4
gpt4 key购买 nike

我正在尝试编写一个小的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com