ESP32 for Arduino 串行通信学习笔记

一、串行通信基础

(一)串行与并行通信区别

  • 串行通信:基于单条数据线,数据一位一位依次传输 。只需少数几根线,适合低速率、远距离传输,像 ESP32 主控板通过 USB 连电脑就是串行通信,常见方式有 UART、IIC、SPI 。
  • 并行通信:一组数据的各数据位在多条数据线上同时传输,适合短距离、高速率传输 。

(二)UART 关键概念

  • 定义:通用异步接收器/发送器,集成在主控器中,发送数据无需额外时钟信号,能节省引脚资源,还有缓冲区存通信数据 。
  • 连接:用 TX(发送端)、RX(接收端)、GND(地)信号线,设备间连接时 TX 和 RX 交叉,GND 相连 。注意别把 5V 和 3.3V 设备的 UART 端口接反,会损坏设备 。

二、ESP32 的 UART 接口

ESP32 有 3 个 UART 端口,在 Arduino 环境里对应名称及引脚如下: | UART 端口 | Arduino 中名称 | TX 引脚 | RX 引脚 | 特殊说明 | | ---- | ---- | ---- | ---- | ---- | | UART0 | Serial | 1 | 3 | 开发板 Micro USB 经 USB 转 UART 芯片(如 CH340N )连到此端口,用于上传程序、和电脑交互 | | UART1 | Serial1 | 10 | 9 | 一般用于 Flash 读写,平时少用 | | UART2 | Serial2 | 17 | 16 | 可用于自定义串行通信场景 |

三、UART 数据发送(Arduino 函数及代码)

(一)常用函数

  • Serial.begin(speed, config):初始化串口 。speed 填波特率(如 115200 ,数值越大传输越快,需收发双方一致 );config 选数据位、校验位、停止位配置,默认 8N1(8 位数据位、无校验、1 位停止位 ),示例:Serial.begin(115200);
  • Serial.print(val) / Serial.print(val, format):以 ASCII 码形式输出数据 。val 是要输出的数据;format 对浮点数指定小数位数(默认 2 位 ),对整数指定进制(BIN 二进制、OCT 八进制、DEC 十进制、HEX 十六进制 ) 。比如 Serial.print(10, BIN); 输出十进制 10 的二进制形式 。
  • Serial.println(val) / Serial.println(val, format):功能和 print 类似,输出后自动换行 ,示例:Serial.println("Hello, ESP32!");
  • Serial.write(val) / Serial.write(str)val 是字符/字符串时,功能同 printval 是整数时,直接输出数据本身 。str 是要输出的字符串 ,示例:Serial.write(65); 输出 ASCII 码对应字符 A

(二)完整代码示例(Arduino 环境 )

void setup() {
  // 初始化串口,波特率 115200,默认 8N1 配置
  Serial.begin(115200); 

  // 1. 整数的不同进制/格式输出(以数字 10 为例)
  Serial.println(10, 2);  // 尝试特定格式输出(结合函数逻辑理解结果)
  Serial.println(10, 4);  // 特定格式输出
  Serial.println(10, 16); // 特定格式输出
  Serial.println(10, 8);  // 特定格式输出
  Serial.println(10, BIN); // 输出二进制:1010
  Serial.println(10, OCT); // 输出八进制:12
  Serial.println(10, HEX); // 输出十六进制:A
  Serial.println(10, DEC); // 输出十进制:10

  // 2. 浮点数的小数位控制输出(以 3.1415926 为例)
  Serial.println("----------------"); 
  Serial.println(3.1415926, 2); // 保留 2 位小数,输出:3.14
  Serial.println(3.1415926, 3); // 保留 3 位小数,输出:3.142
  Serial.println(3.1415926, 1); // 保留 1 位小数,输出:3.1

  // 3. Serial.write 函数使用
  Serial.println("----------------"); 
  Serial.write("65"); // 输出字符串 "65"
  Serial.println(); // 换行,让输出更清晰
  Serial.write(65);  // 输出 ASCII 码 65 对应的字符 'A'
}

void loop() {
  // loop 函数里暂时没重复执行的串口发送任务,保持空循环
  delay(1000); // 延迟 1 秒,可根据需要调整或添加逻辑
}

(三)代码说明

  • setup 函数:程序启动时执行一次,完成串口初始化、各种格式的数据输出演示 。先初始化串口,再分别用不同函数、格式输出整数和浮点数,最后用 Serial.write 演示字符/ASCII 码输出 。
  • loop 函数:这里主要是空循环,加了 delay 避免程序无意义地快速重复运行,实际项目里可添加持续发送数据等逻辑 。

四、数据格式与 ASCII 码

(一)UART 数据格式

UART 发送数据由起始位(低电平,标志数据开始传输 )、数据位(7 或 8 位等,可设置,从低位开始传 )、校验位(可选,用于检查数据错误 )、停止位(1 或 2 位,可设置,标志数据传输结束 )组成 。我们编程常用 8N1 格式,就是 8 位数据位、无校验位、1 位停止位 。

(二)ASCII 码作用

美国标准学会制定的单字节编码系统,解决串行通信里信息一致问题 。计算机里字母、数字、符号都用 0 和 1 存储,ASCII 码规定了它们对应的 0/1 组合 。比如字母 A 对应 ASCII 码 65 ,通信双方都用 ASCII 码规则,才能正确收发字符内容 。

通过学习这些,就能用 ESP32 在 Arduino 环境里灵活进行 UART 串行通信啦,多动手改改代码、试试不同参数,会理解得更透彻 !

0 条评论

目前还没有评论...