私のATコマンドの応答をどのように解析することができますか?
はい、これは正しい質問です。
ATコマンドを送信した後、シリアルに印刷された1行目を削除するにはどうすればよいですか?
いいえ、エコーがオンかどうかを気にする場合は間違っているので、これは間違った質問です。
次のようにコマンドの出力で解析するための正しい戦略は次のとおりです。
- (正しく
"\r"
で終了)、ATコマンドラインを送信します。
- 完全な行が
"\r\n"
で終了するまで、モデムから受け取った1文字と1文字を読み取り、その行を解析します。
- 行が最終結果コードと等しい場合、コマンドラインからのすべての出力が完了します(モデムは新しいコマンドを受信する準備ができています)。これはあなたがテストする最初のものでなければなりません!
- ATコマンド実行時に、情報テキストの応答行(ほとんどすべてのもの)に接頭辞が付いていれば、その行が開始するかどうかを確認し、そうであれば行を処理します。
- 実行中のATコマンドに接頭辞が付いていない場合は、最終結果コードが受信されるまですべてを印刷することをお勧めします。これは、
ATI
のようなレガシーコマンドにのみ適用され、これらの解析ではエコーについて正当な関心があるかもしれません。応答は複数行に分割されているので、それは少しより多くの仕事であるAT+CMGL
コマンドの今
。
最初に、最良の情報源は、製造元固有のATドキュメントであり、次善策は、AT+CMGL
コマンドを標準化する公式の3GPP 27.005仕様です。\ rを\あなたは(空白行を読むまで、次のすべての行を ":「+ CMGL」
テキストモードでAT + CMGLの応答は、したがって始まる行を受け取った後
+CMGL: <index>,<stat>,<oa/da>,[<alpha>],[<scts>][,<tooa/toda>,
<length>]<CR><LF><data>[<CR><LF>
+CMGL: <index>,<stat>,<da/oa>,[<alpha>],[<scts>][,<tooa/toda>,
<length>]<CR><LF><data>[...]]
として指定されていますn ")はこれに属します。
一般的なコード構造とフローについてはthis answerを参照してください。ただし、上記のように応答のマルチラインプロパティはもう少し処理する必要があります。私は、次の(未テストコード)のようなものを使用しているだろう:
enum CMGL_state {
CMGL_NONE,
CMGL_PREFIX,
CMGL_DATA
};
// Extra prototype needed because of Arduino's auto-prototype generation which often breaks compilation when enums are used.
enum CMGL_state parse_CMGL(enum CMGL_state state, String line);
enum CMGL_state parse_CMGL(enum CMGL_state state, String line)
{
if (line.equals("\r\n") {
return CMGL_NONE;
}
if (line.startsWith("+CMGL: ") {
return CMGL_PREFIX;
}
if (state == CMGL_PREFIX || state == CMGL_DATA) {
return CMGL_DATA;
}
return CMGL_NONE;
}
...
write_to_modem("AT+CMGL=\"ALL\"\r");
CMGL_state = CMGL_NONE;
goto start;
do {
CMGL_state = parse_CMGL(CMGL_state, line);
switch (CMGL_state) {
case CMGL_PREFIX:
process_prefix(line); // or whatever you want to do with this line
break;
case CMGL_DATA:
process_data(line); // or whatever you want to do with this line
break;
case CMGL_NONE:
default:
break;
}
start:
line = read_line_from_modem();
} while (! is_final_result_code(line))
これは多くのことを吸収するためのものです。この便利な情報に感謝しています。私はこれを完全に実装する能力に疑念を抱いています。私は初めてATコマンドと構文解析を扱っています。少し混乱しています..ありがとう! – Ralph