シリアル通信わかりません。教えてください。 かなりの初心者です

#include <rxduino.h>

#define INTERVAL 100
void 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上から入力したいです。

Parents
  • このプログラムについてはわかりませんが、出力結果はASCIIコード(10進数)に変換されているようですね。

    追記:

    DECとしているところをBYTEとかに変えてみてはどうでしょうか?

Reply
  • このプログラムについてはわかりませんが、出力結果はASCIIコード(10進数)に変換されているようですね。

    追記:

    DECとしているところをBYTEとかに変えてみてはどうでしょうか?

Children
  • 基本的にキーボード入力は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  num_data;

    unsigned char  command_code;

    unsigned char  ret_code;

      if(rcv_data <= '9'){     //to number from ASCII

          num_data = rcv_data - num_asc_offset;  

          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);

    }