使用pyserial的AT命令不能接收短信

时间:2013-09-28 13:45:57

标签: python-2.7 sms modem at-command pyserial

这是用python编写的代码片段,用于通过usb调制解调器接收短信。当我运行程序时,我得到的是状态消息“OK”。但是没有别的。我如何解决问题以打印我收到的消息?

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()   

2 个答案:

答案 0 :(得分:0)

在GetAllSMS中我注意到两件事:

1)您正在使用self.ser.readline而不是self.Readline因此GetAllSMS在收到OK最终响应之前不会尝试打印任何内容(第一个响应行除外),此时{{1永远不会匹配。

这只是问题吗?

2)data.find('+cmgl')>0会像写print self.SendCommand(command,getline=False)那样调用函数吗? (刚检查,因为我自己不写python)


无论如何,你应该重新修改你的AT解析。

self.SendCommand(command,getline=False)

这里的def SendCommand(self,command, getline=True): 参数不是一个很好的抽象。省略从SendCommand函数读取响应。您应该实现对调制解调器返回的响应的正确解析,并处理外部响应。在一般情况下像

getline

对于没有任何显式处理响应的命令,您可以实现执行上述操作的SendCommandAndWaitForFinalResponse函数。 有关IsFinalResult函数的详细信息,请参阅this答案。

答案 1 :(得分: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

那就是......