2014-12-17 4 views
1

데비안 박스에서 pySerial과 python 2.7을 사용하고 있습니다. USRobotics USB USR5637 모뎀을 제어하는 ​​파이썬 코드를 작성하고 있습니다. 문제/오류에 대한 모뎀의 응답을 확인하려고하지만 코드에서 비정상적인 결과가 나타납니다. 테스트를위한 기본 코드를 작성했습니다. 전화선이 끊어져서 "NO CARRIER"라는 결과 코드를 볼 수 있습니다. 누구든지 pySerial 및 모뎀에 액세스 할 수 있다면 제공 할 수있는 모든 도움에 감사드립니다.pySerial modem 결과 코드

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. 나는 코드의 ATH 섹션 이후까지 "NO CARRIER"를 얻는 것 같지 않습니다. 나는 ATDT 섹션 바로 뒤에 그것을 기대할 것이다.
  3. 왜 결과가 4 개인 경우에만 끝나나요?
  4. 인쇄 된 결과의 변칙적 인 간격은 왜 까닭입니까?

모든 도움을 주시면 감사하겠습니다. 감사.

답변

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에 관해서는, 나는 당신 때문에 당신이 보낸 ATH 명령에 "NO CARRIER"를 받고되지 않습니다 생각합니다.

는 NO CARRIER 응답 발생합니다 끊기 명령을 보내는 메모에 따르면이 MS 지원 참고 (link)

에서 "전화 걸기"절을 참조하십시오. ATH를 보낼 때 모뎀이 연결을 시도 중입니다.

+0

질문 1과 4를 해결합니다. 감사합니다. 모뎀이 자세한 텍스트 대신 단일 값 코드를 반환하도록 지시 할 수 있으며 위의 코드는 멋지게 수행됩니다. – user72055

+0

답변이 업데이트되었습니다. 당신이 그것의 무엇이든을 찾아내는 경우에 유용한 upvote는 평가 될 것입니다. – ErikR

+0

이제 이해합니다. 감사. – user72055