2013-09-28 1 views
1

Ceci est un extrait de code écrit en python pour recevoir des sms via un modem usb. Quand je lance le programme, tout ce que je reçois est un message d'état "OK"., Mais rien d'autre. Comment puis-je résoudre le problème pour imprimer les messages que je reçois?Commandes AT avec pyserial ne fonctionnant pas avec la réception de sms

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

Répondre

0

En GetAllSMS il y a deux choses je remarque:

1) Vous utilisez self.ser.readline et non self.Readline donc GetAllSMS n'essayer d'imprimer quoi que ce soit (à l'exception de la première ligne de réponse) avant que la réponse finale OK est reçu, et à ce moment data.find('+cmgl')>0 ne correspondra jamais.

Est-ce juste le problème?

2) Est-ce que print self.SendCommand(command,getline=False) appellera la fonction comme elle a été écrite self.SendCommand(command,getline=False)? (Il suffit de vérifier que je ne pas écrire moi-même python)


Dans tous les cas, vous devez retravailler votre AT analyse un peu.

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

Le paramètre getline ici est pas une très bonne abstraction. Ne lisez pas les réponses de la fonction SendCommand. Vous devriez plutôt implémenter l'analyse correcte des réponses données par le modem et gérer cela à l'extérieur. Dans le cas général quelque chose comme

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 

Pour les commandes sans aucun traitement explicite des réponses, vous pouvez mettre en œuvre une fonction de SendCommandAndWaitForFinalResponse qui fait ce qui précède. Voir this pour plus d'informations sur une fonction IsFinalResult.

0

où vous rencontrez des problèmes est ici dans votre fonction GetAllSMS. Maintenant, remplacer ma fonction GeTALLSMS avec le vôtre et voir ce qui se passe

 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 

ou cette

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 

thats all ...

Questions connexes