2009-07-11 32 views
0

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

このようにモデムを扱う際に間違いがあることに気づいた場合は、私が間違っていたことを説明していただければ幸いです。一方、すべてがうまくいけば、モデムがハングアップする理由を知っているかもしれません。

ありがとうございます。

答えて

1

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

1

デバイスマネージャ、モデム、およびプログラムのフローコントロールがすべて同じに設定されていることを確認してください。私はDelphiを知らないが、DCBには "Flags"フィールドが必要だと思う。ハードウェアフロー制御の場合は24に設定してみてください。

関連する問題