0

私は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制御(有効/無効/ハンドシェイク/トグル)を設定する方法がわかりません。

このモデムの扱い方に明らかな間違いがあることに気づいたら、私が間違ったことを説明していただければ幸いです。一方、すべてが正常であれば、モデムがハングする理由がわかっているかもしれません。

前もって感謝します。

4

2 に答える 2

1

通常、DCB設定は最初に確認する必要があるものです。モデムのドキュメントには、シリアルポートの設定が記載されている必要があります。モデムのモデル番号を使用してオンラインで検索しない場合。

于 2009-07-11T13:43:00.270 に答える
1

デバイスマネージャ、モデム、およびプログラムのフロー制御がすべて同じに設定されていることを確認してください。Delphiはわかりませんが、DCBには「フラグ」フィールドが必要だと思います。ハードウェアフロー制御のために24に設定してみてください。

于 2009-07-11T14:11:22.747 に答える