忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

シリアル通信の設定(6)もう一つの送受信フォーマット

関連:シリアル通信関連記事一覧

もう少しでマイコンの遠隔操作ができるようになります。
16進数に関する知識が必要となります。
16進数については2進数と16進数のページを参照してください。

シリアル通信の設定(3)にて送受信フォーマットを決めました。
マイコンの遠隔操作を行うにはもう一つ送受信フォーマットを決めておく必要があります。
それはどんなデータを送るのかという事です。

フォーマットの取り決め

今回は操作情報のみの送受信を行いますが、今後他の情報も送る可能性があります。
そこで、このデータが何の種類のデータかが分かるように先頭にデータの種類を示すIDを付けることにします。
ここで通信フォーマットが以下の様になります。
[ ID 実際のデータ SUM ]
今回は操作情報を送受信したいと思います。操作情報を示すID0x10としておきます。
受信側でデータ処理がしやすいようにデータ数DLCも追加しておきます。
[ ID DLC 実際のデータ SUM ]
文字列を送りたい時はID 0x00を使うことにします。

続いて送りたいデータを決めます。
PWMを使って装置を比例制御したい場合、比例信号が必要になります。
SH7125にはアナログポートが8ポートあるので、とりあえず8軸分のAD値を送っておきます。
スイッチ信号も必要となるので、スイッチ信号も送ることにします。
内部状態も送っておきましょう。
そこで、通信内容を以下の様にします
すべて1バイト(0~255:0x00~0xFF)とし、これを16進数の2文字で表記します
とりあえずこれらを並べると以下の様になります。

送りたいデータは10バイト分(文字数だと20バイト)となりました。
実際にはこれにSTX、ETX、SUM、ID、DLCが付きます。



このフォーマットに従ってプログラムを作成します。

送信関数

このフォーマット通りに送信する関数を作成します。
ID、DLC、データ列を送ると上記フォーマットに並べて送信する関数とします。

<設定>
void send_data_sci1(int id,int dlc,short*data){
    char trans_buf[255];
    char temp_buf[10];
    int i;

    if(id>255)    return;    //IDがおかしいので終了
    if(id<0)    return;
    if(dlc<0)    return; //DLCがおかしいので終了
    if(dlc>100)    return;

    sprintf(trans_buf,"%02X%02X",id,dlc);  //IDとDLCを記述

    for(i=0;i<dlc;i++){
        sprintf(temp_buf,"%02X",(unsigned char)(data[i]&0xFF));    //データ1つ分を文字列化
        strcat(trans_buf, temp_buf);    //文字列を連結
    }

    write_sci1_sum(trans_buf);    //SUM付きで送信
}

<解説>
関数はintSCI.c内に作成します。
IDがおかしい場合とDLCがおかしい場合は関数を実行せずに終了する仕様にしました。

"%02X",(unsigned char)(data[i]&0xFF)部分はフォーマットが崩れないようにする対策です。
受け渡すdataはshort型としてあります。
16進数2桁で表示できる範囲は0~255です
これに対してshort型の範囲は-327608~+32767です。
dataに0~255を超える範囲の値が入力されていた場合、表示桁数が最大4桁になる可能性がありフォーマットが崩れてしまいます。
そこで表示範囲が0~255(unsigned char型の範囲)と一致するように数字の切り出し変数型式の調整を行っています。

strcatは文字列に文字列を追加(連結)する関数です。
strcat(trans_buf, temp_buf)だとtrans_bufの後ろにtemp_bufが追加されます。

この関数を使って送信を行ってみます。

メイン処理を以下とします。
<設定>
#include "iodefine.h"
#include <stdio.h>
#include "io_setup.h"
#include "intSCI.h"

void main(){
    short data[16]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};

    hardware_setup();                    //汎用IOの初期化
    init_SCI1();                        //シリアル通信1の初期化

    send_data_sci1(0x10,10,data);        //専用フォーマットでデータ送信

    while(1){                                //無限ループ開始
    }//end while
}//end main
<解説>
データはshort型で16個用意してありますが、DLCを10としたため先頭10個分しか送信されません。

TMZで受信すると
[100A00010203040506070809BF]
となります。
00~09までの10個分のみ送信されたことが分かります。

次回が通信関連の最後の設定です。(たぶん)
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント