回答編集履歴

2

サンプル追加

2020/07/20 12:03

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -123,3 +123,55 @@
123
123
  }
124
124
 
125
125
  ```
126
+
127
+
128
+
129
+ ---
130
+
131
+
132
+
133
+ あまりムズムズしないようにしてみました。
134
+
135
+ ```C
136
+
137
+ int n = 0;
138
+
139
+ char c;
140
+
141
+ int err = 0;//エラーがあると0以外になる
142
+
143
+ do {
144
+
145
+ while (UART_get(&c)) ; // 1文字受信
146
+
147
+ if (c == 'R' || c == 'G' || c == 'B') {
148
+
149
+ if(n!=0){
150
+
151
+ err = 1;
152
+
153
+ }
154
+
155
+ receive[0] = c;
156
+
157
+ n = 1; // RGBを受信したらシーケンス開始
158
+
159
+ } else {
160
+
161
+ if (n > 0 && isdigit(c)) { // isdigit()が使えない環境なら適宜数字の判断を作成
162
+
163
+ receive[n++] = c;
164
+
165
+ } else { //無効な文字を受信したので全面やり直し
166
+
167
+ err = 2;
168
+
169
+ n = 0;
170
+
171
+ }
172
+
173
+ }
174
+
175
+ } while (n < 4);
176
+
177
+ ```

1

サンプル追記

2020/07/20 12:03

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -23,3 +23,103 @@
23
23
 
24
24
 
25
25
  通信は、特に手を打っていない限りは何らかのエラーが起こることを想定してプログラムを組まなければいけません。
26
+
27
+
28
+
29
+ ---
30
+
31
+
32
+
33
+ 上記の「通り」に作ったらこんなところでしょうか。まぁ、普通コレ見たらムズムズしますよね。
34
+
35
+ あと、これはRGBと数字以外の文字を受信しちゃった、という事故に対しては無防備です。
36
+
37
+ ```C
38
+
39
+ char c;
40
+
41
+ //'R''G''B'のいずれかを受信するまで待ち
42
+
43
+ do {
44
+
45
+ while (UART_get(&c))
46
+
47
+ ;
48
+
49
+ receive[0] = c;
50
+
51
+ } while (!(c == 'R' || c == 'G' || c == 'B'));
52
+
53
+ while (1) {
54
+
55
+ //次の文字を受信
56
+
57
+ while (UART_get(&c))
58
+
59
+ ;
60
+
61
+ if (isdigit(c)) { // isdigit()が使えない環境なら適宜対応
62
+
63
+ //これが数字であれば保持
64
+
65
+ receive[1] = c;
66
+
67
+ } else if (c == 'R' || c == 'G' || c == 'B') {
68
+
69
+ //'R''G''B'のいずれかであれば数字の受信開始に戻って
70
+
71
+ receive[0] = c;
72
+
73
+ continue; //事実上のgoto。この働きでwhile(1)の直後に戻る
74
+
75
+ }
76
+
77
+ //次の文字を受信
78
+
79
+ while (UART_get(&c))
80
+
81
+ ;
82
+
83
+ if (isdigit(c)) {
84
+
85
+ //これが数字であれば保持(2文字目)
86
+
87
+ receive[2] = c;
88
+
89
+ } else if (c == 'R' || c == 'G' || c == 'B') {
90
+
91
+ //'R''G''B'のいずれかであれば数字の受信開始に戻って
92
+
93
+ receive[0] = c;
94
+
95
+ continue;
96
+
97
+ }
98
+
99
+ //次の文字を受信
100
+
101
+ while (UART_get(&c))
102
+
103
+ ;
104
+
105
+ if (isdigit(c)) {
106
+
107
+ //これが数字であれば保持(3文字目)
108
+
109
+ receive[3] = c;
110
+
111
+ } else if (c == 'R' || c == 'G' || c == 'B') {
112
+
113
+ //'R''G''B'のいずれかであれば数字の受信開始に戻って
114
+
115
+ receive[0] = c;
116
+
117
+ continue;
118
+
119
+ }
120
+
121
+ break; //ここにたどり着いたということは数字3文字受信したということ
122
+
123
+ }
124
+
125
+ ```