pySerial调制解调器结果代码

时间:2014-12-17 18:01:06

标签: python pyserial modem

我在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

我的问题是:

  1. ser.read(4)或ser.read(8)中的数字是多少。这是暂停吗?
  2. 我似乎没有得到#34; NO CARRIER"直到代码的ATH部分之后。我希望在ATDT部分之后直接获得它。
  3. 为什么我最终只得到四个结果?
  4. 为什么打印结果中出现异常间距?
  5. 非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

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,我相信你得到了#34;没有承运人&#34;由于您发送的ATH命令。<​​/ p>

参见&#34;拨打电话&#34;本MS支持说明(link)

中的部分

根据注释发送挂断命令将导致NO CARRIER响应。 当您发送ATH时,调制解调器可能仍在尝试建立连接。