2013-09-28 99 views
1

這是一個用python編寫的代碼片段,用於通過USB調制解調器接收短信。當我運行程序時,我所得到的只是一條狀態消息「OK」,但沒有別的。我該如何解決這個問題來打印我收到的消息?帶pyserial的AT命令與接收短信不兼容

import serial 

class HuaweiModem(object): 

    def __init__(self): 
     self.open() 

    def open(self): 
     self.ser = serial.Serial('/dev/ttyUSB_utps_modem', 115200, timeout=1) 
     self.SendCommand('ATZ\r') 
     self.SendCommand('AT+CMGF=1\r') 

    def SendCommand(self,command, getline=True): 
     self.ser.write(command) 
     data = '' 
     if getline: 
      data=self.ReadLine() 
     return data 



    def ReadLine(self): 
     data = self.ser.readline() 
     print data 
     return data 

    def GetAllSMS(self): 
     self.ser.flushInput() 
     self.ser.flushOutput() 



     command = 'AT+CMGL="all"\r' 
     print self.SendCommand(command,getline=False) 
     self.ser.timeout = 2 
     data = self.ser.readline() 
     print data 

     while data !='': 
      data = self.ser.readline() 
     if data.find('+cmgl')>0: 
      print data 


h = HuaweiModem() 
h.GetAllSMS() 

回答

0

在GetAllSMS有兩件事我注意到:

1)您使用的self.ser.readline,而不是self.Readline所以GetAllSMS不會嘗試打印任何東西(除了第一個響應行)之前確定最後的反應是收到,並在這一點上data.find('+cmgl')>0永遠不會匹配。

這只是問題嗎?

2)請問print self.SendCommand(command,getline=False)調用函數就像它被寫爲self.SendCommand(command,getline=False)? (只是檢查,因爲我不Python寫我自己)


在任何情況下,你應該返工您的AT解析一下。

def SendCommand(self,command, getline=True): 

這裏的getline參數不是很好的抽象。讀出SendCommand函數的響應。您應該對調制解調器給出的響應進行適當的解析並處理外部的響應。在一般情況下是這樣

self.SendCommand('AT+CSOMECMD\r') 
data = self.ser.readline() 
while ! IsFinalResult(data): 
    data = self.ser.readline() 
    print data  # or do whatever you want with each line 

有關命令沒有反應的任何明確的處理,可以實現一個SendCommandAndWaitForFinalResponse函數,它上面。 有關IsFinalResult函數的更多信息,請參閱this答案。

0

您遇到問題的位置在您的GetAllSMS功能中。現在與你代替我GeTALLSMS功能看什麼都發生

 def GetAllSMS(self): 
     self.ser.flushInput() 
     self.ser.flushOutput() 



     command = 'AT+CMGL="all"\r' #to get all messages both read and unread 
     print self.SendCommand(command,getline=False) 
     while 1: 
      self.ser.timeout = 2 
      data = self.ser.readline() 
      print data 

或本

def GetAllSMS(self): 
     self.ser.flushInput() 
     self.ser.flushOutput() 



     command = 'AT+CMGL="all"\r' #to get all messages both read and unread 
     print self.SendCommand(command,getline=False) 
     self.ser.timeout = 2 
     data = self.ser.readall() #you can also u read(10000000) 
     print data 

這就是...