ESP32 Arduino支持RS485流控制并支持串口空闲接收

ESP32 Arduino的串口库支持RS485及串口空闲接收

概述

原来的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串口提供了更有力的支持,在工程中更好使用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值