STM32G031でRS-485パケットで超音波距離センサーの値を読み込みたい(センサー側


x まだ試していない 確認ずみ2022/5/14 21:08

x ピン数の関係上　RS-485デバッグ用モニターを優先



目的
RS-485で上り下りの実現
複数話になる
どこまで行けるかわからないが作ってみよう
ちなみにデータが4バイトなのは、STM32は、32ビットだから
アドレスが1バイトなのは、RS-485は、電気的に32台しか繋がらないから


ピンの割り付け こんなもんど　どたー　どやさん　は、「西野七瀬」
RS485の切り替えを自動にするか手動にするか悩むところ
自動は、
一番簡単なのは、RC回路
タイマーIC555によるワンショットトリガー


1 500kbps RX
2 VDD
3 GND
4 リセット

8 500kbps TX
7 (後で切り替え?)
6 超音波距離センサー エコー
5 超音波距離センサー トリガー



アナログサーボのデジタル化のプログラムをそのまま転用
ser_500kbps_HC-SR04_031_1とする

マスター(コマンダー(司令官))からの
レコードは、仮に

第一バイト　ヘッダー
第二バイト　アドレス
第七バイト　チェックサム
第八バイト　フッター

0x00 0x40 0x00 0x00 : 0x00 0x00 0x3F 0xFF

アドレスと空のデータ

センサーからの戻りは、

0x00 0xC0 0x00 0x00 : 0x00 0x8c 0x4B 0xFF


アドレスの対は、

40  →  C0
50  →  D0
60  →  E0
70  →  F0



![o_con436.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/12324bea-f187-0b38-c541-7db3170d1eb8.jpeg)



![o_con439.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/312368bf-4873-5744-9543-1c55206174c1.jpeg)


![o_con440.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ec08fa37-da4d-40f8-5c78-459058344252.jpeg)



![o_con483.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3c3006c8-6211-c154-0c06-415e04f053dc.jpeg)




値が800に固定されるバグの修正　pinModeの抜け


```c++



//ser_500kbps_HC-SR04_031_1

#include <Arduino.h>

// tx PA14(PB6) 8PIN
// rx PC14(PB7) 1PIN

#define  header   0x00
#define  address  0x40
#define  data1    0x00
#define  data2    0x00

#define  data3    0x00
#define  data4    0x00
#define  Checksum 0x00
#define  footer   0xff


void pc_putc(char ch){

  int ii;           //カウンター
  char out_buff[8]; //バッファー

  //バケットに値を設定
  // packet move
  out_buff[1 - 1] = 0x00; //header
  out_buff[2 - 1] = 0x7f; //address
  out_buff[3 - 1] = 0x00; //data1  zero Fixed
  out_buff[4 - 1] = 0x00; //data2  zero Fixed

  out_buff[5 - 1] = 0x00; //data3  zero Fixed
  out_buff[6 - 1] = ch;  //data4 pwm  Angle of rotation 0to255
  out_buff[7 - 1] = 0x00; //Checksum
  out_buff[8 - 1] = 0xff; //footer

  //チェックサムの計算
  //Checksum
  int chk = 0;
  for (ii = 0; ii < 8; ii++) {
    chk = chk + out_buff[ii];
  }//for
  out_buff[7 - 1] = chk & 0xff;

  //送信処理
  //send 8 byte
  delay(1);
  for (ii = 0; ii < 8; ii++) {
    Serial.write(out_buff[ii]);
  }//for
  delay(1);

} //pc_putc


//文字列の表示
int pc_printf(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    pc_putc(*str1 ++);

  } //while

  //戻り値
  return (0);
}//pc_printf



void ultrasound_reply(char id,char ch){

  int ii;           //カウンター
  char out_buff[8]; //バッファー

  //バケットに値を設定
  // packet move
  out_buff[1 - 1] = 0x00; //header
  out_buff[2 - 1] = 0xc0+id; //address
  out_buff[3 - 1] = 0x00; //data1  zero Fixed
  out_buff[4 - 1] = 0x00; //data2  zero Fixed

  out_buff[5 - 1] = 0x00; //data3  zero Fixed
  out_buff[6 - 1] = ch;   //data4  zero Fixed
  out_buff[7 - 1] = 0x00; //Checksum
  out_buff[8 - 1] = 0xff; //footer

  //チェックサムの計算
  //Checksum
  int chk = 0;
  for (ii = 0; ii < 8; ii++) {
    chk = chk + out_buff[ii];
  }//for
  out_buff[7 - 1] = chk & 0xff;

  //送信処理
  //send 8 byte
  delay(1);
  for (ii = 0; ii < 8; ii++) {
    Serial.write(out_buff[ii]);
  }//for
  delay(1);

} //ultrasound_reply


int u_key;      // 受信データを格納するchar型の変数
int ch_in_key() {

  // 受信データがあった時だけ、処理を行う
  while (!Serial.available()) {}      // 受信データがあるか？
  u_key = Serial.read();            // 1文字だけ読み込む

  return (u_key);
}


//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

byte b = 200; // ((s-140)*10)+200 -> 800

#define TRIG PA11
#define ECHO PA12

unsigned long times; //測定時間
int distance;        //長さ


//初期化処理
void setup() {

  delay(3000); //not Delete


  Serial.begin( 500000 ); // シリアル通信の速度を500000bpsにする。

  //超音波距離センサーのポートの設定
  pinMode(TRIG, OUTPUT); digitalWrite(TRIG, LOW);
  pinMode(ECHO, INPUT);

} //setup


//メインループ
void loop() {

  int ii;           //カウンター
  int pp;           //ポジション
  char out_buff[8]; //バッファー
  int chk;             //チェックサム
  char read_record[8];
  char x;          //一時領域

  char c_hex[] = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  };

  //b = 200; //debug 2022/5/22

  //pc_printf("<ST>");

  while (1) {

    //第一バイト目
    //ヘッダー
    x = (char)ch_in_key();
    read_record[1 - 1] = x;
    if (x != header ) break;

    //第二バイト目
    //アドレス
    x = (char)ch_in_key();
    read_record[2 - 1] = x;
    if (x != address ) break;

    //第三バイト目
    //データの1
    x = (char)ch_in_key();
    read_record[3 - 1] = x;
    if (x != data1 ) break;

    //第四バイト目
    //データの2
    x = (char)ch_in_key();
    read_record[4 - 1] = x;
    if (x != data2 ) break;

    //第五バイト目
    //データの3
    x = (char)ch_in_key();
    read_record[5 - 1] = x;
    if (x != data3 ) break;

    //第六バイト目
    //データの4
    x = (char)ch_in_key();
    read_record[6 - 1] = x;
    if (x != data4 ) break;

    //第七バイト目
    //チェックサム
    x = (char)ch_in_key();
    read_record[7 - 1] = x;

    //チェックサムの計算
    //Checksum
    //read_record[1 - 1] = 0x00;
    //read_record[2 - 1] = 0x10;
    //read_record[3 - 1] = 0x00;
    //read_record[4 - 1] = 0x00;

    //read_record[5 - 1] = 0x00;
    //read_record[6 - 1] = 0x12;
    read_record[7 - 1] = 0x00;
    read_record[8 - 1] = 0xff;
    chk = 0;
    for (ii = 0; ii < 8; ii++) {
      chk = chk + read_record[ii];
    }//for
    read_record[7 - 1] = chk & 0xff;

    //チェックサムの処理　八バイト目はFFで固定　チェックサム自身は、00
    if (x != (chk & 0xff) ) break;


    //第八バイト目
    //フッター
    x = (char)ch_in_key();
    read_record[8 - 1] = x;
    if (x !=  footer ) break;



    //オールクリア
    //pc_printf("<OK>");
    //pc_printf("\r\n");


//超音波のデータの送り処理

    //マスターへの返信処理
    ultrasound_reply(0,b);

/*
    //デバッグ用出力に送信
    x=b;
    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);
    pc_printf("\r\n");
*/

    //超音波の測定処理


  //PB7  入力
  //PA12 出力
  //RX  PA11  11ピン G031
  //TX  PA0    4ピン G031

  //ソフトウェアシリアルから距離を出力
  //putcNS(b);


  // 超音波を発生させる
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);


  // 超音波を受け取る
  times = pulseIn(ECHO, HIGH,2000000);
  //times = (unsigned long)(7700/2); //debug 650cm
  //times = 1177;//debug 1ms 20.0cm
  //times = 942;//debug 1ms 16.0cm

  //distance = (int)(times * 0.017);
  distance = (int)((times * ((unsigned long)(17))) / 100);
  //distance = 321; //debug

  //レンジ圧縮をして8ビット(256)に収める
  //60mm から　200mmまでは、1mm単位
  //60mm = 0 , 200mm = 140
  //200mm から　800mmまでは、1cm単位
  //200mm =140 ,  800mm = 200

  //オーバーの値を丸める
  if( distance >= 800 ){ distance = 800;}
  if( distance <= 60  ){ distance = 60 ;}

  // 200mmより　小さいか?
  if ( distance <= 199 ) {

  b = distance - 60;

  } else {

  b = (byte)( DIV10(distance) -20 + 140 );//DIV10(x)==x/10
  
  }//endif

  //b = 200;//debug
  //b = '0';//debug

    break;

  }//while

  //pc_printf("<ST>");

  //delay(1000);

} //loop




```





超音波組み込み　バグ、デバグで値が固定になっているかも　pinModeも抜けてた


![o_con482.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2d47331d-e36b-a962-497c-d08387889c72.jpeg)


![o_con484.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9e3b0915-c461-d805-3607-fb2e9ac2eb5f.jpeg)



```c++





//ser_500kbps_HC-SR04_031_1

#include <Arduino.h>

// tx PA14(PB6) 8PIN
// rx PC14(PB7) 1PIN

#define  header   0x00
#define  address  0x40
#define  data1    0x00
#define  data2    0x00

#define  data3    0x00
#define  data4    0x00
#define  Checksum 0x00
#define  footer   0xff


void pc_putc(char ch){

  int ii;           //カウンター
  char out_buff[8]; //バッファー

  //バケットに値を設定
  // packet move
  out_buff[1 - 1] = 0x00; //header
  out_buff[2 - 1] = 0x7f; //address
  out_buff[3 - 1] = 0x00; //data1  zero Fixed
  out_buff[4 - 1] = 0x00; //data2  zero Fixed

  out_buff[5 - 1] = 0x00; //data3  zero Fixed
  out_buff[6 - 1] = ch;  //data4 pwm  Angle of rotation 0to255
  out_buff[7 - 1] = 0x00; //Checksum
  out_buff[8 - 1] = 0xff; //footer

  //チェックサムの計算
  //Checksum
  int chk = 0;
  for (ii = 0; ii < 8; ii++) {
    chk = chk + out_buff[ii];
  }//for
  out_buff[7 - 1] = chk & 0xff;

  //送信処理
  //send 8 byte
  delay(1);
  for (ii = 0; ii < 8; ii++) {
    Serial.write(out_buff[ii]);
  }//for
  delay(1);

} //pc_putc


//文字列の表示
int pc_printf(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    pc_putc(*str1 ++);

  } //while

  //戻り値
  return (0);
}//pc_printf



void ultrasound_reply(char id,char ch){

  int ii;           //カウンター
  char out_buff[8]; //バッファー

  //バケットに値を設定
  // packet move
  out_buff[1 - 1] = 0x00; //header
  out_buff[2 - 1] = 0xc0+id; //address
  out_buff[3 - 1] = 0x00; //data1  zero Fixed
  out_buff[4 - 1] = 0x00; //data2  zero Fixed

  out_buff[5 - 1] = 0x00; //data3  zero Fixed
  out_buff[6 - 1] = ch;   //data4  zero Fixed
  out_buff[7 - 1] = 0x00; //Checksum
  out_buff[8 - 1] = 0xff; //footer

  //チェックサムの計算
  //Checksum
  int chk = 0;
  for (ii = 0; ii < 8; ii++) {
    chk = chk + out_buff[ii];
  }//for
  out_buff[7 - 1] = chk & 0xff;

  //送信処理
  //send 8 byte
  delay(1);
  for (ii = 0; ii < 8; ii++) {
    Serial.write(out_buff[ii]);
  }//for
  delay(1);

} //ultrasound_reply


int u_key;      // 受信データを格納するchar型の変数
int ch_in_key() {

  // 受信データがあった時だけ、処理を行う
  while (!Serial.available()) {}      // 受信データがあるか？
  u_key = Serial.read();            // 1文字だけ読み込む

  return (u_key);
}


//初期化処理
void setup() {

  delay(3000); //not Delete


  Serial.begin( 500000 ); // シリアル通信の速度を500000bpsにする。

} //setup


//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

byte b = 200; // ((s-140)*10)+200 -> 800


#define TRIG PA11
#define ECHO PA12

unsigned long times; //測定時間
int distance;        //長さ



//メインループ
void loop() {

  int ii;           //カウンター
  int pp;           //ポジション
  char out_buff[8]; //バッファー
  int chk;             //チェックサム
  char read_record[8];
  char x;          //一時領域

  char c_hex[] = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  };

  b = 200;

  //pc_printf("<ST>");

  while (1) {

    //第一バイト目
    //ヘッダー
    x = (char)ch_in_key();
    read_record[1 - 1] = x;
    if (x != header ) break;

    //第二バイト目
    //アドレス
    x = (char)ch_in_key();
    read_record[2 - 1] = x;
    if (x != address ) break;

    //第三バイト目
    //データの1
    x = (char)ch_in_key();
    read_record[3 - 1] = x;
    if (x != data1 ) break;

    //第四バイト目
    //データの2
    x = (char)ch_in_key();
    read_record[4 - 1] = x;
    if (x != data2 ) break;

    //第五バイト目
    //データの3
    x = (char)ch_in_key();
    read_record[5 - 1] = x;
    if (x != data3 ) break;

    //第六バイト目
    //データの4
    x = (char)ch_in_key();
    read_record[6 - 1] = x;
    if (x != data4 ) break;

    //第七バイト目
    //チェックサム
    x = (char)ch_in_key();
    read_record[7 - 1] = x;

    //チェックサムの計算
    //Checksum
    //read_record[1 - 1] = 0x00;
    //read_record[2 - 1] = 0x10;
    //read_record[3 - 1] = 0x00;
    //read_record[4 - 1] = 0x00;

    //read_record[5 - 1] = 0x00;
    //read_record[6 - 1] = 0x12;
    read_record[7 - 1] = 0x00;
    read_record[8 - 1] = 0xff;
    chk = 0;
    for (ii = 0; ii < 8; ii++) {
      chk = chk + read_record[ii];
    }//for
    read_record[7 - 1] = chk & 0xff;

    //チェックサムの処理　八バイト目はFFで固定　チェックサム自身は、00
    if (x != (chk & 0xff) ) break;


    //第八バイト目
    //フッター
    x = (char)ch_in_key();
    read_record[8 - 1] = x;
    if (x !=  footer ) break;



    //オールクリア
    //pc_printf("<OK>");
    //pc_printf("\r\n");


//超音波のデータの送り処理

    //マスターへの返信処理
    ultrasound_reply(0,b);

/*
    //デバッグ用出力に送信
    x=b;
    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);
    pc_printf("\r\n");
*/

    //超音波の測定処理


  //PB7  入力
  //PA12 出力
  //RX  PA11  11ピン G031
  //TX  PA0    4ピン G031

  //ソフトウェアシリアルから距離を出力
  //putcNS(b);


  // 超音波を発生させる
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);


  // 超音波を受け取る
  times = pulseIn(ECHO, HIGH,2000000);
  //times = (unsigned long)(7700/2); //debug 650cm
  //times = 1177;//debug 1ms 20.0cm
  //times = 942;//debug 1ms 16.0cm

  //distance = (int)(times * 0.017);
  distance = (int)((times * ((unsigned long)(17))) / 100);
  //distance = 321; //debug

  //レンジ圧縮をして8ビット(256)に収める
  //60mm から　200mmまでは、1mm単位
  //60mm = 0 , 200mm = 140
  //200mm から　800mmまでは、1cm単位
  //200mm =140 ,  800mm = 200

  //オーバーの値を丸める
  if( distance >= 800 ){ distance = 800;}
  if( distance <= 60  ){ distance = 60 ;}

  // 200mmより　小さいか?
  if ( distance <= 199 ) {

  b = distance - 60;

  } else {

  b = (byte)( DIV10(distance) -20 + 140 );//DIV10(x)==x/10
  
  }//endif

  //b = 200;//debug
  //b = '0';//debug

    break;

  }//while

  //pc_printf("<ST>");

  //delay(1000);

} //loop




```


とりま成功


![o_con438.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/88f0833d-6a96-ca88-90a6-59f83e63924b.jpeg)



とりま成功

送り返し　なし　バージョン　一時的にモニター出力は、PA11
RS-485にデバッグ用のアドレスが必要だな　仮に0x7Fぐらいがちょうどいい
チェックサムは、固定0x78 なぁーちゃんで78 それもちょっと考えるか?


```c++





//ser_500kbps_HC-SR04_031_1

#include <Arduino.h>

//#define DD PA11    // potentiometer connected to analog pin x

// tx PA14(PB6) 8PIN
// rx PC14(PB7) 1PIN

#define  header   0x00
#define  address  0x40
#define  data1    0x00
#define  data2    0x00

#define  data3    0x00
#define  data4    0x00
#define  Checksum 0x00
#define  footer   0xff

/*
  #define  header   '0'
  #define  address  '1'
  #define  data1    '0'
  #define  data2    '0'

  #define  data3    '0'
  #define  data4    '2'
  #define  Checksum '7'
  #define  footer   '9'
*/

#define DW   digitalWrite
#define TX1        PA12   // 4pin
#define UART_DELAY 106  // 002-110 9600bps ok 031

//仮想シリアルへの一文字出力 9600bps
void pc_putc(char ch)
{
  DW(TX1, HIGH);

  DW(TX1, LOW);//START
  delayMicroseconds(UART_DELAY); //START BIT WAIT

  for (int ii = 0; ii < 8; ii++) {
    DW(TX1, (ch >> ii) & 1  );
    delayMicroseconds(UART_DELAY); //DATA 1-8BIT WAIT
  }//for

  DW(TX1, HIGH);//Stop
  delayMicroseconds(UART_DELAY); //StOP BIT WAIT

}//pc_putc


//文字列の表示
int pc_printf(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    pc_putc(*str1 ++);

  } //while

  //戻り値
  return (0);
}//pc_printf


int u_key;      // 受信データを格納するchar型の変数
int ch_in_key() {

  // 受信データがあった時だけ、処理を行う
  while (!Serial.available()) {}      // 受信データがあるか？
  u_key = Serial.read();            // 1文字だけ読み込む

  return (u_key);
}


//初期化処理
void setup() {

  delay(3000); //not Delete

  //TXポートの初期化
  pinMode(TX1, OUTPUT);
  DW(TX1, HIGH);

  Serial.begin( 500000 ); // シリアル通信の速度を500000bpsにする。

//  //PWMの初期化
//  pinMode(DD, OUTPUT);   // sets the LED pin as output
//  analogWriteFrequency(50);
//  analogWriteResolution(16);

} //setup


//メインループ
void loop() {

  int ii;           //カウンター
  int pp;           //ポジション
  char out_buff[8]; //バッファー
  int chk;             //チェックサム
  char read_record[8];
  char x;          //一時領域

  char c_hex[] = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  };


  pc_printf("<ST>");

  while (1) {

    //第一バイト目
    //ヘッダー

    x = (char)ch_in_key();
    read_record[1 - 1] = x;

    //ヘキサに値を設定
    // packet move
    out_buff[0] = '(';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ')';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);

    //1
    if (x != header ) break;


    //第二バイト目
    //アドレス

    x = (char)ch_in_key();
    read_record[2 - 1] = x;

    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);

    if (x != address ) break;


    //第三バイト目
    //データの1

    x = (char)ch_in_key();
    read_record[3 - 1] = x;

    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);

    //3
    if (x != data1 ) break;


    //第四バイト目
    //データの2

    x = (char)ch_in_key();
    read_record[4 - 1] = x;

    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);

    //4
    if (x != data2 ) break;

    //第五バイト目
    //データの3

    x = (char)ch_in_key();
    read_record[5 - 1] = x;

    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);

    if (x != data3 ) break;


    //第六バイト目
    //データの4

    x = (char)ch_in_key();
    read_record[6 - 1] = x;


    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);

    if (x != data4 ) break;

    //第七バイト目
    //チェックサム

    x = (char)ch_in_key();
    read_record[7 - 1] = x;

    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);

    //チェックサムの計算
    //Checksum
    //read_record[1 - 1] = 0x00;
    //read_record[2 - 1] = 0x10;
    //read_record[3 - 1] = 0x00;
    //read_record[4 - 1] = 0x00;

    //read_record[5 - 1] = 0x00;
    //read_record[6 - 1] = 0x12;
    read_record[7 - 1] = 0x00;
    read_record[8 - 1] = 0xff;
    chk = 0;
    for (ii = 0; ii < 8; ii++) {
      chk = chk + read_record[ii];
    }//for
    read_record[7 - 1] = chk & 0xff;

    //  out_buff[0] = '-';
    //  out_buff[1] = c_hex[(chk >> 4) & 0x0f];
    //  out_buff[2] = c_hex[chk & 0x0f];
    //  out_buff[3] = '-';
    //  out_buff[4] = 0x00;
    //  pc_printf(out_buff);

    //チェックサムの処理　八バイト目はFFで固定　チェックサム自身は、00
    //if(x != 0x21 ) break;
    if (x != (chk & 0xff) ) break;


    //第八バイト目
    //フッター

    x = (char)ch_in_key();
    read_record[8 - 1] = x;

    //ヘキサに値を設定
    // packet move
    out_buff[0] = '[';
    out_buff[1] = c_hex[(x >> 4) & 0x0f];
    out_buff[2] = c_hex[x & 0x0f];
    out_buff[3] = ']';
    out_buff[4] = 0x00;

    //送信処理
    //send 8 byte
    pc_printf(out_buff);

    if (x !=  footer ) break;

    //オールクリア
    pc_printf("<OK>");
    pc_printf("\r\n");


//超音波のデータの送り処理


//    analogWrite(DD, 1310 + (26 * pp) );   // analogRead values go from 0
//                                          // to 4095, pwmWrite values
//                                          // from 0 to 65535, so scale roughly





    break;

  }//while

  //pc_printf("<ST>");

  //delay(1000);

} //loop







```