UARTの受信を文字列で出来るようにしたいと考えています。4文字で送信される文字列を、受信側で一文字ずつ受け取り、それを4要素の配列に格納できるようなプログラムを考えているのですが、上手くいきません。送信側から、「R021」のように頭文字プラス三桁の数字が送られてきて、これをreceive[0] = R、receive[1] = 0、receive[1] = 2、receive[2] = 1、のように格納したいのですが、receive[0]に数字が格納されたり、ずれが起きてしまいます。下にプログラムを示すので、どこを修正すればよいのか教えていただけないでしょうか?
判定部分を修正したものを一番下に2つ示します。これも上手くいかなかったのですが、どこがおかしいのか教えていただけないでしょうか?
受信側: 開発環境HEW C言語
送信側: visual studio2019 windows フォームアプリケーション(.NET Framework)
マイコン R8C/33T
UART-シリアル変換モジュールはFT232RL
受信側
c
1void main(void) 2{ 3 volatile int i,j,k; 4 unsigned char c; 5 int numericalR = 0; 6 int numericalG = 0; 7 int numericalB = 0; 8 int ret; 9 char receive[4]; 10 11 init_PWM(); //PWM初期設定(赤、青) 12 timer_rb_init(); //タイマrb初期設定(緑) 13 clock_initial(); //クロック初期設定 14 UART_init(); //UART初期設定 15 16 17 18 19 while(1) 20 { 21 22 23 for(k = 0; k < 4; k++) 24 { 25 26 while( UART_get( &c ) ); // 受信するまで待つ 27 28 ret = UART_get( &c ); // 受信文字があればcに代入 29 30 if(ret == 1) 31 { 32 receive[k] = c; 33 ret = 0; 34 } 35 } 36 37 38 switch(receive[0]) 39 { 40 41 case 'R': 42 43 44 numericalR = 100 * (receive[1] - '0') + 10 * (receive[2] - '0') + (receive[3] - '0'); //数値に変換 45 PWM_red( numericalR ); //デューティー比変更(赤) 46 47 break; 48 49 50 51 case 'G': 52 53 54 numericalG = 100 * (receive[1] - '0') + 10 * (receive[2] - '0') + (receive[3] - '0'); //数値に変換 55 PWM_green( numericalG ); //デューティー比変更(緑) 56 57 break; 58 59 60 61 62 case 'B': 63 64 65 numericalB = 100 * (receive[1] - '0') + 10 * (receive[2] - '0') + (receive[3] - '0'); //数値に変換 66 PWM_blue( numericalB ); //デューティー比変更(青) 67 68 break; 69 70 71 }
UART 一文字受信関数
c
1int UART_get( char *s ) 2{ 3 int ret = 0, data; 4 char c; 5 6 if (ri_u0c1 == 1) //受信データあり? 7 { 8 data = u0rb; 9 *s = (char)data; //bit7~bit0を読み込む 10 ret = 1; 11 12 if( data & 0xf000 ) // エラーあり? 13 { 14 /* エラー時は再設定 */ 15 16 re_u0c1 = 0; //受信禁止 17 te_u0c1 = 0; //送信禁止 18 c = u0mr; 19 u0mr &= 0xf8; //u0mr = u0mr & 0xf8 (シリアルインタフェース無効) 20 u0mr = c; //UARTモード転送データ長8ビット??? 21 re_u0c1 = 1; //受信許可 22 te_u0c1 = 1; //送信許可 23 ret = -1; 24 } 25 } 26 return ret; 27}
送信側 一部
C#
1 2 private void trackBar1_ValueChanged(object sender, EventArgs e) 3 { 4 // TrackBar1の値が変更されたらラベルに表示 5 label1.Text = trackBar1.Value.ToString(); 6 7 8 9 //TrackBarの値を文字列に変換( 10 StringR = "R" + trackBar1.Value.ToString("D3"); 11 12 13 14 //送信 15 mySerialPort.Write(StringR); 16 17 } 18
修正版
c
1`` 2do 3 { 4 do 5 { 6 do 7 { 8 do 9 { 10 while( UART_get( &c ) ); // 受信するまで待つ 11 12 }while(!((c == 'R') || (c == 'G') || (c == 'B')) ); 13 14 15 receive[0] = c; 16 while( UART_get( &c ) ); // 受信するまで待つ 17 18 19 }while(!((c != 'R') && (c != 'G') && (c != 'B'))); 20 21 22 receive[1] = c; 23 while( UART_get( &c ) ); // 受信するまで待つ 24 25 26 }while(!((c != 'R') && (c != 'G') && (c != 'B'))); 27 28 29 receive[2] = c; 30 while( UART_get( &c ) ); // 受信するまで待つ 31 32 33 }while(!((c != 'R') && (c != 'G') && (c != 'B'))); 34 35 36 receive[3] = c;
c
1while(1) 2 { 3 while( UART_get( &a ) ); // 受信するまで待つ 4 5 if( a != 'R' && a != 'G' && a != 'B' ) continue; //aがR、G、Bのどれかでなければ 6 7 8 while( UART_get( &b ) ); // 受信するまで待つ 9 10 if( b == 'R' || b == 'G' || b == 'B' ) continue; //bがR、G、Bのどれかであれば 11 12 13 while( UART_get( &c ) ); // 受信するまで待つ 14 15 16 if( c == 'R' || c == 'G' || c == 'B' ) continue; //cがR、G、Bのどれかであれば 17 18 19 while( UART_get( &d ) ); // 受信するまで待つ 20 21 if( d == 'R' || d == 'G' || d == 'B' ) continue; //dがR、G、Bのどれかであれば 22 23 24 break; 25 } 26 27 receive[0] = a; 28 receive[1] = b; 29 receive[2] = c; 30 receive[3] = d; 31 32 33
回答5件
あなたの回答
tips
プレビュー