私はWavecom Supreme GSMモデムを持っています。私は、モデムと通信し、受け取ったテキストメッセージを読むシンプルなアプリケーションを書いた。シリアル通信中にモデムがハングアップする
私のアプリケーションは、メモリに格納されているメッセージの数に関する情報をモデムに問い合わせ、その数が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の制御(有効/無効/ハンドシェイク/トグル)の設定方法はわかりません。
このようにモデムを扱う際に間違いがあることに気づいた場合は、私が間違っていたことを説明していただければ幸いです。一方、すべてがうまくいけば、モデムがハングアップする理由を知っているかもしれません。
ありがとうございます。