私はWavecomSupremeGSMモデムを持っています。モデムと通信し、受信したテキストメッセージを読み取る簡単なアプリケーションを作成しました。
私のアプリケーションは、メモリに格納されているメッセージの数に関する情報をモデムに照会し、その数が0より大きい場合は、メッセージを読み取ってモデムのメモリからメッセージを削除します。私はこの方法で数秒ごとにモデムに問い合わせます。
ただし、残念ながら、モデムは数分ごとにハングし、送信したATコマンドに応答しません。通信のロックを解除するために私が思いついた唯一の解決策は、シリアルポートを閉じて新しく開くことです。その後、数分間はすべて正常です。その後、モデムがハングしたときにシリアルポートを再度開く必要があります。
もちろんモデムのせいかもしれませんが、私がモデムと通信する方法は大丈夫かどうか疑問に思っています。
何よりもまず、非同期操作のためにモデムのシリアルポートを開きます。次に、DCB構造を次のように設定します。
GetCommState(PortHandle, DCB);
DCB.BaudRate := 115200;
DCB.ByteSize := 8;
DCB.Parity := NOPARITY;
DCB.StopBits := ONESTOPBIT;
DCB.EvtChar := #13;
SetCommState(PortHandle, DCB);
SetCommMask(PortHandle, EV_RXFLAG);
//the modem does not respond without setting these:
EscapeCommFunction(PortHandle, SETDTR);
EscapeCommFunction(PortHandle, SETRTS);
そして、ATコマンドを送信して、モデムの応答を待つだけです。フロー制御は使用していません。私がすることはすべて、通信イベントを待ち、モデムが応答したときにシリアルポートのキューからデータを読み取り、いくつかのATコマンドの後に#13文字を書き込んで、モデムにメッセージを問い合わせます。
DCB構造を不適切に設定した可能性があると思います。ご覧のとおり、一部のフィールドは変更していません。シリアルポートに関する知識が十分でないため、RTSおよびDTR制御(有効/無効/ハンドシェイク/トグル)を設定する方法がわかりません。
このモデムの扱い方に明らかな間違いがあることに気づいたら、私が間違ったことを説明していただければ幸いです。一方、すべてが正常であれば、モデムがハングする理由がわかっているかもしれません。
前もって感謝します。