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

2024-05-17 05:45:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Ubuntu上写了一些类似短信门的东西。该设备是华为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\u waiting=0即使我把n设置得更大,也没有什么变化)。你知道吗

但我仍然可以使用minicom来处理这个端口。你知道吗

我的问题是:为什么pyserial不能工作而minicom可以?他们之间有什么区别吗?你知道吗


Tags: indevimport密码调制解调器timeportubuntu
1条回答
网友
1楼 · 发布于 2024-05-17 05:45:05

我猜它发生的是,您使用的延迟和您在打开端口时设置的超时与调制解调器处理命令所需的时间合谋。你知道吗

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

... 
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来读取期望的字节。你知道吗

相关问题 更多 >