使用 pyserial 的 AT+CIMI 命令导致空字符串

AT+CIMI command using pyserial results in empty string

通过 Putty 连接到 Android Phone 并发送 at+cimi 命令显示我的 IMSI 号码。 (XX[..]XX 为数值)

at+cimi
XXXXXXXXXXXXXXX

OK

使用以下 python 代码(在命令 g+cgpaddr 处):

def open_serial(com_port):
    my_serial = serial.Serial(com_port, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=1, rtscts=0)
    return my_serial

s = open_serial('COM35')
s.write(b'at+cgpaddr\r')
temp = s.readlines()
print(temp)

输出为:

[b'at+cgpaddr\r\r\n', b'+CGPADDR: 1,"XXX.XXXX.XXX.XXX"\r\n', b'\r\n', b'OK\r\n']

如果我只把at+cgpaddr改成at+cimi:

s = open_serial('COM35')
s.write(b'at+cimi\r')
temp = s.readlines()
print(temp)

输出为空字符串:

[]

这个问题有解决方案吗?

尝试在s.readlines()

之前添加超时
ser.timeout=1.0

事实上,我不明白为什么它与您这边的cgpaddr 一起工作。没有超时,readlines 永远不会 returns 在我这边。

这是来自 pyserial 文档的评论,

Be careful when using readline(). Do specify a timeout when opening the serial port otherwise it could block forever if no newline character is received. Also note that readlines() only works with a timeout. readlines() depends on having a timeout and interprets that as EOF (end of file). It raises an exception if the port is not opened correctly.

想一想:您确定需要激活软件流量控制吗?如果您使用 XON-XOFF,则有一些特定的字节值用于控制通信。如果你运气不好,这可能会干扰你的交流。

再想想:一些 AT 命令需要超过 1 秒的时间,为了确保您在得到答案之前不会放弃,最好将超时增加到 5-10 秒。

如果有人遇到这个问题,我通过在 "at" 和 "cimi" 之间添加空格来解决它。

之前: s.write(b'at+cimi\r')

之后: s.write(b'at + cimi\r')

我不知道为什么,但它有效。在另一台 phone 上检查过,它适用于两个版本的 PC。