質問するログイン新規登録

回答編集履歴

2

サンプル追加

2020/07/20 12:03

投稿

thkana
thkana

スコア7738

answer CHANGED
@@ -60,4 +60,30 @@
60
60
  }
61
61
  break; //ここにたどり着いたということは数字3文字受信したということ
62
62
  }
63
+ ```
64
+
65
+ ---
66
+
67
+ あまりムズムズしないようにしてみました。
68
+ ```C
69
+ int n = 0;
70
+ char c;
71
+ int err = 0;//エラーがあると0以外になる
72
+ do {
73
+ while (UART_get(&c)) ; // 1文字受信
74
+ if (c == 'R' || c == 'G' || c == 'B') {
75
+ if(n!=0){
76
+ err = 1;
77
+ }
78
+ receive[0] = c;
79
+ n = 1; // RGBを受信したらシーケンス開始
80
+ } else {
81
+ if (n > 0 && isdigit(c)) { // isdigit()が使えない環境なら適宜数字の判断を作成
82
+ receive[n++] = c;
83
+ } else { //無効な文字を受信したので全面やり直し
84
+ err = 2;
85
+ n = 0;
86
+ }
87
+ }
88
+ } while (n < 4);
63
89
  ```

1

サンプル追記

2020/07/20 12:03

投稿

thkana
thkana

スコア7738

answer CHANGED
@@ -10,4 +10,54 @@
10
10
 
11
11
  というような構造にしたほうがよろしいかと思います。
12
12
 
13
- 通信は、特に手を打っていない限りは何らかのエラーが起こることを想定してプログラムを組まなければいけません。
13
+ 通信は、特に手を打っていない限りは何らかのエラーが起こることを想定してプログラムを組まなければいけません。
14
+
15
+ ---
16
+
17
+ 上記の「通り」に作ったらこんなところでしょうか。まぁ、普通コレ見たらムズムズしますよね。
18
+ あと、これはRGBと数字以外の文字を受信しちゃった、という事故に対しては無防備です。
19
+ ```C
20
+ char c;
21
+ //'R''G''B'のいずれかを受信するまで待ち
22
+ do {
23
+ while (UART_get(&c))
24
+ ;
25
+ receive[0] = c;
26
+ } while (!(c == 'R' || c == 'G' || c == 'B'));
27
+ while (1) {
28
+ //次の文字を受信
29
+ while (UART_get(&c))
30
+ ;
31
+ if (isdigit(c)) { // isdigit()が使えない環境なら適宜対応
32
+ //これが数字であれば保持
33
+ receive[1] = c;
34
+ } else if (c == 'R' || c == 'G' || c == 'B') {
35
+ //'R''G''B'のいずれかであれば数字の受信開始に戻って
36
+ receive[0] = c;
37
+ continue; //事実上のgoto。この働きでwhile(1)の直後に戻る
38
+ }
39
+ //次の文字を受信
40
+ while (UART_get(&c))
41
+ ;
42
+ if (isdigit(c)) {
43
+ //これが数字であれば保持(2文字目)
44
+ receive[2] = c;
45
+ } else if (c == 'R' || c == 'G' || c == 'B') {
46
+ //'R''G''B'のいずれかであれば数字の受信開始に戻って
47
+ receive[0] = c;
48
+ continue;
49
+ }
50
+ //次の文字を受信
51
+ while (UART_get(&c))
52
+ ;
53
+ if (isdigit(c)) {
54
+ //これが数字であれば保持(3文字目)
55
+ receive[3] = c;
56
+ } else if (c == 'R' || c == 'G' || c == 'B') {
57
+ //'R''G''B'のいずれかであれば数字の受信開始に戻って
58
+ receive[0] = c;
59
+ continue;
60
+ }
61
+ break; //ここにたどり着いたということは数字3文字受信したということ
62
+ }
63
+ ```