#include <rxduino.h>#define INTERVAL 100void setup(){Serial.begin(9600);}void loop() { int c; if(Serial.available()>0){ c=Serial.read(); Serial.println(c,DEC); } }
このようなプログラムを作りました。テラターム上で数値を入れて、すの数値を画面に出すプログラムのつもりです。
しかし 1を押すと49、aでは97と出てきます。
この解決法をどなたか教えて頂けないでしょうか。
将来的には、delaytime()の()の部分にPC上から入力したいです。
このプログラムについてはわかりませんが、出力結果はASCIIコード(10進数)に変換されているようですね。
追記:
DECとしているところをBYTEとかに変えてみてはどうでしょうか?
基本的にキーボード入力はASCIIコードになります。
これは、PCの表示系はASCIIコードを使っているから、覚えておいた方がよいですね。
入力がBinary(すの数値)なのか、ASCIIなのか、出力がBinary(すの数値)なのか、ASCIIなのか(要するに仕様)を理解して、それに合わせた処理を作成すべきですかね。
プログラム自体は分かっているのかもしれませんが、一応簡単に説明しておきます。
そんなことわかっているという事であれば、スルーしてください。
'0'~'9'は0x30(48:10進)~0x39(57:10進)、'A'~は0x41(65:10進)~、'a'~は0x71(65:10進)~になります。
C言語の関数では、atoi()関数で変換はできますが、マイコン上では標準ライブラリを使用すると、ROMをたくさん使ってしまうので、データを受取ったマイコンの中でそのデータにあった処理を作れば良いと思いますよ。
例えば、上記のようなデータしかない(英数字のみ)場合は、
#define num_asc_offset (unsigned char)0x30 //'0' = 0x30 'a' = 'A'+0x30 (0x71)
unsigned char rcv_data;
unsigned char num_data;
unsigned char command_code;
if(rcv_data <= '9'){ //to number from ASCII
num_data = rcv_data - num_asc_offset;
}else(rcv_data <= 'A'){ //'a'~'z' <- 'A'~'Z'
command_code = rcv_data + asc_offset;
}
16進にしたいだけなら、aは、『rcv_data -'a' + 0x0a』など、簡単に表現できますよね。
ちなみに、上記処理は、書き殴りなので、バグ有の可能性ありですが、雰囲気だけでも分かればと思って書いています。
ベッカーさん,チョコです。
ASCIIコードの'a'は0x61(97:10進)です。
あっ、そうでした。
ごめんなさい。
お詫びに、動作確認した簡単なコードを載せます。
ご参考にどうぞ。
#define num_asc_offset (unsigned char)0x30 //'0' = 0x30
#define alfh_asc_offset (unsigned char)0x20 //'a' = 'A'+ 0x20 (0x61)
void main(void);
unsigned char Alph_Num(unsigned char);
void main(void)
{
unsigned char com_code[4];
unsigned char number_data;
int i = 0;
com_code[i++] = Alph_Num('A');
com_code[i++] = Alph_Num('b');
com_code[i] = Alph_Num('3');
unsigned char Alph_Num(unsigned char rcv_data)
unsigned char ret_code;
ret_code = num_data;
}else if(rcv_data <= 'A'){ //'a'~'z' <- 'A'~'Z'
command_code = rcv_data + alfh_asc_offset;
ret_code = command_code;
}else{
ret_code = rcv_data;
return(ret_code);