質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

5回答

9217閲覧

UARTの受信を文字列で出来るようにしたい

Merrifield

総合スコア31

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2020/07/16 02:00

編集2020/07/17 06:33

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2020/07/16 02:11

「受信するまで待つ」で受信した文字を捨てちゃってません?
Merrifield

2020/07/16 02:13

while( UART_get( &c ) ); // 受信するまで待つ ret = UART_get( &c ); // 受信文字があればcに代入 この2文のどちらか必要ないということでしょうか?
fuzzball

2020/07/16 02:31 編集

入れ違いになっちゃってたのでepistemeさん(の回答)におまかせします。
guest

回答5

0

なんかよくわかんないコードです...

C

1 for(k = 0; k < 4; k++) 2 { 3 while( UART_get( &c ) ); // ここで受信した文字は捨てちゃうの? だったらズレるのも無理はない 4 ret = UART_get( &c ); 5 if(ret == 1) 6 { 7 receive[k] = c; 8 ret = 0; 9 } 10 }

投稿2020/07/16 02:09

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Merrifield

2020/07/16 02:12

>> // ここで受信した文字は捨てちゃうの? だったらズレるのも無理はない これはどういう意味でしょうか?そのwhileの部分は、必要ないですか?
episteme

2020/07/16 02:14

ぃゃぃゃぃゃ、受信出来たらcにその受信文字が入ってるんでしょ? それ使ってないやん。空読みしてるやん。
Merrifield

2020/07/16 02:16

while( UART_get( &c ) ); ret = UART_get( &c ); 一文目と二文目のcの値が違っているということですか?
episteme

2020/07/16 02:18 編集

当然違うんちゃいます? UART_get を複数回呼んだんだから。
guest

0

シリアル通信の通信の単位は1バイト、それ以上でも以下でもありません。送信側で4文字まとめて送った、などという情報は通信では伝わらず、単に文字の連続(ストリーム)としてしか扱われません。なので、単純に4文字を受信していると、なにかの拍子に1文字取りこぼしたりすると以降は'123R'として受信してしまうようになるかも知れません。

この場合であれば、

'R''G''B'のいずれかを受信するまで待ち、
受信したら次の文字を受信、これが数字であれば保持、'R''G''B'のいずれかであれば数字の受信開始に戻って、
次の文字を受信、これが数字(2文字目)であれば保持、'R''G''B'であれば数字の受信開始に戻って
次の文字を受信、これが数字(3文字目)であれば保持、'R''G''B'であれば数字の受信開始に戻って
3文字受信できたら数値に変換して以降の処理に渡す

というような構造にしたほうがよろしいかと思います。

通信は、特に手を打っていない限りは何らかのエラーが起こることを想定してプログラムを組まなければいけません。


上記の「通り」に作ったらこんなところでしょうか。まぁ、普通コレ見たらムズムズしますよね。
あと、これはRGBと数字以外の文字を受信しちゃった、という事故に対しては無防備です。

C

1 char c; 2 //'R''G''B'のいずれかを受信するまで待ち 3 do { 4 while (UART_get(&c)) 5 ; 6 receive[0] = c; 7 } while (!(c == 'R' || c == 'G' || c == 'B')); 8 while (1) { 9 //次の文字を受信 10 while (UART_get(&c)) 11 ; 12 if (isdigit(c)) { // isdigit()が使えない環境なら適宜対応 13 //これが数字であれば保持 14 receive[1] = c; 15 } else if (c == 'R' || c == 'G' || c == 'B') { 16 //'R''G''B'のいずれかであれば数字の受信開始に戻って 17 receive[0] = c; 18 continue; //事実上のgoto。この働きでwhile(1)の直後に戻る 19 } 20 //次の文字を受信 21 while (UART_get(&c)) 22 ; 23 if (isdigit(c)) { 24 //これが数字であれば保持(2文字目) 25 receive[2] = c; 26 } else if (c == 'R' || c == 'G' || c == 'B') { 27 //'R''G''B'のいずれかであれば数字の受信開始に戻って 28 receive[0] = c; 29 continue; 30 } 31 //次の文字を受信 32 while (UART_get(&c)) 33 ; 34 if (isdigit(c)) { 35 //これが数字であれば保持(3文字目) 36 receive[3] = c; 37 } else if (c == 'R' || c == 'G' || c == 'B') { 38 //'R''G''B'のいずれかであれば数字の受信開始に戻って 39 receive[0] = c; 40 continue; 41 } 42 break; //ここにたどり着いたということは数字3文字受信したということ 43 }

あまりムズムズしないようにしてみました。

C

1 int n = 0; 2 char c; 3 int err = 0;//エラーがあると0以外になる 4 do { 5 while (UART_get(&c)) ; // 1文字受信 6 if (c == 'R' || c == 'G' || c == 'B') { 7 if(n!=0){ 8 err = 1; 9 } 10 receive[0] = c; 11 n = 1; // RGBを受信したらシーケンス開始 12 } else { 13 if (n > 0 && isdigit(c)) { // isdigit()が使えない環境なら適宜数字の判断を作成 14 receive[n++] = c; 15 } else { //無効な文字を受信したので全面やり直し 16 err = 2; 17 n = 0; 18 } 19 } 20 } while (n < 4);

投稿2020/07/16 02:27

編集2020/07/20 12:03
thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/07/16 02:35

さもなくば y_waiwaiさんの提案どおりケツに改行くっつけて送信し、 受信側では「改行までを受信する」関数を仕立てるか デスヨネー
thkana

2020/07/16 02:44

通信のフォーマットも変えていいならそうですね。とりあえず改行を覚えておくと他でも応用が効くかも知れないけど、気持ち非効率。 いずれにしろ、送ったバイト数だけ受信したら期待どおり格納される、と思っちゃいけないわけで。 (しかし、質問の文章だけ読んで回答書いたのがバレバレな回答になっちゃったなぁ)
Merrifield

2020/07/17 02:13 編集

thkanaさんに教えていただいた通りに作ってみたのですが、上手く動作しないので、どこがおかしいか教えていただけないでしょうか? ``` do { do { do { do { while( UART_get( &c ) ); // 受信するまで待つ }while(!((c == 'R') || (c == 'G') || (c == 'B')) ); receive[0] = c; while( UART_get( &c ) ); // 受信するまで待つ }while(!((c != 'R') && (c != 'G') && (c != 'B'))); receive[1] = c; while( UART_get( &c ) ); // 受信するまで待つ }while(!((c != 'R') && (c != 'G') && (c != 'B'))); receive[2] = c; while( UART_get( &c ) ); // 受信するまで待つ }while(!((c != 'R') && (c != 'G') && (c != 'B'))); receive[3] = c; ```
thkana

2020/07/18 01:03

'R123'を受信したことを想定してプログラムの動作を追ってみてください。 なお、「うまくいかない」とか「動作しない」はプログラミングの質問においてはNGワードと考えたほうがいいです。「こういう期待をしたのに、実際にはこういう結果が得られた」という捉え方をしてください。「うまくいかない」では「間違ってますね」で終わりですが、「こうなった」を捉えていれば「それはなぜ」「ではどうするか」と考えが繋がります。
Merrifield

2020/07/20 01:37

thkanaさん 確かに'R123'のときにも、条件をクリアしてしまいますね。それをふまえて書いてみたのですが、これでプログラム自体は合っていますか。しかし、これでも値がずれてしまいます。ずれがひどくて、そもそもまともに'R042'のようには入ってくれません。UARTの割り込みを使った方法のほうがよいでしょうか?割り込み関数の自作はしたことがないですが、そちらのほうがよい気がしてきました。 while(1) { ret = UART_get( &receive[0] ); // 受信文字があればreceive[0]に代入 if(ret == 1) //受信データあり { if( receive[0] != 'R' && receive[0] != 'G' && receive[0] != 'B' ) continue; //R、G、Bのどれかでなければ ret = 0; } ret = UART_get( &receive[1] ); // 受信文字があればreceive[1]に代入 if(ret == 1)//受信データあり { if( receive[1] != '0' && receive[1] != '1') continue; //R、G、Bのどれかで0と1以外でなければ ret = 0; } ret = UART_get( &receive[2] ); // 受信文字があればreceive[2]代入 if(ret == 1)//受信データあり { if( receive[2] == 'R' || receive[2] == 'G' || receive[2] == 'B' ) continue; //R、G、Bのどれかであれば if(!( receive[1] == '1' && receive[2] == '0') ) continue;//receive[1]が1、rceive[2]で0でなければ ret = 0; } ret = UART_get( &receive[3] ); // 受信文字があればreceive[3]代入 if(ret == 1)//受信データあり { if( receive[3] == 'R' || receive[3] == 'G' || receive[3] == 'B' ) continue; //R、G、Bのどれかであれば if(!( receive[1] == '1' && receive[2] == '0' && receive[3] == '0') ) continue; //receive[1,2,3]が1 0 0でなければ ret = 0; break; }
Merrifield

2020/07/20 01:48

thkanaさん 今気づいたのですが、追記でコードを書いてくださったのですね。ありがとうございます。 >>上記の「通り」に作ったらこんなところでしょうか。まぁ、普通コレ見たらムズムズしますよね。 そうですね。 >>あと、これはRGBと数字以外の文字を受信しちゃった、という事故に対しては無防備です。 確かにそうですし、また、最後に'R055'送信したのに、その前に送っていたのといろいろ組み合わさって'R035'みたいにずれても、条件を突破してしまう気がします。
Merrifield

2020/07/20 02:01 編集

自分のプログラムを今みたら、間違えていますね。100でないと条件を突破しないようになっていますね。別の方法で考えてみます。
Merrifield

2020/07/20 06:06 編集

thkanaさん 連続ですみません。下の書き方で上手く出来ました。いろいろアドバイスを頂き、ありがとうございました。 while(1) { while( 1 ) { ret = UART_get( &c ); if( ret == 1 ) { receive[i]=c; i++; if(i > 3)i=0; } }
thkana

2020/07/20 11:57

それでうまくいったというのならいいのですけれど... どこかで例えばノイズでエラーで一文字とりこぼして 'R001G02B003R004' となった時にどういう結果が得られるでしょう。 > RGBと数字以外の文字を受信しちゃった というのは、 'R001G02aB003' とかいうデータを受信してしまったときにどう振る舞うか、という話です。プログラムの目的によって対応はいろいろかと思いますが。 笑ってリセットかければいい、ということならそれはそれですけど。
Merrifield

2020/07/20 13:11

今回は、課題みたいな感じでやっていたことなので、あまり細かいことはところまで求められていないと思いますが、ノイズ等のエラーが起きたときや文字の格納がずれたときの処理までは出来ていないですね。これからのことも考えて、thkanaさんから頂いたコメントは参考にさせていただきます。
guest

0

自己解決

これで上手くいきました。ご回答くださった皆さんありがとうございました。

c

1 while(1) 2 { 3 4 5 while( 1 ) 6 { 7 ret = UART_get( &c ); 8 if( ret == 1 ) 9 { 10 11 12 receive[i]=c; 13 14 i++; 15 16 if(i > 3)i=0; 17 18 19 20 } 21 }

投稿2020/07/20 06:03

編集2020/07/20 06:06
Merrifield

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

※未検証

C

1 2 3char バッファ[4]; 4int バッファに何文字書いたか; 5 6int main(){ 7 while(1){ 8 受信(); 9 // 必要ならdelayいれたり他の処理をする 10 } 11} 12 13void 受信(){ 14 char 受信文字; 15 if(受信しようと試みたけど受信できなかった) 16 return; 17 18 if(受信文字がR,G,Bのどれかだった場合){ 19 バッファの先頭に受信文字を代入 // バッファ[0] = 受信文字 20 return; 21 } 22 23 if(バッファが空で、受信文字がR,G,B以外だった場合){ 24 return; 25 } 26 27 if(バッファに何かしらデータが入っていて、受信文字が数字だった場合){ 28 バッファの末尾に受信文字を代入 // バッファ[バッファに何文字書いたか++] = 受信文字 29 if(バッファが4文字){ 30 バッファの内容に応じた処理をする 31 バッファをクリア // バッファに何文字書いたか = 0 32 } 33 } 34} 35

ちなみに改行区切りの場合は受信()の中身がこんな感じ

C

1if(受信しようと試みたけど受信できなかった) 2 return; 3 4if(受信文字が改行だった){ 5 バッファの内容に応じた処理をする // 決められたフォーマット通りに受信できているかの判定も必要 6 バッファをクリア 7}else{ 8 バッファの末尾に受信文字を追加 9} 10 11// 他にもバッファとして用意した配列の長さを超えても改行が来なかった場合の対処とかも必要

投稿2020/07/17 01:39

編集2020/07/17 06:29
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Merrifield

2020/07/17 01:56

ご回答ありがとうございます。参考にして確認してみます。 また、質問とは関係ないですが、コメントでのコードのブロック化はどのようにやっているのでしょうか?質問文では、出来るのですが、コメントではなぜかできないので。```で囲んでもブロック化しないので。もし、よろしければ、教えてください。
ozwk

2020/07/17 01:58

無理です
Merrifield

2020/07/17 02:04

ありがとうございます
Merrifield

2020/07/17 02:46

バッファが空の場合というのは、バッファ[0]=0ということでしょうか?それだと、0が送られてきた場合と被りそうですが。
ozwk

2020/07/17 03:49 編集

そのために「バッファに何文字書いたか」(より正確に言えばバッファの先頭何文字が有効データか)という変数を置いて管理します
guest

0

文字列として受信したいなら(というより複数バイトのデータを読みたいなら)、終端データを決めて、それを区切りに送信するようにしましょう
文字列であれば、改行コードを送ってそれを区切りにすればいいです

#C#で送信するなら、1行送信(Writeline)すればいいだけですね

受信側では、受信文字を貯めていって、改行コードが来れば、今まで貯めた受信データを文字列としてあとの処理に回すようにすればいいです

C

1int rxcnt=0; 2char rxbff[32]; 3 4int rxstr(void) 5{ 6 int ch=UART_get(); 7 if(ch==0) return 0; 8 if(rxcnt>=(32-1)) rxcnt=0; 9 rxbff[rxcnt]='\0'; 10 if(ch=='\n'){ 11 rxcnt=0; 12 return 1; 13 } 14 rxbff[rxcnt++]=ch; 15 rxbff[rxcnt]='\0'; 16 return 0; 17} 18 19int main(void) 20{ 21 ... 22 while(1){ 23 if(rxstr()){ 24 rxbffに受信文字列が入ってる 25 } 26 .... 27} 28

これでわかるかな?

投稿2020/07/16 02:10

編集2020/07/17 08:03
y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Merrifield

2020/07/16 02:23

ご回答ありがとうございます。1行送信(Writeline)というのが何なのか分からないですが、調べてから試してみます。
Merrifield

2020/07/17 01:48

これって文字で判定するのと改行コードで判定するのは、なにが違うのでしょうか? また、改行コードの付け方は↓で合っていますよね。 StringG += System.Environment.NewLine;
Merrifield

2020/07/17 01:51

受信側のコードは、こんな感じです。これだと上手くいかなかったです。改行コードでの判定と文字での判定の違いが分からなかったのですが、なにか勘違いしていますでしょうか? ``` while(1) { while( UART_get( &a ) ); // 受信するまで待つ if( a != 'R' && a != 'G' && a != 'B' ) continue; //aがR、G、Bのどれかでなければ while( UART_get( &b ) ); // 受信するまで待つ if( b == 'R' || b == 'G' || b == 'B' ) continue; //bがR、G、Bのどれかであれば while( UART_get( &c ) ); // 受信するまで待つ if( c == 'R' || c == 'G' || c == 'B' ) continue; //cがR、G、Bのどれかであれば while( UART_get( &d ) ); // 受信するまで待つ if( d == 'R' || d == 'G' || d == 'B' ) continue; //dがR、G、Bのどれかであれば while( UART_get( &e ) ); // 受信するまで待つ if(e != '\n' ) continue; //eが改行コードでなければ break; } receive[0] = a; receive[1] = b; receive[2] = c; receive[3] = d; ```
y_waiwai

2020/07/17 01:52

どっちも同じです 改行コードで判定するほうが、1行受信として汎用的に使えます どーせ作るなら、改行コードで作りましょう。 先頭がRのときにどーこーするコードを組んでしまったら、文字数増やしたいとき、別のコマンド文字使おうとするとき、わざわざ受信ルーチンを修正せんといけませんよね。 改行コードという前提で作ってしまえば、文字列の後処理でこの全てが対応できるようになりますよ
y_waiwai

2020/07/17 01:56

たとえば、16文字分の配列を作っておいて、シリアル受信したら、その配列に順番に格納していけばいいだけです。 そして、改行コードが来たら、その配列の内容を文字列として処理するようにしましょう。 シリアル受信の段階で、データ内容がどーとか何文字目か、を気にする必要はありません 改行かどうかだけ判定しましょう
Merrifield

2020/07/17 01:57

コードを作るときに、汎用的に、という考え方が大事なのですね。ありがとうございます。
Merrifield

2020/07/17 02:00

ありがとうございます。それでコードを作って確認してみます。
Merrifield

2020/07/17 05:46

配列に順番に詰めていくというのが難しいんですよね。その時点でずれが出てしまうので。 receive[0] = R receive[1] = 1 receive[2] = \n receive[3]= 0 receive[4]= 4 こんな感じでずれてしまいます。
dodox86

2020/07/17 06:16

なんでズレてしまうのか。こじれてますね。他回答者さんからもアドバイスいただいた応用で、「'\n'(改行)を受信するまでの受信長」を管理していればズレるはずがないのですが。
Merrifield

2020/07/17 08:23

y_waiwaiさん >>if(ch=='\n'){ この部分ですが、ch=UART_get();で、UART_get()関数は、戻り値を、受信なし/あり/エラーを0か1か-1で返すだけなので、chに\nが入ることはないのではないでしょうか。
y_waiwai

2020/07/17 08:27

まあ、受信文字を返す関数、と想定してます。 受信文字がない場合は0を返してください。 別の名前の関数でしたほうがよかったでしたかw
Merrifield

2020/07/17 08:31

受信文字が0だとややこしいですよね。まあその部分は、自分で考えます。
y_waiwai

2020/07/17 08:34

まあ、あくまでもサンプルコードということで。 動作確認もしてませんし、テキトーに修正しましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問