質問編集履歴

2

プログラム追記

2018/05/15 09:16

投稿

Hiroyadesu
Hiroyadesu

スコア14

test CHANGED
File without changes
test CHANGED
@@ -20,4 +20,528 @@
20
20
 
21
21
 
22
22
 
23
+
24
+
25
+
26
+
27
+ コードの追記します。Arduinoでひらがな、アルファベットを判別し、その文字に対応してLEDを点滅させようと考えています。ひらがなが3バイトの16進数でそれを受け取るために、str[]はunsigned char 型を使用しています。
28
+
29
+
30
+
31
+ ライブラリの方で、送信した16進数のstr2のみを10進数変換し、その値により、処理を分岐させようと考えています。見辛いとは思いますが、どなたか教えていただければ幸いです。
32
+
33
+
34
+
35
+ ```Arduino
36
+
37
+ #include "NTP.h"
38
+
39
+
40
+
41
+ //extern const BRAILLE[10][7];
42
+
43
+ extern const short int BRAILLE[10][7];
44
+
45
+ unsigned char str[6] = {};
46
+
47
+ unsigned char get_char;
48
+
49
+ int flag = 0;
50
+
51
+ int flag_func = 0;
52
+
53
+
54
+
55
+ void setup() {
56
+
57
+
58
+
59
+ // put your setup code here, to run once:
60
+
61
+ Serial.begin(9600);
62
+
63
+ pinMode(13,OUTPUT);
64
+
65
+ pinMode(12,OUTPUT);
66
+
67
+ pinMode(11,OUTPUT);
68
+
69
+ pinMode(10,OUTPUT);
70
+
71
+ pinMode(9,OUTPUT);
72
+
73
+ pinMode(8,OUTPUT);
74
+
75
+ }
76
+
77
+
78
+
79
+ void loop() {
80
+
81
+
82
+
83
+ //ここでtest関数の動作確認を今はしています。
84
+
85
+ if(flag_func<1){
86
+
87
+ str[1] = 81;
88
+
89
+ str[2] = 82;
90
+
91
+ test(str[0], str[1], str[2], str[3], str[4], str[5]);
92
+
93
+ flag_func++;
94
+
95
+ }
96
+
97
+
98
+
99
+ // put your main code here, to run repeatedly:
100
+
101
+ if(Serial.available() > 0){ //値が送信されて来た場合
102
+
103
+ flag++;
104
+
105
+ get_char = Serial.read();
106
+
107
+ Serial.println(get_char,HEX);
108
+
109
+
110
+
111
+
112
+
113
+ if(str[0] == 0 && get_char == 0xE3){ //受け取り文字がひらがな(3バイト)の場合
114
+
115
+ str[0] = get_char;
116
+
117
+ get_char = 0;
118
+
119
+ } else if(str[0] == 0 && str[1] == 0 && str[2] == 0 && get_char != 0xE3){ //受け取り文字がアルファベット(1バイト)の場合
120
+
121
+ str[0] = 1;
122
+
123
+ str[1] = 1;
124
+
125
+ str[2] = get_char;
126
+
127
+ }
128
+
129
+
130
+
131
+ else if(str[0] != 0 && str[2] != 0 && get_char == 0xE3){
132
+
133
+ str[3] = get_char;
134
+
135
+ get_char = 0;
136
+
137
+ }else if(str[0] != 0 && str[2] != 0 && str[3] == 0 && str[4] == 0 && get_char != 0xE3){
138
+
139
+ str[3] = 1;
140
+
141
+ str[4] = 1;
142
+
143
+ str[5] = get_char;
144
+
145
+ }
146
+
147
+
148
+
149
+ if(str[0] == 0xE3){ //ひらがなを受け取っている場合
150
+
151
+ if(str[1] == 0){
152
+
153
+ str[1] = get_char;
154
+
155
+ }else if(str[2] == 0){
156
+
157
+ str[2] = get_char;
158
+
159
+ }
160
+
161
+ }
162
+
163
+
164
+
165
+
166
+
167
+ if(str[3] == 0xE3){ //ひらがなを受け取っている場合
168
+
169
+ if(str[4] == 0){
170
+
171
+ str[4] = get_char;
172
+
173
+ }else if(str[5] == 0){
174
+
175
+ str[5] = get_char;
176
+
177
+ }
178
+
179
+ }
180
+
181
+
182
+
183
+ Serial.println("================");
184
+
185
+ Serial.println("途中経過です");
186
+
23
- どなたか詳しい方がいればお教えいただけませんか。
187
+ for(int i=0;i<6;i++){
188
+
189
+ Serial.print("str");
190
+
191
+ Serial.print(i);
192
+
193
+ Serial.print(" = ");
194
+
195
+ Serial.println(str[i],HEX);
196
+
197
+ }
198
+
199
+ Serial.println("================");
200
+
201
+
202
+
203
+ if(str[0] != 0 && str[5] != 0){ //str配列に2文字以上格納された場合
204
+
205
+ if( //小文字ならば
206
+
207
+ ( str[4] == 0x82 && str[5] == 0x83) //「ゃ」の文字コード
208
+
209
+ || ( str[4] == 0x82 && str[5] == 0x85) //「ゅ」の文字コード
210
+
211
+ || ( str[4] == 0x82 && str[5] == 0x87) //「ょ」の文字コード
212
+
213
+ ){
214
+
215
+ Serial.println("小文字です。str[0]~str[5]の文字コードを比較して出力します");
216
+
217
+ digitalWrite(12,HIGH);
218
+
219
+ digitalWrite(9,HIGH);
220
+
221
+ delay(2000);
222
+
223
+ digitalWrite(12,LOW);
224
+
225
+ digitalWrite(9,LOW);
226
+
227
+ delay(1000);
228
+
229
+
230
+
231
+ //文字参照
232
+
233
+ //test();
234
+
235
+ //test(str[0], str[1], str[2], str[3], str[4], str[5]);
236
+
237
+
238
+
239
+ for(int i=0;i<6;i++){
240
+
241
+ str[i] = 0;
242
+
243
+ }
244
+
245
+ } else if(str[0] == 1 && str[1] == 1 ) { //アルファベット(1バイト)ならば
246
+
247
+ Serial.println("アルファベット(1バイト)文字です");
248
+
249
+ digitalWrite(12,HIGH);
250
+
251
+ digitalWrite(11,HIGH);
252
+
253
+ digitalWrite(9,HIGH);
254
+
255
+ digitalWrite(8,HIGH);
256
+
257
+ delay(2000);
258
+
259
+ digitalWrite(12,LOW);
260
+
261
+ digitalWrite(11,LOW);
262
+
263
+ digitalWrite(9,LOW);
264
+
265
+ digitalWrite(8,LOW);
266
+
267
+ delay(1000);
268
+
269
+ str[0] = str[3];
270
+
271
+ str[1] = str[4];
272
+
273
+ str[2] = str[5];
274
+
275
+ str[3] = 0;
276
+
277
+ str[4] = 0;
278
+
279
+ str[5] = 0;
280
+
281
+ } else {
282
+
283
+ Serial.println("大文字です");
284
+
285
+ digitalWrite(13,HIGH);
286
+
287
+ digitalWrite(10,HIGH);
288
+
289
+ delay(2000);
290
+
291
+ digitalWrite(13,LOW);
292
+
293
+ digitalWrite(10,LOW);
294
+
295
+ delay(1000);
296
+
297
+ str[0] = str[3];
298
+
299
+ str[1] = str[4];
300
+
301
+ str[2] = str[5];
302
+
303
+ str[3] = 0;
304
+
305
+ str[4] = 0;
306
+
307
+ str[5] = 0;
308
+
309
+ }
310
+
311
+ }
312
+
313
+
314
+
315
+ } else if(str[0] != 0 && str[1] != 0 && str[2] != 0 && str[3] == 0 && flag > 0){ //最後の文字出力
316
+
317
+ digitalWrite(11,HIGH);
318
+
319
+ digitalWrite(12,HIGH);
320
+
321
+ digitalWrite(13,5);
322
+
323
+ digitalWrite(8,HIGH);
324
+
325
+ digitalWrite(9,HIGH);
326
+
327
+ digitalWrite(10,HIGH);
328
+
329
+ delay(2000);
330
+
331
+ digitalWrite(11,LOW);
332
+
333
+ digitalWrite(12,LOW);
334
+
335
+ digitalWrite(13,LOW);
336
+
337
+ digitalWrite(8,LOW);
338
+
339
+ digitalWrite(9,LOW);
340
+
341
+ digitalWrite(10,LOW);
342
+
343
+ delay(1000);
344
+
345
+ Serial.println("================");
346
+
347
+ Serial.println("最後の文字です!おめでとう!");
348
+
349
+ for(int i=0;i<6;i++){
350
+
351
+ Serial.print("str");
352
+
353
+ Serial.print(i);
354
+
355
+ Serial.print(" = ");
356
+
357
+ Serial.println(str[i],HEX);
358
+
359
+ }
360
+
361
+ Serial.println("================");
362
+
363
+
364
+
365
+ Serial.println("1文字出力です");
366
+
367
+ Serial.print("flag = ");
368
+
369
+ Serial.println(flag);
370
+
371
+ flag = 0;
372
+
373
+ str[0] = 0;
374
+
375
+ str[1] = 0;
376
+
377
+ str[2] = 0;
378
+
379
+ str[3] = 0;
380
+
381
+ str[4] = 0;
382
+
383
+ str[5] = 0;
384
+
385
+ }
386
+
387
+
388
+
389
+ //バッファに溜まった値をクリア
390
+
391
+ Serial.flush();
392
+
393
+ }
394
+
395
+
396
+
397
+ ```
398
+
399
+
400
+
401
+ 以下ライブラリです。
402
+
403
+ ```Arduino
404
+
405
+ #include "NTP.h"
406
+
407
+
408
+
409
+ const short int BRAILLE[400][7] = {
410
+
411
+ {0,0,0,0,0,0,0},
412
+
413
+ {0,0,0,0,0,0,1},
414
+
415
+ {0,0,0,0,0,1,1},
416
+
417
+ {0,0,0,0,1,1,1}
418
+
419
+ };
420
+
421
+
422
+
423
+ const short int TEST[10][20] = {
424
+
425
+ {0xE3,81,82,0,0,0,100,1,1,0,0,0,0,0,0,0,0,0,0,0}, //「あ」
426
+
427
+ {0xE3,81,84,0,0,0,101,1,1,1,0,0,0,0,0,0,0,0,0,0}, //「い」
428
+
429
+ {0xE3,82,80,0,0,0,102,1,1,0,1,1,1,1,0,0,0,0,0,0}, //「む」
430
+
431
+ {0xE3,82,84,0,0,0,103,1,0,0,1,1,0,0,0,0,0,0,0,0}, //「や」
432
+
433
+ {0xE3,83,86,0,0,0,104,1,1,1,1,1,1,0,0,0,0,0,0,0}, //「テ」
434
+
435
+ {0xE3,83,88,0,0,0,105,1,0,1,1,1,1,0,0,0,0,0,0,0}, //「ト」
436
+
437
+ {1,1,61,0,0,0,200,2,0,0,0,0,1,1,1,0,0,0,0,0}, //「a」
438
+
439
+ {1,1,62,0,0,0,201,2,0,0,0,0,1,1,1,1,0,0,0,0}, //「b」
440
+
441
+ {0xE3,81,0x8d,0,82,85,300,2,0,0,0,1,0,0,1,0,0,1,0,1}, //「きゅ」
442
+
443
+ {0xE3,81,0x8d,0,82,87,301,2,0,0,0,1,0,0,0,1,0,1,0,1} //「きょ」
444
+
445
+ };
446
+
447
+
448
+
449
+ //以下テスト関数です。ここで受け取った16進数のstr2のみを10進数に変換したいです。
450
+
451
+ int test(unsigned char str0, unsigned char str1, unsigned char str2, unsigned char str3, unsigned char str4, unsigned char str5){
452
+
453
+
454
+
455
+ if(str1 == 81 ){
456
+
457
+ Serial.println("str1 = 81 です");
458
+
459
+
460
+
461
+ const char *str = "82";
462
+
463
+
464
+
465
+
466
+
467
+ //str[2]を10進数変換したものをnumに代入(http://marycore.jp/prog/c-lang/convert-binary-octal-decimal-hex-string-to-number/)
468
+
469
+ //long n = strtol("82", NULL, 16); //82が16進数ならば 10進数に変換した値をnに代入
470
+
471
+ long num = strtol(str, NULL, 16);
472
+
473
+ Serial.println(num);
474
+
475
+
476
+
477
+
478
+
479
+ /*
480
+
481
+ BRAILLE[num][0]; //打点数
482
+
483
+ BRAILLE[num][1];
484
+
485
+ BRAILLE[num][2];
486
+
487
+ BRAILLE[num][3];
488
+
489
+ BRAILLE[num][4];
490
+
491
+ BRAILLE[num][5];
492
+
493
+ BRAILLE[num][6];
494
+
495
+ */
496
+
497
+
498
+
499
+ }
500
+
501
+
502
+
503
+ if(str1 == 82){
504
+
505
+ Serial.println("str1 = 82 です");
506
+
507
+ }
508
+
509
+
510
+
511
+ if(str1 == 83){
512
+
513
+ Serial.println("str1 = 83 です");
514
+
515
+ }
516
+
517
+
518
+
519
+ if(str1 == 1){
520
+
521
+ Serial.println("str = 1 です");
522
+
523
+ }
524
+
525
+
526
+
527
+ }
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+ int bra(){
538
+
539
+ //BRAILLE[0][7];
540
+
541
+ Serial.println(BRAILLE[1][6]);
542
+
543
+ }
544
+
545
+
546
+
547
+ ```

1

文章を多少変更しました。

2018/05/15 09:16

投稿

Hiroyadesu
Hiroyadesu

スコア14

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- 上記のプログラムで、unsigned char を const char * に変換させなければいいのはわかってるのですが、方法がわかりません。
19
+ 上記のプログラムで、unsigned char を const char * に変換させなければいいのはわかってるのですが、方法がわかりません。(事情により、必ずunsigned char 型 で宣言する必要があります)
20
20
 
21
21
 
22
22