esp32笔记[14]-使用软串口双机通信

摘要

两个esp32之间使用软串口(SoftSerial)进行通信.

平台信息

  • Arduino IDE:2.2.1
  • node_a:esp32c3
  • node_b:esp32s2

原理简介

软串口SoftSerial

[https://www.arduino.cc/reference/en/libraries/espsoftwareserial/]
[https://blog.csdn.net/qq_43126437/article/details/106166135]
[https://blog.csdn.net/m0_61543203/article/details/126706199]
[https://www.lab-z.com/suh/]
软串口接收引脚波特率建议不要超过57600
一般采用微处理器芯片的单板机等,数字IO口的电平信号都是采用TTL电平标准的,即5V为1,0V为0。Arduino的数字IO口亦是采用TTL电平标准,它上面的硬件串口(D0、D1)采用的也是TTL标准的串行协议。因此我们就可以用其它的IO口来模拟硬件串口,即用软件程序将一个字节(BYTE)拆成8个位(bit),根据bit=1或0,依次按指定的频率用相应的高低电平串行发送,接收端读取到这些高低电平后,再将这些高低电平信号还原成1或0,然后还原成一个字节数据,也就是模拟硬件串口进行通信。

对于我们来说,只要 CPU 足够快,GPIO 足够快,能够模拟出各种总线,最常见的是软串口,再稍微复杂一些的是I2C, SPI(力大砖飞)。

SoftwareSerial类库是Arduino IDE默认提供的一个第三方类库,和硬件串口不同,其声明并没有包含在Arduino核心库中,因此要建立软串口通信,首先需要声明包含SoftwareSerial.h头文件,然后即可使用该类库中的构造函数,初始化一个软串口实例。如:
SoftwareSerial mySerial(2, 3);
即是新建一个名为mySerial的软串口,并将2号引脚作为RX端,3号引脚作为TX端。

实现

核心代码

node_a.ino

/*
SoftSerial软串口测试
esp32c3
- soft_uart_tx:io4
- soft_uart_rx:io5
*/
#include <stdio.h>
#include <SoftwareSerial.h> // 软串口相关

// 全局变量
const int soft_uart_tx_pin = 4;
const int soft_uart_rx_pin = 5;

// 延时相关
unsigned long g_start_time = millis();

// 软串口相关
SoftwareSerial g_soft_serial(soft_uart_rx_pin,soft_uart_tx_pin); // rx ,tx

/* start 主函数 */
void setup(){
  // 初始化串口
  Serial.begin(115200);

  // 初始化软串口
  g_soft_serial.begin(4800);
  g_soft_serial.println("soft serial test");

}

void loop(){
  if(millis() >= g_start_time + 5000){
    g_soft_serial.println("hello from node_a");

    // 更新g_start_time
    g_start_time = millis();
  }

  // 接收软串口数据
  if (g_soft_serial.available()){
    Serial.write(g_soft_serial.read());
    // 回复
    // g_soft_serial.println("ack from node_a");
    }
}

node_b.ino

/*
SoftSerial软串口测试
esp32s2
- soft_uart_tx:io4
- soft_uart_rx:io5
*/
#include <stdio.h>
#include <SoftwareSerial.h> // 软串口相关

// 全局变量
const int soft_uart_tx_pin = 4;
const int soft_uart_rx_pin = 5;

// 延时相关
unsigned long g_start_time = millis();

// 软串口相关
SoftwareSerial g_soft_serial(soft_uart_rx_pin,soft_uart_tx_pin); // rx ,tx

/* start 主函数 */
void setup(){
  // 初始化串口
  Serial.begin(115200);

  // 初始化软串口
  g_soft_serial.begin(4800);
  g_soft_serial.println("soft serial test");

}

void loop(){
  if(millis() >= g_start_time + 5000){
    g_soft_serial.println("hello from node_b");

    // 更新g_start_time
    g_start_time = millis();
  }

  // 接收软串口数据
  if (g_soft_serial.available()){
    Serial.write(g_soft_serial.read());
    // 回复
    // g_soft_serial.println("ack from node_b");
    }
}

效果

node_a后台 node_b后台
posted @ 2024-02-06 16:47  qsBye  阅读(602)  评论(0编辑  收藏  举报