ESP32のソフトウェアシリアルで受信して遊ぶ。(オリジナル)(9600bps)


------------------------------

x そく、必要な人は、一番下の「テスト編」「プログラム2」

------------------------------


ESP32のソフトウェアシリアルで受信して遊ぶ。作成中



参考


https://qiita.com/caa45040/items/069c2667739d83a03347


https://qiita.com/caa45040/items/91bc4665095d65eb971b


目的
カラー液晶に必要なデータを
簡易的に受け取る
9600bps固定



いろいろ
なんか特殊な事をやって
オシロやロジアナを使わずに
微調整していたと思ったが
本人なのに忘れた。
たぶん、論理値の104でいいはず。
思い出した。
要は、タイマー仕込んで
全体の長さが1041usで
適当にウエートを振り分ければよい
プロセスが何段階かあって1つずつ
やつて行けば係数が決まる。

![o_cop666.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/990547fa-6760-0fbb-3e12-a6683c07fc7c.jpeg)


![o_cop665.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f1664fe0-add6-317f-13a8-66286ebe185a.jpeg)



------------------------------------------

●開発編

テストプログラム1

結果 ようは、後、3us削つてあげれば「よし」

![o_cop667.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/93a346d8-df58-140f-2e9e-7cf39eb3d178.jpeg)


メイン

```c++:main.cpp


//ser_RX_test_esp32_1

#include <Arduino.h>

#include "SER_9600_ESP32_1.h"

#define RX1      22



//#define UART_DELAY 832 //  1200bps ok 031
#define UART_DELAY 102   //  9600bps ok 031

unsigned long t_st;
unsigned long t_en;



int pc_getc()
{

  int a,b,c,d,e,f,g,h;
  int bs;

  //待ちループ
  //while( digitalRead(RX1) == 1 ) {}


//----------------------------------------
    t_st = micros();
//----------------------------------------


    delayMicroseconds(156-0);
    a=(digitalRead(RX1));

    delayMicroseconds(104-0);
    b=(digitalRead(RX1));

    delayMicroseconds(104-0);
    c=(digitalRead(RX1));

    delayMicroseconds(104-0);
    d=(digitalRead(RX1));

    delayMicroseconds(104-0);
    e=(digitalRead(RX1));

    delayMicroseconds(104-0);
    f=(digitalRead(RX1));

    delayMicroseconds(104-0);
    g=(digitalRead(RX1));

    delayMicroseconds(104-0);

    h=(digitalRead(RX1));
    delayMicroseconds(156-0);

//----------------------------------------
    t_en = micros();
//----------------------------------------


    bs=h*128+g*64+f*32+e*16+d*8+c*4+b*2+a;

    return(bs);
}//pc_getc



//初期化
void setup()
{
  //ポートをhiにする 初期化
  pinMode(RX1,INPUT_PULLUP);

  //シリアルの初期化
  pc.beginNS(9600);

  //データの表示
  pc.printNS("STRT\r\n");  //debug

} //setup

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

  char ch = pc_getc();

  char str1[80];
  sprintf(str1,"1 char to times [%d]\r\n",t_en-t_st);
  pc.printNS(str1);

  //1秒の待ち
  delay(1000);

} //loop



```

インクルド


```c++:SER_9600_ESP32_1.h


#ifndef TEST_H
#define TEST_H

//SER_9600_ESP32_1.h


#define TX1      23      // ?pin

//#define UART_DELAY  96   //  9600bps  NG
//#define UART_DELAY  97   //  9600bps  NG
//#define UART_DELAY  98   //  9600bps  NG
//#define UART_DELAY  99   //  9600bps  NG
//#define UART_DELAY 100   //  9600bps  NG 
//#define UART_DELAY 101   //  9600bps  OK 1
//#define UART_DELAY 102   //  9600bps  OK 2
//#define UART_DELAY 103   //  9600bps  OK 3
//#define UART_DELAY 104   //  9600bps  OK 4
#define UART_DELAY 105   //  9600bps  OK 5
//#define UART_DELAY 106   //  9600bps  OK 6
//#define UART_DELAY 107   //  9600bps  OK 7
//#define UART_DELAY 108   //  9600bps  OK 8
//#define UART_DELAY 109   //  9600bps  OK 9
//#define UART_DELAY 110   //  9600bps  NG
//#define UART_DELAY 111   //  9600bps  NG


//#define UART_DELAY 1000   //  9600bps ok E


#define DW   digitalWrite


//クラスの定義
struct _pc
{
  void beginNS(int sp);      //メソッドの宣言
  int  putcNS(char ch);      //メソッドの宣言
  int  printNS(char *str1);  //メソッドの宣言
};


//ポートをhiにする 初期化
//メソッドの定義
void _pc::beginNS(int sp)
{
  //ポートをhiにする初期化
  pinMode(TX1, OUTPUT);
  DW(TX1, HIGH);
}


//仮想シリアルへの一文字出力 9600bps
//メソッドの定義
int _pc::putcNS(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

  return (0);
}


//文字列の表示
//メソッドの定義
int _pc::printNS(char *str1)
{
  //文字の中身がゼロか
  while (*str1) {

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

  } //while

  //戻り値
  return (0);
}


//実体の作成
_pc pc;


#endif

```



------------------------------------------------------------


●解答編

3usぶんを適当に割り振る

![o_cop668.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/39bb9e67-6c6f-c44e-68fe-16e3967bb152.jpeg)


