- PR -

シリアル通信で受信データ欠落

投稿者投稿内容
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2003-12-08 11:40
ここで質問して良い内容かどうかわからないのですが、質問させてください。

MS-DOS6.x上でシリアル通信をしているアプリケーションがあります。
それとは別に2つのUDPのアプリケーションがあります。3つともc言語で組まれ
たプログラムです。
シリアル通信をしているアプリを単独で動かした場合には問題なくデータを受
信する事が出来ます。しかし、UDPのアプリ2つも同時に動かすとシリアル通信
をしているアプリの方で、データが受信出来ない事が多々あります(最初の数
バイトしか受信できない)。原因は何が考えられますでしょうか?また、この
ような構成でアプリケーションを動かす際のシリアル通信アプリの実装のしか
たは、何か工夫がいるのでしょうか?また、参考になるURL等をご存知であれ
ば、教えていただけないでしょうか?

Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2003-12-08 14:12
私もあまり詳しいほうではないのですが...

シリアルのほうですが、相手とハンドシェイクをして通信手順を作成して
通信しているのですよねぇ?たとえば、ACK、NACKの扱い等...
多分、シリアルの方が通信中に割り込みが発生した際、シリアル側で再送要求
とかの処理をしていますか?
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2003-12-08 22:08
MS-DOSでシリアル通信のプログラミングはやったことないのですので、
外していたらごめんなさい。

シリアル通信を取りこぼす要因は:

・シリアルポートの受信バッファから受信データを取りこぼしている。
・シリアルポートのUARTが16450などのバッファが少ないタイプである。
・シリアル通信アプリがフロー制御(ソフトウェア or ハードウェア)を
行っていない場合、負荷がかかると取りこぼす。

で、これらの対処は:

・シリアル通信アプリでフロー制御を行っていない場合、フロー制御
(できればハードウェアフロー制御)を行う。
ただし、シリアル通信の相手がサポートしていなければ、だめ。
・シリアルポートのUARTが16450であれば、16550やそれより上位のICを載せた
インターフェイスボードを使う。
別途、シリアルポートの制御ルーチンやドライバの対応が必要。
・シリアルポート→Ethernet(IP)変換器を使い、アプリもシリアル通信では
なく、TCP/IPを使う。

参考になるURLはあまり思いつきませんが、
・Ethernet変換器とか高速シリアルインターフェイスボードはここらへんに
あるかも。
http://www.blackbox.co.jp/
http://www.panduit.co.jp/
http://www.contec.co.jp/
http://www.kumikomi.net/index.html

・PCのシリアルポート周りは、次の資料のなかにあるかも。
http://www.ctyme.com/rbrown.htm
http://www.devdrv.co.jp/shsmod/
 UART(やSuperIO) を作っているメーカーの資料とかも。
 (SMCやWinbondっていまも作ってるのかな?

[BBコード無効→有効に修正]

[ メッセージ編集済み 編集者: ちいにぃ 編集日時 2003-12-08 22:57 ]
Keisuke
大ベテラン
会議室デビュー日: 2003/10/24
投稿数: 105
投稿日時: 2003-12-08 22:39
おそらく割り込みの競合でないかと思います。

MS-DOS でどうやって3つのアプリを動かしているのですか?
TCP/IP プロトコルスタックはどうされているのでしょうか?
Kuma
ベテラン
会議室デビュー日: 2001/12/20
投稿数: 66
投稿日時: 2003-12-09 08:47
MS-DOS ってシングルタスクですよね。
そこに擬似マルチタスクアプリ化で、3つのアプリを動かしているということでしょうか?
それともディバイスドライバーを3本使って、それを制御するアプリが1本動いているのでしょうか?

いずれにせよシングルタスクOSですから、それぞれのアプリが占有するタイムシェアが長いためのとりこぼしでしょう。
Junbow
ぬし
会議室デビュー日: 2002/01/24
投稿数: 373
お住まい・勤務地: saga.jp
投稿日時: 2003-12-09 09:28
 とりあえず、シリアルポートの速度を落として(9600以下。できれば1200bpsとか)、それで様子を見てみるってのはどうでしょう?
 バッファのないやつでも、9600以下に速度を落とせば仕様上はOKだと思うので・・。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2003-12-09 10:03
Kuma さんと同意見です、非同期なタスクが3本ですから
素直に、リアルタイム・OS を使うのが、安全では。
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2003-12-09 16:25
皆様、アドバイスありがとうございます。

実は、現状9600のボーレートでも文字列中の途中20キャラクタぐらいを取りこぼして
おり、多分、自分のプログラムに問題があるのでは、と思い始めました。知り合いに
も「9600だと、1文字受信するのにだいたい1msec.だけど、その時間UDPが割り込みを
禁止することなんてあるんだろうか?」と言われました。
UDPの割り込みのシステムをよく知らないんですが、文字を受信した場合、1パケット
(どのくらいの時間と文字数か知りません。)を受信している間、シリアルの割り込み
を禁止しているのでしょうか?

また、「シリアル通信のアプリケーションをマルチタスクにすればよいのでは?」と言
われました。

また、UARTとはチップのことで、16450だと、受信バッファが1バイトで16550やそれ
より上位のICだと、16バイト以上のチップなんでしょうか?
また、TCP/IP プロトコルスタックってどういうものですか?

現状ハード構成はパネルコンピュータを使用しており、チップを替えることは、難し
いです。(ボードを増設すれば可能ですが。)ただ、ハードウェアフロー制御はできる
と思います。現状は配線上短絡させており、機能していません。(常にOKの状態です)

スキルアップ/キャリアアップ(JOB@IT)