作者:没有你的日子1976_472 | 来源:互联网 | 2024-12-03 12:37
ESP8266的串行通信功能与传统Arduino设备相似,但具有增强的硬件特性。除了标准的硬件FIFO(每方向128字节)外,ESP8266还提供了额外的256字节TX和RX缓存。这些缓存有助于提高数据传输效率,减少数据丢失。
所有发送和接收操作均通过中断处理。当FIFO或缓存满时,write函数将暂停执行,直到有足够的空间可用。同样,当FIFO或缓存为空时,read函数将阻塞,直到接收到新的数据。
NodeMCU开发板上配备了两个串行端口:Serial和Serial1。Serial默认使用UART0接口,连接至GPIO1(TX,即D10)和GPIO3(RX,即D9)。通过调用Serial.swap()方法,可以将这些引脚重新映射到GPIO15(TX,即D8)和GPIO13(RX,即D7)。再次调用Serial.swap()则恢复到默认设置。
例如:
void setup() {
Serial.begin(115200);
Serial.println("初始映射:GPIO1(TX), GPIO3(RX)");
Serial.swap();
Serial.println("映射后:GPIO15(TX1), GPIO13(RX1)");
Serial.swap();
Serial.println("恢复映射:GPIO1(TX), GPIO3(RX)");
}
void loop() {
}
Serial1使用UART1接口,默认TX引脚为GPIO2(D4)。需要注意的是,由于RX引脚用于连接闪存芯片,因此Serial1不能用于接收数据。若需使用Serial1进行数据发送,只需调用Serial1.begin(baudrate)即可。
如果不使用Serial1且不需要重新映射串口,可以将UART0的TX引脚映射到GPIO2,这可以通过调用Serial.set_tx(2)或直接使用Serial.begin(baud, config, mode, 2)来实现。
默认情况下,调用Serial.begin后会禁用WiFi库的诊断输出。如需重新启用调试输出,可调用Serial.setDebugOutput(true)。若要将调试输出定向到Serial1,则应调用Serial1.setDebugOutput(true)。
用户还可以通过调用Serial.setRxBufferSize(size_t size)自定义接收缓冲区的大小,默认为256字节。虽然增加缓冲区大小可以提高性能,但也需注意这会消耗更多内存。
Serial和Serial1对象支持多种数据格式,包括5至8位的数据位、奇偶校验(奇数、偶数或无)及1或2个停止位。设置这些参数可通过调用如Serial.begin(baudrate, SERIAL_8N1)或Serial.begin(baudrate, SERIAL_6E2)等方法实现。
此外,Serial和Serial1提供了一个新方法来查询当前的波特率设置。调用Serial.baudRate()或Serial1.baudRate()即可返回当前的波特率。
示例代码如下:
void setup() {
Serial.begin(57600);
int br = Serial.baudRate(); // 查询当前波特率
Serial.printf("当前波特率为: %d bps\n", br);
}
void loop() {
}
串行通信的应用主要集中在两个方面:
1. 与外部设备进行数据交换,如蓝牙模块、其他Arduino设备等;
2. 开发过程中的调试,通过串行端口输出调试信息,帮助开发者监控程序运行状态。