该对象的工作方式与常规Arduino的工作方式大致相同。除了硬件
FIFO
(TX和RX为128字节)之外,还有一个额外的可定制的256
字节RX
缓冲区。此软件缓冲区的大小可由用户更改。建议在更高的接收速度下使用更大的容量。NodeMcu上有两组串口,Serial
和Serial1
。Serial
使用UART0
,默认对应引脚是GPIO1(TX–D10)和GPIO3(RX–D9)
RX
缓冲区大小。这应该在 之前调用。size
参数应至少足够大,以便在读取之前保存收到的所有数据。::setRxBufferSize(size_t size)::begin()
SERIAL_TX_ONLY
传递给 Serial.begin()
来关闭 256
字节 RX
缓冲区以节省 RAM
。其他模式SERIAL_RX_ONLY
且SERIAL_FULL
(默认值) Serial.begin(115200);
//常规串口设置
Serial.begin(115200, SERIAL_8N1);
//同上
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
//仅开启串口输出
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY, 1);
// void begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin);//仅开启串口输出,并指定引脚
Serial.begin(115200, SERIAL_8N1, SERIAL_RX_ONLY);
//仅开启串口输入模式,无法串口打印输出信息
Serial.begin(115200, SERIAL_8N1, SERIAL_FULL);
//默认模式
接收是中断驱动的,但传输轮询和忙等待。阻止行为如下:如果字节数适合 TX FIFO 中的当前可用空间,则调用不会阻塞。如果 TX FIFO 已满,则调用会阻塞,并等到有空间后再向其中写入更多字节,直到写入所有字节。换句话说,当调用返回时,所有字节都已写入 TX FIFO,但这并不意味着所有字节都已通过串行线路发送出去。调用不会阻塞,即使没有可用于读取的字节也是如此。调用将阻塞,直到读取的字节数符合传入参数所需的字节数。在返回之前,等待 TX FIFO 为空的调用块。建议在对串行端口进行配置更改(例如更改波特率)或执行电路板复位之前调用此操作,以确保已发送所有字节。相关函数:
::write()::read()::readBytes()::flush()
Serial
使用 UART0
,它映射到引脚 GPIO1 (TX)
和 GPIO3 (RX)
。串行可以通过在之后调用 重新映射到 GPIO15 (TX)
和 GPIO13 (RX)
。再次调用会将 UART0
映射回 GPIO1
和 GPIO3
。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
,默认对应引脚是GPIO2(TX----D4)。Serial1
不能用于接收数据,因为它的RX引脚被用于flash
芯片连接—D3。Serial.begin
,Wifi库诊断输出是禁用的。再次启动调试输出,调用Serial.setDebugOutput(true)
。void HardwareSerial::setDebugOutput(bool en)
{
if(!_uart) {
return;
}
if(en) {
if(uart_tx_enabled(_uart)) {
uart_set_debug(_uart_nr);
} else {
uart_set_debug(UART_NO);
}
} else {
// disable debug for this interface
if(uart_get_debug() == _uart_nr) {
uart_set_debug(UART_NO);
}
}
}
Serial.printf
才行。#include
void setup()
{
Serial.begin(115200);
Serial.setDebugOutput(true); //将串口设为调试输出模式
// Serial.setDebugOutput(false);
}
void loop()
{
// Serial.println("Hello");
printf("Hello\n");
//Serial.printf("Hello\n");//这个都支持
for(int i=0; i<5000; i++)
{
delayMicroseconds(1000);
yield();
}
}
void setup() {
Serial.begin(57600);
int br = Serial.baudRate(); //获取当前波特率
Serial.printf("当前波特率是 %d bps\n", br);
}
void loop() {
}
位卑未敢忘忧国, 事定犹须待盖棺。 —— 陆 游《病起》 |
---|