首页 > 其他分享 >esp32笔记[14]-使用软串口双机通信

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

时间:2024-02-06 16:55:54浏览次数:29  
标签:node 14 uart 双机 start 串口 serial soft

摘要

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

标签:node,14,uart,双机,start,串口,serial,soft
From: https://www.cnblogs.com/qsbye/p/18009986

相关文章

  • 亚洲市场 4090 显卡价格飙升 60%;比亚迪自研城市 NOA 辅助驾驶 3 月落地丨 RTE 开发者
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......
  • 1114 Family Property
    Thistime,youaresupposedtohelpuscollectthedataforfamily-ownedproperty.Giveneachperson'sfamilymembers,andtheestate(房产)infounderhis/herownname,weneedtoknowthesizeofeachfamily,andtheaverageareaandnumberofsetsof......
  • 洛谷题单指南-递推与递归-P1464 Function
    原题链接:https://www.luogu.com.cn/problem/P1464题意解读:虽然a、b、c可输入的范围比较大,但是递归中,只会限制在0-20以内,由于递归中有大量的重复计算,因此需要采用记忆化搜索来保存已经计算过的递归函数值。解题思路:定义三位数组LLmem[25][25][25],mem[a][b][c]保存w(a,b,c)的......
  • CF1483F Exam
    我永远喜欢数据结构神仙\(\color{maroon}*3400\)字符串题。感觉现有的一篇SA题解讲的不太清楚,来一篇更加清楚、严谨的SA题解。洛谷CF给出\(n\)个字符串\(s_1\sims_n\),求有多少对\((i,j)\),满足:\(1\lei,j\len\)。\(s_j\)是\(s_i\)的真子串。不存在\(k\)......
  • P10145 [WC/CTS2024] 线段树 题解
    Link纪念一下场切题。题意:给定一棵(分点不一定为中点)的线段树,给定若干个询问区间,问有多少个线段树上结点的集合,知道了这些结点对应的区间和就可以知道任何一个询问区间的和。从询问区间开始考虑。会发现可以把所有\(a_i\)分成若干个集合,只要知道每个集合的和就可以知道所有询......
  • 文心一言 VS 讯飞星火 VS chatgpt (195)-- 算法导论14.3 3题
    三、用go语言,请给出一个有效的算法,对一个给定的区间i,返回一个与i重叠且具有最小低端点的区间;或者当这样的区间不存在时返回T.nil。文心一言,去掉math,代码正常运行:在Go语言中,你可以使用结构体来表示区间,并使用切片来存储区间集合。然后,你可以遍历区间集合,找到与给定区间重叠且具......
  • 洛谷 P10145 [WC/CTS2024] 线段树 题解--zhengjun
    提供一种考场做法,在思路上和官方题解的差异蛮大的,虽然结果差不多。首先需要发现\([l,r)\)区间可以算出来的充要条件是:如果对于每个选中的节点\(u\),连无向边\((L_u,R_u)\),则当且仅当\(l\)和\(r\)连通时区间\([l,r)\)可以算出来。证明的话,用前缀和理解这些东西,分别考虑......
  • 【APP逆向14】JNI开发简介之二
    简介:上一篇我们讲到了java调用C,今天继续聊C调用java1.C调用java的静态方法1.1:入口,java调用C的代码packagecom.nb.s4;classEncryptUtils{static{System.loadLibrary("enc");}publicstaticnativeStringv8();}1.2:C语言实现,调......
  • P1114 “非常男女”计划
    原题链接这道题是前缀和的简单应用。我们可以将男生看为1,女生看为-1。那么题目要求的最长子数组的判断条件为该数组和是否为0。首先我们对整个数组进行前缀和;接下来假定该最长子数组在right位置(right进行遍历)结束,那么就有两种情况讨论:1、该位置前缀和为0,那么与max进行比较。......
  • leetcode 第141题:环形列表
    leetcode第141题:环形列表第一种:哈希列表publicbooleanhasCycle(ListNodehead){Set<ListNode>seen=newHashSet<ListNode>();while(head!=null){if(seen.contains(head)){returntrue;}......