私は現在、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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- au(KDDI) auからの 【重要なお知らせ】 は本物? 6 2022/04/07 22:09
- Gmail gmail から docomo メールに送信できません 4 2022/06/25 00:41
- iPhone(アイフォーン) ショートメールの文字数制限について。 3 2023/01/24 11:37
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「TCPは全二重可能」の意味
-
Linux C言語 ソケット通信について
-
RS232cを用いた送信プログラム
-
シリアル通信時のデータ受信方法
-
パケット受信 recvfrom( )につ...
-
VBのMSCommコントロールを使っ...
-
パソコンに詳しい方教えて下さ...
-
jarファイルが開けない
-
ffastun.*って何ですか?
-
複数のフォルダーからファイル...
-
ICH5R→ICH5R (RAID0) マザー...
-
ファイルの更新日時について
-
ファイルの操作履歴の閲覧
-
32ビット&64ビットマシン
-
Windows 7 標準のZip解凍が出来...
-
VBでスタンバイや休止状態か...
-
cronの設定について
-
Windows上のファイル操作の履歴...
-
インターネット応答なし
-
Zipファイルをエクセルに指定変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
Outlookの「受信日時」「送信者...
-
CRC-CCITTに関しての仕様とサン...
-
シリアル通信時のデータ受信方法
-
Excxel vba でYahoo API で住所...
-
UDP受信時の通信異常検知について
-
recv関数の戻り値について
-
ASP.NET C#でPOST受信
-
RS232cを用いた送信プログラム
-
VC++メッセージの送受信につい...
-
PC98で232c送信winndowで受信で...
-
TCPのプログラミングで質問…と...
-
VBのMSCommコントロールを使っ...
-
「TCPは全二重可能」の意味
-
DHCPOFFERの受信について
-
VB2010で、シリアル通信の方法...
-
msgrcv( )で領域破壊?
-
シリアル通信
-
ネットワークでの受信バイト数
おすすめ情報