私は現在、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; //受信文字を返す
}
以上です。
何分素人なので解りかねることがあると思いますが、宜しくお願い致します。
No.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 を返す*/
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10進数からN進数に変換するプロ...
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
どうして+3
-
プログラム言語について c言語...
-
C++でデスクトップGUIアプリ開...
-
int16_t の _t は何?
-
2つほどお聞きしたいことがあり...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C言語って古いですか?
-
ストリームについて。
-
QT(C++)の学習方法について
-
Cのコンパイルでコメントアウト...
-
C言語について。
-
Windows Formアプリからコンソ...
-
パソコン
-
今ってプログラミング言語は何...
-
プログラミング言語についてc++...
-
次の記述について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
UDP受信時の通信異常検知について
-
シリアル通信時のデータ受信方法
-
Outlookの「受信日時」「送信者...
-
PC98で232c送信winndowで受信で...
-
ネットワークでの受信バイト数
-
VB2010で、シリアル通信の方法...
-
C#にてCTI。RS232Cの受信と送信...
-
マルチスレッドに挑戦したい
-
VBのMSCommコントロールを使っ...
-
DHCPOFFERの受信について
-
TCPのプログラミングで質問…と...
-
「TCPは全二重可能」の意味
-
winsockを使ったTCP及びUDP通信...
-
TCPでパケットロス?
-
msgrcv( )で領域破壊?
-
VC++メッセージの送受信につい...
-
CRC-CCITTに関しての仕様とサン...
-
プログラムの実行時間計測方法...
おすすめ情報