【发布时间】:2018-10-18 18:04:54
【问题描述】:
关于如何在 python 中读取 stdin 有很多很好的答案,但我找不到任何关于读取单个字符而不是整行的内容。让我解释一下:
我需要读取 arduino 在串行端口上发送的信息,该信息被转发到标准输入。此信息被处理并存储在文本文件中。我在 arduino 上编写了程序,所以我可以更改信息的发送方式。计划是发送带有开头(<)和结尾字符(>)的信息,所以它看起来像这样:<height:2342>
还会写很多不相关的数据,所以我决定使用上面的表格,这样python脚本就可以检测到相关信息并捕获。
我的 python 脚本会单独检查每个字符的起始字符 <,最好是在输入时,然后捕获信息,直到收到 >。我尝试使用inputchar = sys.stdin.read(1) 获取输入。但这里的问题是,它永远从stdin 读取,直到捕获换行符(\n),然后返回输入的第一个字符。
我希望这个函数在发送到stdin 后立即返回输入的字符,而不是等待换行符。我如何做到这一点?
平台:Raspberry Pi Zero W、Raspbian Jessy、Python 2.7
我知道我可以使用 inputline = sys.stdin.readline() 并更改 Arduino 程序以在信息后发送换行符。然后分析整行(可能很长)并提取信息。但我不认为这是一种干净的方式。
串口更新:遗憾的是,我无法直接从 python 访问串口,因为有第二个 python 脚本必须写入串口。由于只有一个端口可以访问,解决方法是将串口重定向到stdin和stdout。看我的问题Access one Serial Port with two Python Scripts
【问题讨论】:
-
您可能会更幸运地直接从 Python 打开串行端口(例如,这样您就可以控制缓冲),而不是将端口重定向到标准输入。
-
如果你使用的是pyserial,我很确定可以read single bytes from the serial port directly。
-
这个库只处理那个 --> pypi.org/project/getch
-
.read()在管道上(我假设您的重定向程序使用管道)将在数据可用时立即返回。它不会等待换行符。我最好的猜测是重定向串行端口的程序正在缓冲其输出。也许它需要在它的输出管道上调用.write()之后调用.flush()。