掲示板


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

記事No 853
タイトル Re^5: USART受信プログラム
投稿日 : 2017/03/23(Thu) 22:36:57
投稿者 n
参照先
radioさん
nです。

質問が明確なので、回答が楽です。

@ 動作にdelay時間を設けてしまうと、受信できないのは何故でしょうか?

 調歩同期式の通信では、受信側がデータを取りこぼすからです。

A Buf1[]内のデータが"ffff"や"ffe8"になってしまうのは何故でしょうか?

 char型データは、sprintf関数へint型に変換されて渡されます。
 char型の"ff"が負の数(-1)として扱われ、"ffff"になります。
 回避するには、unsigned char型へのキャストを行います。
 (unsigned char)Buf1[1]

B LCDにBuf1[]の5バイト分を1行に表示させる場合、どのように記述すれば良いのでしょうか?

 sprintf関数のbuff1へのポインタを2文字進めながら繰り返します。
 buff1のサイズは、11文字以上必要です。

for(i = 0 ; i < 5 ; i++){
sprintf(buff1+2*i,(const far rom char *)"%02x",(unsigned char)Buf1[i]);
}

> nさま
>
> 度々すみません。
> 少しずつ原因らしきものが見えてきました。
>
>
> 原因を解析するために、状態確認用のLEDを点灯させています。
> 最初の'S'を受信: 白色LED点滅
> 次の'S'を受信:  黄色LED点滅
>
> この点滅をわざと、delay時間を設けて行ってみました。
> 50msecに設定して点滅させてみたところ、'S'、'S'の後の、5バイトデータを受信することができませんでした。
> ⇒LCDに何も表示されない + 5バイトデータの一致判定プログラム(Errorなら赤色LED、Errorが無ければ緑色LED)で確認
>
> この時間を5msecに変更したところ、5バイトデータの一致判定プログラムまで進み、
> Errorが無い(緑色LEDが500msecで点滅する)ことを確認することができました。
>
> ただ、データを連続して受信することができません。
> 次の'S'、'S'受信まで行っているのですが、再びLEDに5バイトのデータが受信されません。
>
> そこで、Errorが無いときに確認していた緑色のLEDの点滅周期を5msecに変更しました。
> そしたら、連続してデータを受信することができ、送信側のデータに応じた動作(LED点灯)を行うことができました。
>
>
> 以上を踏まえて、何点か質問をさせてください。
>
> @今の状態では根本的な解決になっておらず、送信側のデータに応じた動作(今はLEDを点灯するだけ)の時間が長くなると、同じような不具合(連続してデータを受信できない)が発生してしまいます。
>  動作にdelay時間を設けてしまうと、受信できないのは何故でしょうか?
>
>
> ABuf1[]内のでーたが"ffff"や"ffe8"になってしまうのは何故でしょうか?
> 先程の投稿でもお伝えしましたが、Xbeeを接続して、XCTUで送信データを確認してみると、送信側は02 00 00 00 00 の5バイトのはずですが、
> LCDに表示されるデータが違ってしまいます。
> (ただ、この表示のデータでも、送信側のデータに応じた動作はできていますので、私のLCD表示プログラムがおかしいのでしょうか。)
> //Buf1[]内の数字を0〜4まで変更してLCDにデータを表示させました。
> //Buf1[0]=02
> //Buf1[1]=ffff
> //Buf1[2]=ffe9 or ffea or ffe8
> //Buf1[3]=00
> //Buf1[4]=17
>
>
> B初歩的な質問ですみません。
>  LCDにBuf1[]の5バイト分を1行に表示させる場合、どのように記述すれば良いのでしょうか?  
> 今は、↓のように[]内の数字を変えて1つずつ確認しています。
> sprintf(buff1,(const far rom char *)"Data=%02x",Buf1[1]);
> lcd_cmd(0x80); //1行目へ移動
> lcd_str(buff1);
>
>
>
> 5バイトデータ受信後のプログラムです。
> 照合一致(3 緑LED点灯、消灯)はコメントアウトしました。
>
>
> void MotorControl(void)
> {
>
>
> /*** 2連送照合比較一致の場合のみ制御実行***/
> Error = 0; // エラーフラグリセット
> for(i=0; i<5; i++){
> if(Buf1[i] != Buf2[i]) // 比較実行
> {
> Error = 0xFF; // エラーフラグオン
> LED_R ^= 1; // 赤LED点滅
> delay_ms(100);
> }
> }
> if((Error == 0) && (RcvData == 'E')) // 照合一致か?
> {
> //LED_G = 1; // 3 緑LED点灯
> //delay_ms(500);
> //LED_G = 0; // 3 緑LED消灯
> //delay_ms(500);
>
>
> Direction = (int)Buf1[0]; // 方向セット
> MLdata = (int)Buf1[1] * 256 + (int)Buf1[2];
> MRdata = (int)Buf1[3] * 256 + (int)Buf1[4];
> // 制御実行
> switch(Direction) // 方向チェック
> {
> case 0:
> //MLReverse(MLdata); // 後進の場合
> //MRReverse(MRdata);
> LED_G=1;
> delay_ms(5);
> //LED_G=0;
> //delay_ms(500);
> break;
> case 1:
> //MLFeed(MLdata); // 前進の場合
> //MRFeed(MRdata);
> LED_W=1;
> delay_ms(5);
> //LED_W=0;
> //delay_ms(500);
> break;
> case 2:
> MLStop(); // 停止の場合
> MRStop();
> LED_R=1; //4 赤LED点灯
> delay_ms(5);
> //LED_R=0; //4 赤LED消灯
> //delay_ms(500);
> break;
> default: break;
> }
> }
> }

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


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


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

- WebForum -