0

これは、シリアル ポート経由でラップトップに接続された 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

「新しいメッセージを受け取りました!」と表示されるのはなぜですか? 何度も?

特に新しいメッセージを受け取っていないとき!

助けてください。

4

1 に答える 1

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()た。毎回式を再コンパイルする必要はありません。

のすべての文字をループしてから、 1 つの一致myRegexableStringするリストをループしてから、True っぽいかどうかをテストします (空でない場合)。これは、入力内のすべての文字に対して、空の一致を追加することを意味します (式は、単一の文字列内のどの文字にも一致しません)。myRegexableString

于 2013-03-29T11:21:10.540 に答える