掲示板


[記事リスト] [返信する] [新着記事] [過去ログ] [ワード検索] [留意事項] [管理用]

記事No 849
タイトル Re: USART受信プログラム
投稿日 : 2017/03/22(Wed) 20:27:12
投稿者 n
参照先
radioさん
nです。

受信データが、'S'(文字コード)なら書式に%cを指定します。
RcvData = ReadUSART(); // 1バイト受信
sprintf(buff1,(const far rom char *)"%c",RcvData);

受信データが、文字コードではなく数値だった場合は、
書式に%X(16進)や%d(10進)を指定します。
RcvData = ReadUSART(); // 1バイト受信
sprintf(buff1,(const far rom char *)"%02X",RcvData);
(%Xを%02Xとすると、00が表示できます)

すでにNo.848に投稿されていますが、ReadUSART()を使用する場合、
有効な受信データが到着しているかを確認する必要があります。
以下の、コードでご確認ください。
(getcUSART()は、ReadUSART()の別名ですので統一しました)
(空のループ(while文)を、空の波かっこ{}で表すスタイルです)

void RadioControl(void)
{
while(!DataRdyUSART()){} //必要
RcvData = ReadUSART();
if(RcvData == 'S'){
while(!DataRdyUSART()){} //必要
RcvData = ReadUSART();
if(RcvData == 'S'){
for(i = 0; i < 5; i++){
while(!DataRdyUSART()){}
Buf1[i] = ReadUSART();
}
for(i = 0; i < 5; i++){
while(!DataRdyUSART()){}
Buf2[i] = ~ReadUSART();
}
while(!DataRdyUSART()){}
RcvData = ReadUSART();
delay_ms(100);
MotorControl();
}
}
}

> PIC18F2320 + C18の環境で作成しています。
>
> 下記サイトを参考にさせていただき、無線ラジコンに取り組んでいます。
> 送信側は完成しましたが、受信側のプログラムで躓いています。
>
> [送信側]
> http://www.picfun.com/Sensor/equipj77.html
>
> XCTUで確認した所、受信側で次のデータが受信できていることを確認しました。
>
> 53 53 02 00 00 00 00 FD FF FF FF FF 45
> (S S 方向 右速度H 右速度L 左速度H 左速度L ~方向 ~右速度H ~右速度L ~左速度H ~左速度L E)
>
>
> 続いて、受信側のプログラムに取り掛かりました。
> [受信側]
> http://www.picfun.com/Sensor/equipj78.html
>
> Radio control関数(下記に掲載します)で躓いています。
>
> サイトのコードを参考に、C18環境で書き直して確認していますが、
> (確認の方法は、受信データをLCDに表示させています。)
>
> LCDにデータが何も表示されません。
> カーソルは2マス動くのですが、何も表示されない状態です。
>
> 確認の方法を含めて何かおかしなことをしているのでしょうか。
> 教えていただけると助かります。
>
> void RadioControl(void)
> {
> char buff1[20]; //LCD 1行目表示データ
> char buff2[20]; //LCD 2行目表示データ
>
> // データ受信と受信データ解析
> RcvData = ReadUSART( ); // 1バイト受信
> sprintf(buff1,(const far rom char *)"%2d%",RcvData);
> lcd_cmd(0x80); //1行目へ移動
> lcd_str(buff1);
> lcd_clear(); //LCD全消去
> delay_ms(1000);
>
> if(RcvData == 'S') // 'S'受信待ち
> {
> RcvData = ReadUSART( );
> sprintf(buff1,(const far rom char *)"%2d%",RcvData);
> lcd_cmd(0x80); //1行目へ移動
> lcd_str(buff1);
> lcd_clear(); //LCD全消去
> delay_ms(1000);
> if(RcvData == 'S') // 連続'S'受信待ち
> {
> for(i=0; i<5; i++) // データ受信5バイト
> while (!DataRdyUSART());
> Buf1[i] = getcUSART( );
> for(i=0; i<5; i++) // 反転データ5バイト受信
> while (!DataRdyUSART());
> Buf2[i] = ~getcUSART( );
> RcvData = ReadUSART( ); // 'E'受信
> // データ照合とモータ制御
> //MotorControl();
> }
> }
> }

- 関連一覧ツリー (▼ をクリックするとツリーを一括表示します)


- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)
おなまえ
Eメール
タイトル
メッセージ
参照先
画像UP
暗証キー (英数字で8文字以内)
投稿キー (右画像の数字を入力) 投稿キー


- 投稿記事修正/削除フォーム -
処理 No 暗証キー

- WebForum -