2013-09-28 71 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 

这就是...