【问题标题】:Pyserial cannot read data but minicom works finePyserial 无法读取数据,但 minicom 工作正常
【发布时间】:2020-12-24 13:08:19
【问题描述】:

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

我使用 pyserial 向设备写入/读取数据。这是我的代码:

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 可以?它们之间有什么区别吗?

【问题讨论】:

  • 将RTS和DTR设置为True怎么样?
  • @kunif 试过了,不行
  • 即插即用不是很好处理吗?是不是不仅要使用PySerial还要支持即插即用的包?
  • @kunif 我不明白它与即插即用有什么关系。你能解释一下吗?
  • 从关键字 reconnect 推断。请做一些调查。

标签: python serial-port pyserial


【解决方案1】:

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

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

... 
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 读取预期字节数。

【讨论】:

  • 有效!我只是发现,如果我在写完之后立即阅读,我会有所收获。但是如果我等待很短的时间,输出缓冲区中就没有任何东西了。我猜还有其他一些程序已经读取了输出。有了你的代码,我可以在别人之前得到输出。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多