> 私が確実なシリアル送受信が必要な場合、送受信の割り込みと
> キュー(順番待ち行列)を使っています。 ちょうどいいサンプル
> を見つけることはできませんでしたが、 調べてみてください。
’¥r’ を’¥r’’¥n’に変換してるのに、なんといきなりファイル
とは無茶ですね。 若しも受信した文字をそのまま返送してい
たら(CrLf なんかやんないで)動いたのでは有りませんか?
受信文字に+CrLfなんかしちゃえば、割り込みタイプのエコーバ
ックでも、一寸ファイルサイズが大きいとバッファーがオーバーフ
ローしませんか? 実際の動きを冷静に考えてみて下さい。
先ず、単純なエコーバックにする事。 これだけで受信漏れは
直ると思われます。
受信、送信共にブロックタイプ(処理終了まで止まる)ですね。
これでは厳密には同時には動作出来ませんね。
割込みでなくとも同時動作可能なプログラムは書けます。
それは、
1 受信有りフラグがあったら受信し、バフッファーに書く、
受信フラグが無いなら次に、ここで待たないのがミソです。
(ファイルいじるならバッファーは2048バイト位は用意してね)
2 バッファーに送信文字が有り、送信バッファーが空なら
送信する。 送信終了を待ったりしない!
をループで廻します。 途中で待ってはいけません。
何たって同時に動作させるんだから。 今出来る事
だけをやらせて外に出来る事が無いか調べさせます。
割り込みタイプ等は、また別問題ですね。
char r_buf[2048]; // バッファー
int r_pt=0; // かきこみポインター
int t_pt=0; // 読み出しポインター
// 文字を格納
void put_buf(char c)
{ r_buf[r_pt++]=c;
r_pt=r_pt & 2047; // リングバッファーですね。
}
// バッファー内の文字数を取得
int len_buf()
{ int i;
if(r_pt > t_pt) return(r_pt - t_pt);
else return(r_pt +2408 -t_pt);
}
// 文字取り出し---必ず文字が存在する事
char getc_buf()
{ char c;
c=r_buf[t_pt++];
t_pt=t_pt & 2047;
return(c);
}
こんな感じでしょうか。 オーバーフロー対策までは
入れてませんからね! 実物ではやんないとしかられま
すって言うか、いきなり暴走(文字が急に増えたり減った
りします)
杉本
横浜市 緑区 東本郷 6-17-1-602
オンボード Tel: 045-473-7678
URL:www02.so-net.ne.jp/~ob_henry