GSM モジュールに送信された AT コマンドの最後を確認するにはどうすればよいですか?
応答全体がいつ受信されるかを見つけるため、すべてのケースで AT コマンドの終わりを表す文字または文字列が必要です。
「\r\n」のシーケンスがあると思いますが、このシーケンスは AT コマンド応答の先頭にある可能性がありますか?
GSM モジュールに送信された AT コマンドの最後を確認するにはどうすればよいですか?
応答全体がいつ受信されるかを見つけるため、すべてのケースで AT コマンドの終わりを表す文字または文字列が必要です。
「\r\n」のシーケンスがあると思いますが、このシーケンスは AT コマンド応答の先頭にある可能性がありますか?
あなたが思うようにそれは\r\n
です。
これは、行の終わりを定義します。
そして、完全な行を処理することだけが理にかなっています。
一部のコマンドは、、OK\r\n
一部のデータのみで応答します。
したがって、最初に完全な行を検出できるパーサーを作成して、応答を処理する関数で行を処理できるようにする必要があります。
net login
場合によっては、変更イベントやsimステータスなど、要求していない応答も取得できることがあります#QSS: 2\r\n
。
だからあなたはあなたが期待する答えを知り、これを得るまで待つ必要があります
これが私がPythonで使用したものです。できます。他にもっと良い解決策があるかもしれません。
ser = serial.Serial(com, baudrate, timeout=5)
while True:
# a simple AT return result parser
new_char = ser.read(1)
byte_flow += new_char
if len(byte_flow) >=4 and byte_flow[-4:] == b'\r\nOK':
break
elif len(byte_flow) >= 7 and byte_flow[-7:] == b'\r\nERROR':
break
byte_flow += ser.read(2) # the final '\r\n'
elif
他のパターンがあれば追加できます。
元の Hayes コマンド セットを参照すると、ウィキペディアは次のように述べています。
<CR>
キャリッジ リターン文字は、コマンド ラインおよび結果コード ターミネータ文字で、0 ~ 255 の 10 進 ASCII で、パラメータ S3 内に指定されます。デフォルト値は 13 です。
したがって、応答の終わり (およびモデムに送信されたコマンドの最後) を示すために、任意の文字を設定できる必要があります。
とにかく<CR>
、s は多くのモデムの応答によって最後の文字として返されるだけではありません。
S3
したがって、別の文字値を に書き込むと、モデムの応答の最後に送信される最後の文字が変更されるだけなのか、それともモデムの応答<CR>
中に送信された文字が に格納されている値に変更されるのかは、興味深い実験になるかもしれませんS3
。
応答形式はコマンド固有です。特定の類似点 ("OK\r\n") がありますが、最終的にはそれぞれを明示的に処理する必要があります。