アプリ版:「スタンプのみでお礼する」機能のリリースについて

私は現在、H8-3052Fを用いて別の回路と画像データなどを送受信するソフトをGCC-Developpers Liteを用いて作っています。
H8-3052Fを用いてunsigned char型の文字列をRS-232Cで受信して、配列に格納する方法を教えて下さい。

現在は下記の1文字受信関数を用いていますが、うまく出来ません。
Main文では常に文字列受信を待っている状態で、またITU割り込みで1秒ごとに別の処理が走るようにしています。

char SCI1_IN_d(void) //受信文字を返す
{
char c; //受信データ格納変数
while (!(SCI1.SSR.BYTE&0x78)); //受信もしくはエラーフラグが立つまで待つ
if(SCI1.SSR.BIT.RDRF==1) //受信完了でRDRF=1
{
c=SCI1.RDR; //データ取り出し
SCI1.SSR.BIT.RDRF=0; //受信フラグクリア
}
else
{ //受信完了していないならRDRF=0
SCI1.SSR.BYTE&=0x80; //エラーならエラーフラグクリア
c=0;
}
return c; //受信文字を返す
}

以上です。
何分素人なので解りかねることがあると思いますが、宜しくお願い致します。

A 回答 (2件)

 過去に作ったプログラムを載せるので参考にどうぞ


 元は綺麗に整列しているのですが、タブが無くなったりして汚く表示される。
 コメントを削れば、いくらか見易くなります。


voidInit_SCI_0(void)
{
register unsigned chardummy;/* 書き込む前に読み込みが必要なレジスタの、ダミーリード用*/

/*=== 送信動作、受信動作のみをON===*/

SCI0.SCR.BYTE = 0x30;/* "TIE, RIE, TE, RE, MPIE, TEIE, CKE1,CKE0"*/
SCI1.SCR.BYTE = 0x30;/* TIE:送信データ空きで割り込み:OFF*/
/*DMAC-0Aの割り込み処理内で、TIE=1 にする。*/
/*SCI-0の送信割り込み処理内で、TIE=0 にする。*/
/* RIE:受信データ及びエラー割り込み:ON*/
/* 受信割り込みを許可しないとDMAは動作しなかった。*/
/* しかし受信割り込み処理には飛ばないようです。*/
/*  TE:送信許可:ON*/
/*  RE:受信許可:ON*/
/* MPIE:マルチプロセッサ・インターラプト・イネーブル:OFF*/
/* TEIE:送信終了で割り込み:OFF*/
/* CKE1,0:クロック源、ポート9クロック端子の設定*/
/* CKE1,0 は SMR より以前に設定とマニュアルに書いてある*/
/* しかし一方でTE,REを1にする前にSMRの設定を行う*/
/* ようにマニュアルに書いてある。これは、いきなり送受信*/
/* を開始した場合の処置であろう。*/
/* TE,REを先に設定しても大丈夫。*/

/* bit7TIE  送信データ空きで割り込み0:禁止1:許可*/
/* bit6RIE  送信データ空きで割り込み0:禁止1:許可*/
/* bit5TE 送信動作0:禁止1:許可*/
/* bit4RE 受信動作0:禁止1:許可*/
/*TE,REを1にする事によって、ポート9の*/
/*機能がSCIになる。*/
/* bit3MPIE マルチプロセッサ割り込み0:禁止1:許可*/
/* bit2TEIE 送信終了割り込み0:禁止1:許可*/
/* bit1CKE1 SCIのクロック選択0:内部1:外部*/
/* bit0CKE0 SCK端子機能の選択0:入出力1:クロック出力*/

/*=== 調歩同期式、8ビット、パリティ無、(偶)、マルチプロセッサ機能禁止、Φ/ 1 クロック===*/

SCI0.SMR.BYTE = 0x00;/* 調歩/同期、8/7ビット、パリティ有無、偶/奇、*/
SCI1.SMR.BYTE = 0x00;/* ストップビット長1/2、マルチプロセッサ、分周比選択*/
/* bit70:調歩同期1:クロック同期*/
/* bit60:データ長81:データ長7*/
/* bit50:パリティ無し1:パリティ有り*/
/* bit40:偶数パリティ1:奇数パリティ*/
/* bit30:1ストップビット1:2ストップビット*/
/* bit20:マルチプロセッサ機能禁止1:マルチプロセッサ フォーマットを選択*/
/* bit1,000:Φ/ 1 クロック01:Φ/4 クロック*/
/*10:Φ/16 クロック11:Φ/64 クロック*/

/*=== ビット・レイト設定SCI0:9600SCI1:38400===*/

SCI0.BRR = 0x50;/* 9600 19200 31250 38400*/
SCI1.BRR = 0x13;/* 16MHz 51(33H) 25(19H) 15(0FH) 12(0CH) H8/3048F*/
/* 25MHz 80(50H) 40(28H) 24(18H) 19(13H) H8/3052F*/

/*=== 送信可能にして、全エラーフラグのリセット、TEND には1を書き込んでおく。===*/

dummy = SCI0.SSR.BYTE;/* H8のフラグは読み出してからでないと書けないのがある*/
SCI0.SSR.BYTE = 0x84;/*ステータス・レジスタのエラーフラグをリセット*/
dummy = SCI1.SSR.BYTE;/* bit7 TDRE: 1のとき送信データを書き込める*/
SCI1.SSR.BYTE = 0x84;/* bit6 RDRF: 1のとき受信データ有り*/
/* bit5 ORER: 1のとき受信オーバーラン・エラー*/
/* bit4 FER: 1のとき受信フレーミング・エラー*/
/* bit3 PER: 1のとき受信パリティ・エラー*/
/* bit2 TEND: 1のとき送信終了を示す。リードオンリー。*/
/* bit1 MPB: 受信したマルチ・プロセッサ・ビットを示す*/
/* bit0 MPBT: 送信するマルチ・プロセッサ・ビットを示す*/
}