```c++


    delayMicroseconds(156-1);
    a=(digitalRead(RX1));

    delayMicroseconds(104-0);
    b=(digitalRead(RX1));

    delayMicroseconds(104-0);
    c=(digitalRead(RX1));

    delayMicroseconds(104-0);
    d=(digitalRead(RX1));

    delayMicroseconds(104-1);
    e=(digitalRead(RX1));

    delayMicroseconds(104-0);
    f=(digitalRead(RX1));

    delayMicroseconds(104-0);
    g=(digitalRead(RX1));

    delayMicroseconds(104-0);

    h=(digitalRead(RX1));
    delayMicroseconds(156-1);


```


esp32用ソフトウエアシリアル

プログラム


```c++


//#define UART_DELAY 832 //  1200bps ok 031
//#define UART_DELAY 102   //  9600bps ok 031


int pc_getc()
{

  int a,b,c,d,e,f,g,h;
  int bs;

  //待ちループ
  while( digitalRead(RX1) == 1 ) {}

    delayMicroseconds(156-1);
    a=(digitalRead(RX1));

    delayMicroseconds(104-0);
    b=(digitalRead(RX1));

    delayMicroseconds(104-0);
    c=(digitalRead(RX1));

    delayMicroseconds(104-0);
    d=(digitalRead(RX1));

    delayMicroseconds(104-1);
    e=(digitalRead(RX1));

    delayMicroseconds(104-0);
    f=(digitalRead(RX1));

    delayMicroseconds(104-0);
    g=(digitalRead(RX1));

    delayMicroseconds(104-0);

    h=(digitalRead(RX1));
    delayMicroseconds(156-1);

    bs=h*128+g*64+f*32+e*16+d*8+c*4+b*2+a;

    return(bs);
}//pc_getc




```


-------------------------------------------------------

●テスト編

![o_cop669.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/17268552-70e0-1210-6d37-3948039817bf.jpeg)



プログラム2

```c++:main.cpp


//ser_RX_test_esp32_2

#include <Arduino.h>

#include "SER_9600_ESP32_1.h"

#define RX1      22


//#define UART_DELAY 832 //  1200bps ok 031
//#define UART_DELAY 102   //  9600bps ok 031


int pc_getc()
{

  int a,b,c,d,e,f,g,h;
  int bs;

  //待ちループ
  while( digitalRead(RX1) == 1 ) {}

    delayMicroseconds(156-1);
    a=(digitalRead(RX1));

    delayMicroseconds(104-0);
    b=(digitalRead(RX1));

    delayMicroseconds(104-0);
    c=(digitalRead(RX1));

    delayMicroseconds(104-0);
    d=(digitalRead(RX1));

    delayMicroseconds(104-1);
    e=(digitalRead(RX1));

    delayMicroseconds(104-0);
    f=(digitalRead(RX1));

    delayMicroseconds(104-0);
    g=(digitalRead(RX1));

    delayMicroseconds(104-0);

    h=(digitalRead(RX1));
    delayMicroseconds(156-1);

    bs=h*128+g*64+f*32+e*16+d*8+c*4+b*2+a;

    return(bs);
}//pc_getc



//初期化
void setup()
{
  //ポートをhiにする 初期化
  pinMode(RX1,INPUT_PULLUP);

  //シリアルの初期化
  pc.beginNS(9600);

  //データの表示
  pc.printNS("STRT\r\n");  //debug

} //setup

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

  char ch = pc_getc();

  //一文字出力
  pc.putcNS(ch);

  //1秒の待ち
  //delay(1000);

} //loop



```

```c++:SER_9600_ESP32_1.h


#ifndef TEST_H
#define TEST_H

//SER_9600_ESP32_1.h


#define TX1      23      // ?pin

//#define UART_DELAY  96   //  9600bps  NG
//#define UART_DELAY  97   //  9600bps  NG
//#define UART_DELAY  98   //  9600bps  NG
//#define UART_DELAY  99   //  9600bps  NG
//#define UART_DELAY 100   //  9600bps  NG 
//#define UART_DELAY 101   //  9600bps  OK 1
//#define UART_DELAY 102   //  9600bps  OK 2
//#define UART_DELAY 103   //  9600bps  OK 3
//#define UART_DELAY 104   //  9600bps  OK 4
#define UART_DELAY 105   //  9600bps  OK 5
//#define UART_DELAY 106   //  9600bps  OK 6
//#define UART_DELAY 107   //  9600bps  OK 7
//#define UART_DELAY 108   //  9600bps  OK 8
//#define UART_DELAY 109   //  9600bps  OK 9
//#define UART_DELAY 110   //  9600bps  NG
//#define UART_DELAY 111   //  9600bps  NG


//#define UART_DELAY 1000   //  9600bps ok E


#define DW   digitalWrite


//クラスの定義
struct _pc
{
  void beginNS(int sp);      //メソッドの宣言
  int  putcNS(char ch);      //メソッドの宣言
  int  printNS(char *str1);  //メソッドの宣言
};


//ポートをhiにする 初期化
//メソッドの定義
void _pc::beginNS(int sp)
{
  //ポートをhiにする初期化
  pinMode(TX1, OUTPUT);
  DW(TX1, HIGH);
}


//仮想シリアルへの一文字出力 9600bps
//メソッドの定義
int _pc::putcNS(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

  return (0);
}


//文字列の表示
//メソッドの定義
int _pc::printNS(char *str1)
{
  //文字の中身がゼロか
  while (*str1) {

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

  } //while

  //戻り値
  return (0);
}


//実体の作成
_pc pc;


#endif

```