掲示板


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

記事No 848
タイトル Re: USART受信プログラム
投稿日 : 2017/03/22(Wed) 15:14:08
投稿者 radio
参照先
先程の投稿から少し進展しましたので、報告します。
データを正しく受信できていない件については、データ受信前に遅延(5msec)を追加することで、
正しく受信ができるようになりました。

⇒この確認は、状態確認用のLEDを用意して確認しました。
(LCD表示がおかしくなっていしまう件は、未解決です…)


↓のコードの状態で、データ照合の所まで進みました。
データを照合し、一致していたらLEDが点滅するようにして、点滅することを確認しました。

しかし、データを1度しか受信してくれません。
while(1)文の中のMotorTest();のプログラムは、無限ループになるのですが、
RadioControl();のプログラムは、データを1度受信したきりになってしまいます。

何が原因なのか分からず困っております。



while(1)
{
// モード読み込み
if(PORTBbits.RB0 == 0) // DIPSW No1 On
MotorTest(); // モータテストモード
else{
RadioControl(); // 無線ラジコンモード
}
}
CloseUSART();
}

/************************************
* モータテスト関数
* 1秒間隔で正転、逆転
************************************/
void MotorTest(void)
{
LED_R^=1;
delay_ms(500); //0.5sec
LED_G^=1;
delay_ms(500); //0.5sec
LED_Y^=1;
delay_ms(500); //0.5sec
LED_W^=1;
delay_ms(500); //0.5sec
}



/*********************************************
*  無線ラジコン処理関数
* Buf1, Buf2に受信データ格納
**********************************************/
void RadioControl(void)
{

char buff1[20]; //LCD 1行目表示データ
//char buff2[20]; //LCD 2行目表示データ

// データ受信と受信データ解析
while (!DataRdyUSART());
RcvData = ReadUSART(); //1文字受信

if(RcvData == 'S') // 'S'受信待ち
{
//LED_W^=1;
delay_ms(10);
//while (!DataRdyUSART());
RcvData = ReadUSART(); //1文字受信
if(RcvData == 'S') // 連続'S'受信待ち
{
//LED_Y^=1;
delay_ms(10);
for (i = 0; i < 5; i++) {
while (!DataRdyUSART());
Buf1[i] = getcUSART();
}
delay_ms(10);
for (i = 0; i < 5; i++) {
while (!DataRdyUSART());
Buf2[i] = ~getcUSART();
}

delay_ms(10);
while (!DataRdyUSART());
RcvData = ReadUSART( ); // 'E'受信
delay_ms(100);
// データ照合とモータ制御
MotorControl();
}
}
}

/***********************************************
* データ照合とモータ制御実行サブ関数
* (無線と赤外線で共用)
* Buf1,Buf2に受信データあり
* M1data,M2dataがモータ速度データ
***********************************************/
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; // 緑LED点滅
delay_ms(500);
LED_G = 0; // 緑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);
break;
case 1: MLFeed(MLdata); // 前進の場合
MRFeed(MRdata);
break;
case 2: MLStop(); // 停止の場合
MRStop();
break;
default: break;
}
}
}

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


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


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

- WebForum -