[H8-ML(2090)] Re: [H8-ML(2088)] Re: SCIの受信エラー
From: "Henry Sugimoto of OB." <ob_henry@xxxxxxxxxxxxxxxx>
Date: 2002年07月19日(金)14時58分46秒
> 私が確実なシリアル送受信が必要な場合、送受信の割り込みと
> キュー(順番待ち行列)を使っています。  ちょうどいいサンプル
> を見つけることはできませんでしたが、 調べてみてください。

   ’¥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

スレッド概略
[2087(R)](起点)
 └[2088(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]