- - PR -
シリアル通信で受信データ欠落
«前のページへ
1|2|3
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-12-13 23:25
unibon です。こんにちわ。
直接の回答ではないのですが、つぎの点が気になっています。 (1) ハードウェアは PC-9800 シリーズ? PC-AT 互換機? (2) マルチタスクはどのようにして実現されているのでしょうか? もしかしたら Windows 上で DOS プログラムを動かしている? (3) シリアルケーブルの仕様と、ソフトウェアが想定する仕様とが食い違っていた、 ということもわずかに考えられます。 (4) ソフトウェアはドライバレベルなのかアプリケーションレベルなのかに大別できますが、 どちらでしょうか?Config.sys(や autoexec.bat)あたりの具体的な設定を提示されると なにか解決案が寄せられるかもしれません。 |
|
投稿日時: 2003-12-14 13:19
DTR/DSRや、CTS/RTSの制御は、最近のチップでは自動化されているものも多いですが、元々はソフトが制御してました。i8251や16550Aなどは自動ではありません。その辺は、チップの取り説を見た方が確実です。
> チップ上のバッファは16バイト以上あるのに1バイト分しかない様な振る舞いをしているのでしょうか? については、Init()の引数 rsinit_t型の中に、バッファを使用する/しないの設定や、バッファに何バイト入ったら受信割り込みビットを立てるかの設定があるんじゃないかと思います。無ければバッファが無いか、使ってないです。 その関数を見ると、チップがi8251クラスのような気もしますが、単に抽象化してるだけかもしれません。 また、DOSベースであれば、それぞれのアプリは自律的に自分の処理を終わらせて、次のアプリに制御を渡していくわけですから、UDPアプリの割り込み処理時間が長いと困ります。割り込みの優先を付けられるのなら、シリアルの受信割り込みを高順位に持っていけば改善されると思いますが、優先は付けられないんじゃないかな。 UDPアプリの割り込み処理にカウンターを付けて処理時間を計ってみて、因果関係をはっきりさせたらいかがですか。 LANが有線/無線は、アプリの部分では関係ないと思います。1パケット受信しきってから割り込んでくるはずなので、その経過に時間がかかっても、それはチップ内の問題です。 ところで、今は何が問題でしょう? |
|
投稿日時: 2003-12-15 21:53
やむさん、unibonさん、丁寧なアドバイスありがとうございました。
まず、ハードウェアはPC-AT互換機です。 マルチタスクではなくシングルタスクでうごかしています。 MS-DOS6.2でコンパイラはMSC7.0です。 rsinit_tの中身は #ifdef __cplusplus struct rsinit_t { /* 初期化データ */ #else typedef struct { /* 初期化データ */ #endif unsigned long bps; /* ボーレート */ unsigned short recmax; /* 受信バッファ サイズ ( 2 の累乗, 16 以上 ) */ unsigned short sndmax; /* 送信バッファ サイズ ( 2 の累乗, 16 以上 ) */ enum RsDataBits rsdata; /* データ・ビット長 */ enum RsStopBits rsstop; /* ストップ・ビット長 */ enum RsParity rsparity; /* パリティ */ enum RsClock rsclock; /* クロック・レート */ enum RsCtrl rsctrl; /* 通信制御モード */ #ifdef __cplusplus }; #else } rsinit_t; #endif となっています。 実は、今日、無線LANから有線LANにしてテストを行ったところ、 シリアルの不具合がなくなりました。??? また、無線LANにした場合でも、UDP通信を定周期(0.5sec)ぐらいで、 入れてやるとシリアル不具合はなくなりました。??? 実際にUDP通信を定周期でいれてやると、こちらから、UDP送信したときの 相手からのアンサー伝文の受信もかなり早く、 定周期を入れないと遅くなるみたいです。 また、有線にすると定周期伝文の有無に関係なく、すばやく反応してくれます。 原因はよく分かりませんが、客先の担当者のかたも一応OKをくれたので、 ひと段落です。 たくさんの皆さんのほんとに親切なアドバイスどうもありがとうございました。 |
«前のページへ
1|2|3