我在Debian盒子上使用pySerial和python 2.7。我正在编写python代码来控制USRobotics USB USR5637调制解调器。我想检查调制解调器的响应是否有问题/错误,但是我的代码得到了异常结果。我已经编写了一些用于测试的基本代码。我的电话线确实断开了,因此我可以看到结果代码“ NO CARRIER”。如果任何人都可以使用pySerial和调制解调器,我将不胜感激。
我创建了以下代码进行测试:
import serial
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=5)
ser.write("ATE0\r") # Attention - Echo disable
response = ser.read(4)
print "ATE0 %s" % response
ser.write("ATX0\r") # Attention - Echo disable
response2 = ser.read(8)
print "ATX0 %s" % response2
ser.write("ATDT411\r") # Attention - Dail - Tone - 411
response3 = ser.read(32)
print "ATDT %s" % response3
ser.write("ATH\r") # Attention - Hang up line
response4 = ser.read(16)
print "ATH %s" % response4
ser.write("ATZ\r") # Reset
response5 = ser.read(16)
print "ATZ %s" % response5
print "================================================="
print "%s %s %s %s %s" % (response, response2, response3, response4, response5)
ser.close()
我得到的答复是:
ATE0
OK
ATX0
OK
ATDT
ATH
NO CARRIER
ATZ
OK
=================================================
OK
OK
NO CARRIER
OK
我的问题是:
ser.read(4)或ser.read(8)中的数字是多少。超时了吗?
在代码的ATH部分之后,我似乎没有得到“ NO CARRIER”。我希望在ATDT部分之后直接得到它。
为什么最后只有四个结果?
为什么打印结果中出现异常间距?
任何帮助将不胜感激。谢谢。
最佳答案
ser.read(4)
表示从串行端口读取4个字节。您已使用构造函数调用配置了5秒超时:
serial.Serial('/dev/ttyACM0', 9600, timeout=5)
因此
ser.read(4)
可能返回少于4个字符。使用timeout=None
进行阻止读取,在这种情况下,只有收到正确的4个字符后,它才会返回。您将获得奇怪的间隔,因为调制解调器发送的每个响应都以CR字符结尾(并且可能是CR / LF对。)
您可能会发现使用此
getline()
函数与调制解调器进行交互更容易:def getline(ser):
buf = ""
while True:
ch = ser.read(1)
if ch == '\r': # or perhaps '\n'
break
buf += ch
return buf
至于#2,我相信由于您发送的ATH命令,您将获得“ NO CARRIER”。
请参阅此MS支持说明(link)中的“拨打电话”部分
根据说明,发送挂断命令将导致NO CARRIER响应。
发送ATH时,调制解调器可能仍在尝试建立连接。
关于python - pySerial调制解调器结果代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27531930/