1

这是一个用 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()   
4

2 回答 2

0

在 GetAllSMS 中有两件事我注意到:

1)您正在使用self.ser.readline,而不是self.Readline在收到 OK 最终响应之前,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 函数的更多信息,请参阅答案。

于 2013-10-02T21:47:21.097 回答
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

就这样...

于 2013-10-21T02:29:39.947 回答