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

質問編集履歴

2

プログラム追記

2018/05/15 09:16

投稿

Hiroyadesu
Hiroyadesu

スコア14

title CHANGED
File without changes
body CHANGED
@@ -9,4 +9,266 @@
9
9
 
10
10
  上記のプログラムで、unsigned char を const char * に変換させなければいいのはわかってるのですが、方法がわかりません。(事情により、必ずunsigned char 型 で宣言する必要があります)
11
11
 
12
+
13
+
14
+ コードの追記します。Arduinoでひらがな、アルファベットを判別し、その文字に対応してLEDを点滅させようと考えています。ひらがなが3バイトの16進数でそれを受け取るために、str[]はunsigned char 型を使用しています。
15
+
16
+ ライブラリの方で、送信した16進数のstr2のみを10進数変換し、その値により、処理を分岐させようと考えています。見辛いとは思いますが、どなたか教えていただければ幸いです。
17
+
18
+ ```Arduino
19
+ #include "NTP.h"
20
+
21
+ //extern const BRAILLE[10][7];
22
+ extern const short int BRAILLE[10][7];
23
+ unsigned char str[6] = {};
24
+ unsigned char get_char;
25
+ int flag = 0;
26
+ int flag_func = 0;
27
+
28
+ void setup() {
29
+
30
+ // put your setup code here, to run once:
31
+ Serial.begin(9600);
32
+ pinMode(13,OUTPUT);
33
+ pinMode(12,OUTPUT);
34
+ pinMode(11,OUTPUT);
35
+ pinMode(10,OUTPUT);
36
+ pinMode(9,OUTPUT);
37
+ pinMode(8,OUTPUT);
38
+ }
39
+
40
+ void loop() {
41
+
42
+ //ここでtest関数の動作確認を今はしています。
43
+ if(flag_func<1){
44
+ str[1] = 81;
45
+ str[2] = 82;
46
+ test(str[0], str[1], str[2], str[3], str[4], str[5]);
47
+ flag_func++;
48
+ }
49
+
50
+ // put your main code here, to run repeatedly:
51
+ if(Serial.available() > 0){ //値が送信されて来た場合
52
+ flag++;
53
+ get_char = Serial.read();
54
+ Serial.println(get_char,HEX);
55
+
56
+
57
+ if(str[0] == 0 && get_char == 0xE3){ //受け取り文字がひらがな(3バイト)の場合
58
+ str[0] = get_char;
59
+ get_char = 0;
60
+ } else if(str[0] == 0 && str[1] == 0 && str[2] == 0 && get_char != 0xE3){ //受け取り文字がアルファベット(1バイト)の場合
61
+ str[0] = 1;
62
+ str[1] = 1;
63
+ str[2] = get_char;
64
+ }
65
+
66
+ else if(str[0] != 0 && str[2] != 0 && get_char == 0xE3){
67
+ str[3] = get_char;
68
+ get_char = 0;
69
+ }else if(str[0] != 0 && str[2] != 0 && str[3] == 0 && str[4] == 0 && get_char != 0xE3){
70
+ str[3] = 1;
71
+ str[4] = 1;
72
+ str[5] = get_char;
73
+ }
74
+
75
+ if(str[0] == 0xE3){ //ひらがなを受け取っている場合
76
+ if(str[1] == 0){
77
+ str[1] = get_char;
78
+ }else if(str[2] == 0){
79
+ str[2] = get_char;
80
+ }
81
+ }
82
+
83
+
84
+ if(str[3] == 0xE3){ //ひらがなを受け取っている場合
85
+ if(str[4] == 0){
86
+ str[4] = get_char;
87
+ }else if(str[5] == 0){
88
+ str[5] = get_char;
89
+ }
90
+ }
91
+
92
+ Serial.println("================");
93
+ Serial.println("途中経過です");
12
- どなたか詳しい方がいればお教えいただけませんか。
94
+ for(int i=0;i<6;i++){
95
+ Serial.print("str");
96
+ Serial.print(i);
97
+ Serial.print(" = ");
98
+ Serial.println(str[i],HEX);
99
+ }
100
+ Serial.println("================");
101
+
102
+ if(str[0] != 0 && str[5] != 0){ //str配列に2文字以上格納された場合
103
+ if( //小文字ならば
104
+ ( str[4] == 0x82 && str[5] == 0x83) //「ゃ」の文字コード
105
+ || ( str[4] == 0x82 && str[5] == 0x85) //「ゅ」の文字コード
106
+ || ( str[4] == 0x82 && str[5] == 0x87) //「ょ」の文字コード
107
+ ){
108
+ Serial.println("小文字です。str[0]~str[5]の文字コードを比較して出力します");
109
+ digitalWrite(12,HIGH);
110
+ digitalWrite(9,HIGH);
111
+ delay(2000);
112
+ digitalWrite(12,LOW);
113
+ digitalWrite(9,LOW);
114
+ delay(1000);
115
+
116
+ //文字参照
117
+ //test();
118
+ //test(str[0], str[1], str[2], str[3], str[4], str[5]);
119
+
120
+ for(int i=0;i<6;i++){
121
+ str[i] = 0;
122
+ }
123
+ } else if(str[0] == 1 && str[1] == 1 ) { //アルファベット(1バイト)ならば
124
+ Serial.println("アルファベット(1バイト)文字です");
125
+ digitalWrite(12,HIGH);
126
+ digitalWrite(11,HIGH);
127
+ digitalWrite(9,HIGH);
128
+ digitalWrite(8,HIGH);
129
+ delay(2000);
130
+ digitalWrite(12,LOW);
131
+ digitalWrite(11,LOW);
132
+ digitalWrite(9,LOW);
133
+ digitalWrite(8,LOW);
134
+ delay(1000);
135
+ str[0] = str[3];
136
+ str[1] = str[4];
137
+ str[2] = str[5];
138
+ str[3] = 0;
139
+ str[4] = 0;
140
+ str[5] = 0;
141
+ } else {
142
+ Serial.println("大文字です");
143
+ digitalWrite(13,HIGH);
144
+ digitalWrite(10,HIGH);
145
+ delay(2000);
146
+ digitalWrite(13,LOW);
147
+ digitalWrite(10,LOW);
148
+ delay(1000);
149
+ str[0] = str[3];
150
+ str[1] = str[4];
151
+ str[2] = str[5];
152
+ str[3] = 0;
153
+ str[4] = 0;
154
+ str[5] = 0;
155
+ }
156
+ }
157
+
158
+ } else if(str[0] != 0 && str[1] != 0 && str[2] != 0 && str[3] == 0 && flag > 0){ //最後の文字出力
159
+ digitalWrite(11,HIGH);
160
+ digitalWrite(12,HIGH);
161
+ digitalWrite(13,5);
162
+ digitalWrite(8,HIGH);
163
+ digitalWrite(9,HIGH);
164
+ digitalWrite(10,HIGH);
165
+ delay(2000);
166
+ digitalWrite(11,LOW);
167
+ digitalWrite(12,LOW);
168
+ digitalWrite(13,LOW);
169
+ digitalWrite(8,LOW);
170
+ digitalWrite(9,LOW);
171
+ digitalWrite(10,LOW);
172
+ delay(1000);
173
+ Serial.println("================");
174
+ Serial.println("最後の文字です!おめでとう!");
175
+ for(int i=0;i<6;i++){
176
+ Serial.print("str");
177
+ Serial.print(i);
178
+ Serial.print(" = ");
179
+ Serial.println(str[i],HEX);
180
+ }
181
+ Serial.println("================");
182
+
183
+ Serial.println("1文字出力です");
184
+ Serial.print("flag = ");
185
+ Serial.println(flag);
186
+ flag = 0;
187
+ str[0] = 0;
188
+ str[1] = 0;
189
+ str[2] = 0;
190
+ str[3] = 0;
191
+ str[4] = 0;
192
+ str[5] = 0;
193
+ }
194
+
195
+ //バッファに溜まった値をクリア
196
+ Serial.flush();
197
+ }
198
+
199
+ ```
200
+
201
+ 以下ライブラリです。
202
+ ```Arduino
203
+ #include "NTP.h"
204
+
205
+ const short int BRAILLE[400][7] = {
206
+ {0,0,0,0,0,0,0},
207
+ {0,0,0,0,0,0,1},
208
+ {0,0,0,0,0,1,1},
209
+ {0,0,0,0,1,1,1}
210
+ };
211
+
212
+ const short int TEST[10][20] = {
213
+ {0xE3,81,82,0,0,0,100,1,1,0,0,0,0,0,0,0,0,0,0,0}, //「あ」
214
+ {0xE3,81,84,0,0,0,101,1,1,1,0,0,0,0,0,0,0,0,0,0}, //「い」
215
+ {0xE3,82,80,0,0,0,102,1,1,0,1,1,1,1,0,0,0,0,0,0}, //「む」
216
+ {0xE3,82,84,0,0,0,103,1,0,0,1,1,0,0,0,0,0,0,0,0}, //「や」
217
+ {0xE3,83,86,0,0,0,104,1,1,1,1,1,1,0,0,0,0,0,0,0}, //「テ」
218
+ {0xE3,83,88,0,0,0,105,1,0,1,1,1,1,0,0,0,0,0,0,0}, //「ト」
219
+ {1,1,61,0,0,0,200,2,0,0,0,0,1,1,1,0,0,0,0,0}, //「a」
220
+ {1,1,62,0,0,0,201,2,0,0,0,0,1,1,1,1,0,0,0,0}, //「b」
221
+ {0xE3,81,0x8d,0,82,85,300,2,0,0,0,1,0,0,1,0,0,1,0,1}, //「きゅ」
222
+ {0xE3,81,0x8d,0,82,87,301,2,0,0,0,1,0,0,0,1,0,1,0,1} //「きょ」
223
+ };
224
+
225
+ //以下テスト関数です。ここで受け取った16進数のstr2のみを10進数に変換したいです。
226
+ int test(unsigned char str0, unsigned char str1, unsigned char str2, unsigned char str3, unsigned char str4, unsigned char str5){
227
+
228
+ if(str1 == 81 ){
229
+ Serial.println("str1 = 81 です");
230
+
231
+ const char *str = "82";
232
+
233
+
234
+ //str[2]を10進数変換したものをnumに代入(http://marycore.jp/prog/c-lang/convert-binary-octal-decimal-hex-string-to-number/)
235
+ //long n = strtol("82", NULL, 16); //82が16進数ならば 10進数に変換した値をnに代入
236
+ long num = strtol(str, NULL, 16);
237
+ Serial.println(num);
238
+
239
+
240
+ /*
241
+ BRAILLE[num][0]; //打点数
242
+ BRAILLE[num][1];
243
+ BRAILLE[num][2];
244
+ BRAILLE[num][3];
245
+ BRAILLE[num][4];
246
+ BRAILLE[num][5];
247
+ BRAILLE[num][6];
248
+ */
249
+
250
+ }
251
+
252
+ if(str1 == 82){
253
+ Serial.println("str1 = 82 です");
254
+ }
255
+
256
+ if(str1 == 83){
257
+ Serial.println("str1 = 83 です");
258
+ }
259
+
260
+ if(str1 == 1){
261
+ Serial.println("str = 1 です");
262
+ }
263
+
264
+ }
265
+
266
+
267
+
268
+
269
+ int bra(){
270
+ //BRAILLE[0][7];
271
+ Serial.println(BRAILLE[1][6]);
272
+ }
273
+
274
+ ```

1

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

2018/05/15 09:16

投稿

Hiroyadesu
Hiroyadesu

スコア14

title CHANGED
File without changes
body CHANGED
@@ -7,6 +7,6 @@
7
7
  Serial.println(num);
8
8
  ```
9
9
 
10
- 上記のプログラムで、unsigned char を const char * に変換させなければいいのはわかってるのですが、方法がわかりません。
10
+ 上記のプログラムで、unsigned char を const char * に変換させなければいいのはわかってるのですが、方法がわかりません。(事情により、必ずunsigned char 型 で宣言する必要があります)
11
11
 
12
12
  どなたか詳しい方がいればお教えいただけませんか。