/*************************************/
/*シリアルインターフェースから1バイト入力*
/* 入力データが無ければ、EMPTYを返します。そのため、受信データが EMPTY*
/* と同じ時は区別が付きません。関数を呼び出す前に、RDRFを確認すると良い*
/* 0x80 以上にすると負数として扱われるため、トラブルが起きる。*/
/*  文字列に 0xFF を書き 0xFF と比較したら、等しいと見なされなかった。*/
/*  片方が 0xFFFF と符号拡張された為に、等しいと見なされなかった。*/
/*************************************/

/*=== チャネル0 ===*/

charRead_RXD0(void)
{charRXD = EMPTY;/* 初期値を EMPTY(H'7F) にします*/
if ( SCI0.SSR.BIT.RDRF )/* 受信フラグが1ならばデータ有り*/
{ RXD = SCI0.RDR;/* 受信データ引き取り*/
SCI0.SSR.BIT.RDRF = 0;/* 次の受信準備(このリセットが重要)*/
}
else
{SCI0.SSR.BYTE &= 0xC7;/* 受信関係のエラーフラグを強制的にリセット*/
/* エラーで受信できない事を回避するためです*/
SCI0.SCR.BIT.RE = 1;/* 念のため受信許可を送る*/
}
return RXD;/* 受信データまたは、EMPTY を返す*/
}
    • good
    • 0
この回答へのお礼

ご丁寧なコメント付きのコードをありがとうございます。
おかげさまでなんとか上手くいきました。

お礼日時:2009/07/19 19:42

SCI1の初期化はあってますでしょうか?


ご使用のCPUクロックは何MHzでしょうか?
CPUボードですが、何をお使いでしょうか?

この回答への補足

SCI1の初期化は確認しました。
クロックは25MHzです。
CPUボードはAKI-H8/3052Fを使用しています。

補足日時:2009/07/09 14:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!