使用pySerial读取AT命令响应
我有以下这段示例代码:
import serial
ser = serial.Serial('/dev/ttyUSB1', 115200, timeout=5)
ser.write("AT\r")
response = ser.readline()
ser.write(chr(26))
ser.close()
print response
我的目标是发送一个AT命令,然后得到OK的回复。
根据PySerial readline()的说明,它会读取接收到的数据,直到找到换行符为止。但我遇到的问题是,我的打印输出什么都没有。
我确定在发送AT命令后,3G调制解调器给我的回复是OK。有没有人知道为什么我无法获取这个回复呢?
附注:我使用像CuteCom这样的程序确认了设备是正常工作的,并且能够响应AT命令。
3 个回答
1
这是调制解调器返回给你应用程序的多行输出。你需要多次调用readline来收集所有的输出(“OK”并不是第一个响应行,也不是第二个,如果调用readline的速度太快,就会漏掉消息的最后部分)。可以考虑使用下面的代码(answer变量将作为完整的调制解调器回复的占位符):
`
import serial, time
modem = serial.Serial(port='/dev/ttyHS0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonoff=False, rtscts=False, dsrdtr=False)
cmd = "AT\r"
modem.write(cmd.encode())
answer = ""
read_timeout = 0.1
quantity = modem.in_waiting
while True:
if quantity > 0:
answer += modem.read(quantity)
else:
# read_timeout is depends on port speed
# with following formula it works:
# 0.1 sec + 1.0 sec / baud rate (bits per second) * 10.0 bits (per character) * 10.0 times
# example for 115200 baud rate:
# 0.1 + 1.0 / 115200 * 10.0 * 10.0 ~ 0.1 sec
time.sleep(read_timeout)
quantity = modem.in_waiting
if quantity == 0:
break
`
7
收到一个代码问题:
import serial
ser = serial.Serial(port='COM1', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonoff=False, rtscts=False, dsrdtr=False)
cmd="AT\r"
ser.write(cmd.encode())
msg=ser.read(64)
print(msg)
输出结果正常 :)
5
为了补充问题的评论,请试试这个,看看有没有什么变化:
import serial
ser = serial.Serial('/dev/ttyUSB1', 115200, timeout=5)
ser.write("AT\r")
response = ser.read(2)
print response
ser.close()
如果一切正常,那么在你的write()里加上"\r",并把ser.read(2)
替换成ser.readline()
,然后把超时时间的值再设置为零。