関連:
シリアル通信関連記事一覧もう少しでマイコンの遠隔操作ができるようになります。16進数に関する知識が必要となります。
16進数については
2進数と16進数のページを参照してください。
シリアル通信の設定(3)にて送受信フォーマットを決めました。
マイコンの遠隔操作を行うにはもう一つ送受信フォーマットを決めておく必要があります。
それはどんなデータを送るのかという事です。
フォーマットの取り決め
今回は操作情報のみの送受信を行いますが、今後他の情報も送る可能性があります。
そこで、このデータが何の種類のデータかが分かるように先頭にデータの種類を示すIDを付けることにします。
ここで通信フォーマットが以下の様になります。
[ ID 実際のデータ
SUM ]今回は操作情報を送受信したいと思います。操作情報を示す
IDは
0x10としておきます。
受信側でデータ処理がしやすいようにデータ数
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個分のみ送信されたことが分かります。
次回が通信関連の最後の設定です。(たぶん)