2013-03-29 13 views
0

以下是我用來輪詢通過串行端口連接到筆記本電腦的GSM調制解調器接收到的新消息的函數。我已經創建了一個串行對象「手機」,用於讀取和寫入數據。使用正則表達式解析字符串通過python連接到筆記本電腦的GSM調制解調器接收到的正則表達式

'phone'將數據讀入列表x。

當我得到一個新的消息的格式爲我得到的響應:

+CMTI: "SM",0 

這裏0是索引,指示在該消息被存儲在SIM上的索引位置。 以下代碼用於輪詢列表x,其中包含我正在讀取的數據,並從串行端口寫入 。我正在使用正則表達式來解析已被轉換爲字符串myRegexableString的x,以查看我是否已收到通知。

def poll(x): 
    myRegexableString = "".join(x) 
    print "Printing myRegexableString" 
    pprint(myRegexableString) 
    regex = re.compile(r'\+CMTI: "SM",(\d+)') 
    lst = [] 
    for l in myRegexableString: 
     for m in [regex.search(l)]: 
      if myRegexableString: 
       lst.append(m) 
       print "You have received a new message!" 

我想使用上面的代碼來檢查網絡註冊的AT命令。在我執行其他命令的時候,我還需要輪詢新消息,或者針對這個問題的任何命令,但爲了解決這個問題,我只是以網絡註冊爲例。這裏是它通常如何運行而不使用輪詢功能。

AT+CREG? #command 

+CREG: 0,1 #response 

OK #status 

現在這裏是代碼。

def register(): 
    print "Checking for network registration" 
    phone.write(b'AT+CREG?\r') 
    sleep() 
    x=phone.read(50) 
    sleep() 
    print x 

現在假設我包括在這裏投票代碼將變爲

def register(): 
     print "Checking for network registeration" 
     phone.write(b'AT+CREG?\r') 
     sleep() 
     x=phone.read(50) 
     poll(x) 
     sleep() 
     print x 

我從改變的代碼得到的輸出是

Checking for network registeration 
Printing myRegexableString 
'AT+CREG?\r\r\n+CREG: 0,1\r\n\r\nOK\r\n' 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
You have received a new message! 
AT+CREG? 

+CREG: 0,1 

OK 

爲什麼打印「您已收到一條新消息!「很多次?

特別是當我還沒有收到新消息!

請幫忙。

回答

1

所有你需要做的就是使用regex.findall(myRegexableString)。這將返回匹配的羣組列表,所以數字。

regex = re.compile(r'\+CMTI: "SM",(\d+)') 

def poll(x): 
    myRegexableString = "".join(x) 
    print "Printing myRegexableString" 
    pprint(myRegexableString) 
    lst = regex.findall(myRegexableString) 

我搬到了re.compile()召喚出來的功能,沒有必要每次都重新編譯的表達。

您遍歷每個性格myRegexableString,那麼你遍歷一個列表與一個比賽,那麼你就測試是否myRegexableString爲True-ISH(這是,如果它不爲空)。這意味着對於輸入中的每個字符,您都會添加一個空匹配項(該表達式絕不會匹配單個字符串中的任何內容)。

+0

謝謝@Martijn Pieters – Anon