Pyserial 无法读取数据但 minicom 工作正常

Pyserial cannot read data but minicom works fine

我正在 Ubuntu 上写类似 SMS 门的东西。该设备是华为E173调制解调器。

我使用 pyserial write/read 进出设备。这是我的代码:

import serial
import time

port = '/dev/ttyUSB0'
ser = serial.Serial(port,
        stopbits=serial.STOPBITS_ONE,
        parity=serial.PARITY_NONE,
        bytesize=serial.EIGHTBITS
        )
ser.write(b'AT\r\n')
time.sleep(0.1)
print(ser.read(ser.in_waiting))

此代码有效。但有时当我重新连接设备时,我发现它无法读取任何内容。 (ser.in_waiting=0 即使我将 n 设置得更大也没有任何变化)。

但我仍然可以使用 minicom 来使用该端口。

我的问题:为什么 pyserial 不能工作而 minicom 可以?它们有什么区别吗?

我猜这是因为您使用的延迟以及您在打开端口时设置的超时时间与调制解调器处理命令所需的时间有关。

为避免这种情况,请尝试使用循环在一定时间内重复读取数据:

... 
ser.write(b'AT\r\n')
timeout=time.time()+3.0 
while ser.inWaiting() or time.time()-timeout<0.0: 
    if ser.inWaiting()>0: 
        data+=ser.read(ser.inWaiting()) 
         timeout=time.time()+3.0 print(data)

使用 minicom 或任何其他终端,您始终在端口上侦听,因此无论调制解调器处理命令需要多长时间,您总能得到答案。在您的代码中,您发送命令,等待 100 毫秒,然后在超时设置定义的时间段内侦听端口。由于您没有定义超时,因此默认情况下会永远等待,但使用缓冲区中的字节作为参数会覆盖该行为。如果您碰巧在数据到达缓冲区之前检查了缓冲区(因为命令花费的时间比您给它的 100 毫秒更长),则超时变为零。

考虑到上一段,假设您知道字节数,定义有限超时并使用 ser.read(n)n 预期字节读取可能更好。

就我而言(在 BeagleBone Black 上),上述答案帮助我获得了 一些 字节,但不是全部。我意识到,由于 某些 原因,minicom 正在读取端口并(可能)刷新它。所以,PySerial 没有什么可读的。

我只是关闭了 minicom 终端,现在一切都很好:)