概述
原来的HardwareSerial库支持串口接收,但不支持RS485的流控,也没有空闲中断可供使用,一般的服务程序需要使用Serial.avaialble()函数来检查串口,获取数据。新的库现在支持RS485流控,并实现类似STM32的空闲中断,可以用来读取不定长串口数据。
代码实现
用一个例子来展示流控和空闲中断。
流控
我们都知道过去的HardwareSerial库并不支持流控,前面的文章也介绍了流控的方法,当然是自己的使用体会,在工程上使用也智能支持低速的应用,比如用中断实现的流控只能支持57600bps的通讯速率,对高速应用就不能很好的支持了。但使用HardwareSerial库,实验了最高速度可以控制2Mbps的速度。是ESP32文章介绍的串口的极限都可以很好的使用自动流控。见代码:
#include <HardwareSerial.h> // 包含串口硬件库
const uint8_t DE485 = 25; // 设置流控GPIO PIN = 25
void setup()
{
Serial2.begin(9600); // 速率可达到2M
if ( !Serial2.setPins(-1, -1, -1, DE485))
{
Serial.println("Failed to set RS485 pins");
}
if (!Serial2.setMode(MODE_RS485_HALF_DUPLEX)) // 设置RS485半双工
{
Serial.println("Failed to set RS485 mode");
}
Serial2.setRxTimeout(10); // 设置空闲时间10
Serial2.onReceive(OnCallback, true); // 空闲中断调用OnCallbackh函数
}
上面的设置程序实现流控设置,用GPIO PIN 25连接RS485的RE/DE#. 在读写Serial2时就无需关心RS485的RE/DE#了。
空闲中断
在STM32中有空闲中断可供使用,实现不定长的数据接收,非常方便,虽然也会出现这样和那样的问题,但使用起来还是很爽的。但原来的HardwareSerial库对ESP32没有很好的支持,不能实现回调函数。直到最近的版本才对onRecive进行支持,实现类似STM32的空闲中断。具体使用方法上代码:
void OnCallback()
{
uint8_t dLen = Serial2.available(); // 发生接收中断时,获取接到数据的数量
Serial.print("Bytes received = ");
Serial.println(dLen);
if ( dLen == 0) return;
Serial2.readBytes(rx2Buff, dLen); //读取全部的字节到暂存区
Serial.write(rx2Buff, dLen); // 读取的数据在串口0上显示
}
总结
HardwareSerial现在对ESP32串口提供了更有力的支持,在工程中更好使用了。