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后台 |
---|---|