シリアル通信について

現在rx65nを使用してadコンバータとi2c通信を行いデータの受信を行うことができました。

そのデータをシリアル通信でpcのcsvに出力するためスマートコンフィグレータを使用しようと思っているのですが

R__Serial_Send

で送ったデータは接続しているpcに送られるということでしょうか?

またその確認方法はpc側のプログラミングが別で必要なのでしょうか?

よろしくお願いします。

Parents
  • たむら さん、こんにちは。NoMaYです。

    つい先日、TB-RX65N等でUART出力するサンプルプログラムを作って投稿したのですが、まだUART出力がうまく出来ないのであれば、そのサンプルプログラムを使ってみてください。(サンプルプログラムではSCI1を使っていますが他のSCIチャンネルへの変更は容易です。)

    TB-RX65N/RX130/RX231+CSplus sample program

    ダウンロード
    japan.renesasrulz.com/cafe_rene/m/sample_program/460

    説明
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/6870/tb-rx65n-rx130-rx231-csplus-sample-program/36947#36947
     

  • NoMaYさん,回答ありがとうございます。

    uart出力はうまくいきました。先にも書いたのですが1バイトは送信できていて
    文字列も
    uint8_t tx_char[12]="HELLO WORLD!";
    このtx_charを12回送信することでテラタームに表示できました。
    次にセンサの値を送信したいのですが文字化けしてうまくいきません。
    その原因が分かれば教えていただきたいです。
    よろしくお願いいたします。
  • TeraTerm 側で表示させるには、センサの数値を文字列へ変換していないといけません。
    例えばA/D変換した結果が「242(0x00F2)」だった場合、文字列として "242" とか "0x00F2" に変換して送信していれば、Teraterm に表示されますが、バイナリの生値 0x00F2 のまま送信しますと tx_char[0]=0xF2 と tx_char[1]=0x00 を送信することとなり、文字化けします。(RX65Nはリトルエンディアンでよかったかな?)
  • プログラミングそのものが初めてだと文字列と数値で良く解らなくなることはしばしばあります。C言語で可能な文字と数値の加算はチョット違和感があるかもしれません。ASCIIで数字やアルファベットが並んでいるのでできることです。

    sprintfは汎用性があり、整数から文字列の変換が明確になるのですがメモリや処理時間を浪費する可能性があります。ヒープの使用もありそうです。

    私の場合は開発時にのみ使うこのような処理は下記のような力技で良しとしてます。動作をチェックしていないのでタイプミスなどがあるかもしれません。
    途中でdata1とdata2が変化しないことを確実にしておかなければなりません。また、16進の場合は一行にいろいろなことを書いているのでブレークポイントを欲しいところに設定できない難点もあります。?:ではなくC言語に不慣れな人でも分かりやすいif・・else・・;を使うことも多くあります。
    アナログ入力の場合はエクセルに取り込んでグラフ化もあるのでほとんどの場合で10進にします。この場合は、コードも単純になるメリットもあります。

    フォーラム参加の方々がどのような手法を使われているのか興味があります。sprintfなどを使われているのでしょうか?


    unsigned int data1;
    unsigned int data2;

    void moni()
    {

      unsigned int string[80];
      unsigned int stringLen;

      // 16進
      string[0]='s';
      string[1]='1';
      string[2]='=';
      string[3]=(((data1/4096)%16)<10)?(((data1/4096)%16)+'0'):(((data1/4096)%16)-10+'A');
      string[4]=(((data1/ 256)%16)<10)?(((data1/ 256)%16)+'0'):(((data1/ 256)%16)-10+'A');
      string[5]=(((data1/  16)%16)<10)?(((data1/  16)%16)+'0'):(((data1/  16)%16)-10+'A');
      string[6]=(((data1     )%16)<10)?(((data1     )%16)+'0'):(((data1     )%16)-10+'A');
      string[7]=' ';
      string[8]='s';
      string[9]='2';
      string[11]='=';
      if(((data2/4096)%16)<10){string[12]=((data2/4096)%16)+'0';}else{string[12]=((data2/4096)%16)-10+'A';};
      if(((data2/ 256)%16)<10){string[13]=((data2/ 256)%16)+'0';}else{string[13]=((data2/ 256)%16)-10+'A';};
      if(((data2/  16)%16)<10){string[14]=((data2/  16)%16)+'0';}else{string[14]=((data2/  16)%16)-10+'A';};
      if(((data2     )%16)<10){string[15]=((data2     )%16)+'0';}else{string[15]=((data2     )%16)-10+'A';};
      string[16]=' ';

      // 10進
      string[17]=' ';
      string[18]='s';
      string[19]='1';
      string[20]='=';
      string[21]=((data1/1000)%10)+'0';
      string[22]=((data1/ 100)%10)+'0';
      string[23]=((data1/  10)%10)+'0';
      string[24]=((data1     )%10)+'0';
      string[25]=' ';
      string[26]='s';
      string[27]='2';
      string[28]='=';
      string[29]=((data2/1000)%10)+'0';
      string[30]=((data2/ 100)%10)+'0';
      string[31]=((data2/  10)%10)+'0';
      string[32]=((data2     )%10)+'0';
      string[33]='\n';

      // いつもよりカッコは多めにつけてます。

      stringLen=34;
      SendSci(string,stringLen);

    }

  • 自分も sprintf は使いませんね。
    また、除算もあまり使いたくない(古い弱い除算器のないマイコンを使っていた時代からのクセで)ので、右シフト(12,8,4ビット)と AND (0x0F と)を使います。16進数専用にはなりますが、10進数への変換は通信相手のPCでさせればよいと割り切っています。
  • MCUがRX65Nなので、ケチケチせずにsprintfや除算をガンガン使っても全然問題ないと思います。

    スレ主さんの技量を推し量ると、標準入出力(STDIO)の低水準関数charput(1文字出力)を実装するのが一番早いと思います。printfで数値の文字変換もできて、シリアル出力までできるようになります。

    スマートコンフィグレータを使っている場合、BSP(Board Support Package)で低水準関数を制御するようになっています。

    参照: RX ファミリ ボードサポートパッケージモジュール Firmware Integration Technology
    文書番号: R01AN1685JJ0552
    「2.7 STDIO とデバッグコンソール」

    簡単に解説すると、スマートコンフィグレータのコンポーネントのところで
    Enable user stdio charput function: User user charput() function
    としてビルドすると、
    (E) E0562310 E0562310:Undefined external symbol "_my_sw_charput_function" referenced in ...
    とリンクエラーになります。
    その後で、
    void my_sw_charput_function(char c)
    {
    // cをシリアル送信
    }
    を自身のソースに作成するだけです。

    スレッドが長くなってきたので、そろそろ別スレッドにして欲しいですね。
  • Higetaka さん 軌道修正ありがとうございます。
    kijo さんの「フォーラム参加の方々がどのような手法を使われているのか興味があります」とのつぶやきに、ついつい反応して、脱線してしまいました。

    Higetaka さんが仰られているとおり、RX65N のスペックなら sprintf 使用が正論ですね。

    sprintf (tx_char, "%5d\n", v); して、6文字送信でいけると思います。
    ※ただし、v は i2c 経由で取得したセンサーデータ(uint16_t 型)。
  • NoMaYさん,kijoさん,回答ありがとうございます。

    返信が遅くなり申し訳ございません。
    sprintfを使用してセンサの値も送れるようにありがとうございました。
    ありがとうございます。
  • 吉光屋さん,Higetakaさん,回答ありがとうございました。

    おっしゃる通りsprintfで送れるようになりました。
    ありがとうございました。
Reply Children
No Data