模块: serial
约 909 字大约 3 分钟
2026-03-17
构建固件和导入到JS
在 C++ 里加入以下代码, 然后重新编译构建固件:
// 为了控制固件的尺寸,BeShell 的 module 是按需引入的。
beshell.use<be::serial>() ;在JS中导入 serial module:
在.js文件中
import * as serial from 'serial'在REPL命令行下
import serial简介
Serial 串口模块
提供对 ESP32 硬件串口外设的访问,包括 UART、I2C、SPI 等。 这些类不需要实例化,serial 模块会根据芯片的型号,自动初始化并导出可用的串口对象。
使用方式
import * as serial from "serial"
// 访问 UART2
serial.uart2.setup({ tx: 17, rx: 16, baudrate: 115200 })
// 访问 I2C0
serial.i2c0.setup({ sda: 21, scl: 22 })
// 访问 SPI2
serial.spi2.setup({ mosi: 23, miso: 19, sck: 18 })硬件资源差异
重要:不同型号的 ESP32 芯片,所提供的硬件串口外设数量不一样。 serial 模块只会导出当前芯片实际拥有的外设对象。
| 芯片型号 | UART | I2C | SPI | 说明 |
|---|---|---|---|---|
| ESP32 | 3 (uart0-2) | 2 (i2c0-1) | 2 (spi1-2) | 经典款,资源最丰富 |
| ESP32-S2 | 2 (uart0-1) | 2 (i2c0-1) | 2 (spi1-2) | 无 uart2 |
| ESP32-S3 | 3 (uart0-2) | 2 (i2c0-1) | 2 (spi1-2) | 与 ESP32 相同 |
| ESP32-C2 | 2 (uart0-1) | 1 (i2c0) | 2 (spi1-2) | 精简版,只有 1 个 I2C |
| ESP32-C3 | 2 (uart0-1) | 1 (i2c0) | 2 (spi1-2) | 与 C2 相同 |
| ESP32-C6 | 3 (uart0-2) | 1 (i2c0) | 2 (spi1-2) | 新增 LP UART |
| ESP32-H2 | 2 (uart0-1) | 2 (i2c0-1) | 2 (spi1-2) | 低功耗蓝牙芯片 |
| ESP32-P4 | 6 (uart0-5) | 2 (i2c0-1) | 3 (spi1-3) | 高性能,资源最丰富 |
注意:
spi0用于内部 Flash/PSRAM,不对外导出。 SPI 导出的对象是spi1,spi2(部分型号有spi3)。
各芯片导出对象一览
ESP32 / ESP32-S3
{
uart0, uart1, uart2, // 3 个 UART
i2c0, i2c1, // 2 个 I2C
spi1, spi2 // 2 个 SPI(spi0 内部使用)
}ESP32-S2 / ESP32-C2 / ESP32-C3
{
uart0, uart1, // 2 个 UART(无 uart2)
i2c0, // 1 个 I2C(C2/C3 只有 i2c0)
spi1, spi2 // 2 个 SPI
}ESP32-C6
{
uart0, uart1, uart2, // 3 个 UART
i2c0, // 1 个 I2C
spi1, spi2, // 2 个 SPI
// 另有 uartlp0(低功耗 UART)
}ESP32-H2
{
uart0, uart1, // 2 个 UART
i2c0, i2c1, // 2 个 I2C
spi1, spi2 // 2 个 SPI
}ESP32-P4
{
uart0, uart1, uart2, uart3, uart4, // 5 个 HP UART
i2c0, i2c1, // 2 个 I2C
spi1, spi2, spi3, // 3 个 SPI
// 另有 uartlp0(低功耗 UART)
}对象说明
UART 对象
- uart0 - UART0,通常用于调试输出和程序下载
- uart1 - UART1,用户可自由使用
- uart2 - UART2,用户可自由使用(部分型号没有)
- uartlp0 - 低功耗 UART(仅部分型号支持)
I2C 对象
SPI 对象
使用建议
- UART0:保留给调试和程序下载使用,应用程序建议使用 uart1/uart2
- SPI:使用前需要先调用
setup()初始化总线,再配置外设(如 W5500、SD 卡) - I2C:多个设备可以共享同一个 I2C 总线,通过设备地址区分
示例代码
import * as serial from "serial"
import { W5500 } from "eth"
// 检查可用的串口对象
console.log("Available UARTs:", Object.keys(serial).filter(k => k.startsWith("uart")))
console.log("Available I2Cs:", Object.keys(serial).filter(k => k.startsWith("i2c")))
console.log("Available SPIs:", Object.keys(serial).filter(k => k.startsWith("spi")))
// 使用 UART2 连接 GPS 模块
if (serial.uart2) {
serial.uart2.setup({
tx: 17,
rx: 16,
baudrate: 9600
})
serial.uart2.listen((data) => {
console.log("GPS data:", data)
})
}
// 使用 I2C0 连接传感器
if (serial.i2c0) {
serial.i2c0.setup({
sda: 21,
scl: 22,
freq: 400000
})
serial.i2c0.scan() // 扫描设备
}
// 使用 SPI2 连接 W5500 以太网模块
if (serial.spi2) {
serial.spi2.setup({
mosi: 23,
miso: 19,
sck: 18
})
const eth = new W5500()
eth.setup({
spi: 2, // 对应 serial.spi2
cs: 5
})
}