首页 > 解决方案 > Python 串行读取

问题描述

从 USB 调制解调器读取串行数据时遇到问题,找不到有相同问题的人。

使用下面的代码,我可以成功写入串行端口,但是当我阅读时,终端只是坐在那里接受输入,但什么也不做。我可以输入我喜欢的任何内容并输入回车,但他们什么都不做。就像我创建了一个无限输入循环,但我不明白这是怎么发生的。最终我不得不将 Crtl -c 退出程序。

我尝试过其他方法,例如读取指定数量的字节或读取变量并循环遍历它,但关键的是,对 inWaiting() 或 in_waiting 的调用返回 0,因此尽管写入命令成功,但显然没有什么可读取的调制解调器接受。

有人对这个无限循环的来源以及为什么我没有看到调制解调器的响应有任何想法吗?

import time
import serial

ser = serial.Serial("/dev/ttyUSB2", 115200)

time.sleep(1)
ser.write(b'\r\n' + b'at' + b'\r\n')

time.sleep(1)
print(ser.readline())

已解决: 我认为超时有所不同(感谢 RaulG)。我开始看到返回 b'\r\n' 或在另一种情况下返回 b'at\r\n' 并发现我的响应被分成多行并且似乎包含回声。

使用以下代码,我能够看到完整的响应。

代码:

import time
import serial

ser = serial.Serial(port="/dev/ttyUSB2", baudrate=115200, timeout=5)

time.sleep(0.5)
ser.write(b'at\r\n')

time.sleep(0.5)
print(ser.readline())
print(ser.readline())
print(ser.readline())

输出:

b'at\r\n'
b'\r\n'
b'OK\r\n'

标签: pythonpyserialuartmodem

解决方案


首先ser.readline()命令是无限循环。它一直等到\n输入缓冲区中有一个字符。您可以通过像这样在 Object 的初始化中指定超时来避免循环serial.Serial(超时以秒为单位)

ser = serial.Serial('/dev/ttyUSB2',115200,timeout=2)

现在到您从调制解调器接收不到任何内容的部分。这可能有不同的原因,您提供的信息无法正确回答。首先,您的 USB 转串口适配器可能有问题。那么您可能错误地连接了某些东西,或者您的调制解调器可能有电气问题或软件问题。


推荐阅读