Masanobu Suzuki様
たいへんお世話をおかけしております。
一所懸命書いてくださいまして
なんとお礼を申し上げてよいか
ほんとうにありがとうございます。
>受信割り込み関数(void){
> ①割り込みステータスフラグのread&クリア0
> ②受信が許可されているかの判断
> (許可されていなければバッファに書き込まず割り込みを抜ける)
> ③受信が許可されていれば、ポインタを+1する ( rx_len++ )
> ④もしポインタが文字バッファ容量を越えている場合の処理
> ⑤バッファに1文字書き込む (RXBUF [ rx_len ] = SCI0.RDR)
> ⑥受信完了フラグを立てるかどうかの判断文
>}
について、少なくとも④はやりませんでしたが、
-----------------------------------------
/* SCI0から割込みで1文字受信する***************************/
interrupt void RXI0_Interrupt(void) {
unsigned char data;
SCI0.SSR.BYTE &= ~(0x40); /* RDRFフラグのリード&クリア */
if (rx_phase == 2) {
return; /* 受信データ処理中なら無視 */
}
else {
data = SCI0.RDR;
RXBUF[rx_len++] = data; /* バッファへの書き込み */
if (data == '\r'){
rx_phase = 1; /* 受信データがあるよん */
return;
}
}
}
により、動きました。
少し手抜き工事で申し訳ありません。
尚、今後は、ご指摘の
>その他、受信した文字にエラーがあるのかどうかは、H8では
>受信エラー割り込みが別に用意されていますから、ここで必要な
>処理を独立して記述(エラーフラグを立てるなど)しておけば簡単
>です。メインは文字バッファから読み込む前に、このエラーフラグ
>をチェックし、エラーがあればなにも考えず受信データを捨てれば
>良いわけです。
>
>但し、受け取った文字列が正しいかどうかの判断は、メイン側で
>別途行なう必要があることに注意してください。
等もよく考えて、機能追加をして行きたく思います。
大変ありがとうございました。
(明日は、出張でメールが見れません。)
鈴木
さんは書きました:
>鈴木さん>
>
>> >>RXBUF[rx_len++] = SCI0.RDR; /* バッファへの書き込み */
>> 等によるバッファへの蓄積ルーチンは、どこに記述するのが正しいのでしょうか
>> 実は、ここがよく分かっていないポイントなのです。
>> (メインルーチンの中??・・・・)
>
>答えを先に書くと、受信割り込みルーチンの中です。
>
>ところが、先の鈴木さんの受信割り込みルーチンでは、
>while(条件式){
> RXBUF[rx_len++] = SCI0.RDR; /* バッファへの書き込み */
>}
>となって、while文でRDRのデータを繰り返しポインタrx_lenを進め
>ながら蓄積しようとされていました。
>
>この処理の問題点は以下です。
>
>・RDRの値は(先にご説明したように)何度読んでも同じですから、
> 文字バッファは同じデータで産め尽くされること。
>
>・条件式がRDRFbit==1のため、このwhile文を抜けられないこと。
>
>・その結果無限ループになり、ポインタrx_lenが0〜255まで進み
> 最初に用意した文字バッファの配列数を超え、隣接する他の
> 変数など が書き換わって暴走する原因になっていること。
> (C言語は、実効時のエラーチェックを行ないません。)
>
>では、どうすれば良いかといいますと、
>
>
>です。ここで、⑥ですが、例えばPCなどのハイパーターミナル
>などで文字を送ると、文字の最後は 'C/R' または'C/R'+'L/F'
>が文末に送られますので、'C/R' か'L/F'(デリミタと言います)
>を受信した場合に受信完了フラグ(FLG)をセットします。
>尚、デリミタ文字は任意ですが普通はC/RかL/Fです。
>
>こうしておくと、メインからこのフラグを見たときセットされていれば
>いつでも何らかの文字列が入っていることになり、先頭からデリミタ
>までの個数を調べれば取り出すべき文字列が判ります。
>(ポインタで調べてもいいです)
>メインでは、文字バッファを読んだあとは、
>・ポインタを先頭に戻す。
>・受信を許可する(受信完了フラグをリセット=受信許可としても良い)
>
>また、受信の考え方はこれだけではないので、あくまでひとつの
>参考とお考え下さい。長くなってすいません。
>
>鈴木(正)
>
>
----
鈴木 政之 suzuki@xxxxxxxxxx