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