ESP32 三个串口使用

#include "ms_uart.h"
#define ECHO_TXD0  GPIO_NUM_1
#define ECHO_RXD0  GPIO_NUM_3

#define ECHO_TXD1  GPIO_NUM_26
#define ECHO_RXD1  GPIO_NUM_25

#define ECHO_TXD2  GPIO_NUM_17
#define ECHO_RXD2  GPIO_NUM_16

#define ECHO_TEST_RTS  UART_PIN_NO_CHANGE
#define ECHO_TEST_CTS  UART_PIN_NO_CHANGE

#define BUF_SIZE (1024)

TimerHandle_t updateHeartBeat_handle;

int uartConnectFlag;

extern char serialNum[16];

extern int downloadFlag;

void Uart0Recv() {
	/* Configure parameters of an UART driver,
	 * communication pins and install the driver */
	uart_config_t uart_config = { .baud_rate = 115200, .data_bits =
			UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits =
			UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE };
	uart_param_config(UART_NUM_0, &uart_config);
	uart_set_pin(UART_NUM_0, ECHO_TXD0, ECHO_RXD0, ECHO_TEST_RTS,
	ECHO_TEST_CTS);
	uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL, 0);
	while (1) {
		vTaskDelay(1000 / portTICK_RATE_MS);
		uart_write_bytes(UART_NUM_0, (const char *) "uart0:", strlen("uart0:"));
	}
}

void Uart1Recv() {
	/* Configure parameters of an UART driver,
	 * communication pins and install the driver */
	uart_config_t uart_config = { .baud_rate = 115200, .data_bits =
			UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits =
			UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE };
	uart_param_config(UART_NUM_1, &uart_config);
	uart_set_pin(UART_NUM_1, ECHO_TXD1, ECHO_RXD1, ECHO_TEST_RTS,
	ECHO_TEST_CTS);
	uart_driver_install(UART_NUM_1, BUF_SIZE * 2, 0, 0, NULL, 0);
	uart_set_mode(UART_NUM_1, UART_MODE_RS485_HALF_DUPLEX);

	while (1) {
		vTaskDelay(1000 / portTICK_RATE_MS);
		uart_write_bytes(UART_NUM_1, (const char *) "uart1:", strlen("uart1:"));
	}

}

void updateHeartBeatCallback(TimerHandle_t xTimer) {
	uartConnectFlag = 0;
}

void Uart2Recv() {
	/* Configure parameters of an UART driver,
	 * communication pins and install the driver */
	uart_config_t uart_config = { .baud_rate = 115200, .data_bits =
			UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits =
			UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE };
	uart_param_config(UART_NUM_2, &uart_config);
	uart_set_pin(UART_NUM_2, ECHO_TXD2, ECHO_RXD2, ECHO_TEST_RTS,
	ECHO_TEST_CTS);
	uart_driver_install(UART_NUM_2, BUF_SIZE * 2, 0, 0, NULL, 0);
	while (1) {
		vTaskDelay(1000 / portTICK_RATE_MS);
		uart_write_bytes(UART_NUM_2, (const char *) "uart2:", strlen("uart2:"));
	}
}

//周期定时器的回调函数
void heartBeatCallback(TimerHandle_t xTimer) {
	if (!downloadFlag) {
		char handShakeCmd[10] = { 0x5A, 0x4D, 0x53, 0x01, 0x00, 0x01, 0x05,
				0x4B, 0xA5, 0x4D };
		char heartBeatCmd[9] = { 0x5A, 0x4D, 0x53, 0x0B, 0x00, 0x00, 0x68, 0x88,
				0x4D };

		char getDeviceInfoCmd[9] = { 0x5A, 0x4D, 0x53, 0x03, 0x00, 0x00, 0xE9,
				0x4A, 0x4D };

		if (uartConnectFlag) {
			if (serialNum == NULL || strlen(serialNum) == 0) {
				printf("=========3=======\n");
				uart_write_bytes(UART_NUM_2, (const char *) getDeviceInfoCmd,
						9);
			} else {
				uart_write_bytes(UART_NUM_2, (const char *) heartBeatCmd, 9);
			}
		} else {
			uart_write_bytes(UART_NUM_2, (const char *) handShakeCmd, 10);
		}
	}

}


### ESP32 三个串口配置与使用 ESP32S3 配备了三个 UART 接口,分别是 UART0、UART1 和 UART2[^2]。这些接口可以用于不同的应用场景,如调试、与其他微控制器或模块通信等。 #### 初始化和配置串口 为了使能并配置这三个串口之一,在 Arduino IDE 中可以通过 `Serial` 或者更具体的 `HardwareSerial` 对象来进行操作。对于每个 UART 实例,都需要指定波特率和其他必要的参数,比如数据位数、停止位以及校验方式。 ```cpp // 创建额外的硬件串口实例 (除了默认的 Serial) HardwareSerial Serial1(1); // 使用 UART1 HardwareSerial Serial2(2); // 使用 UART2 ``` 接着定义各自的引脚映射关系: | UART | TX Pin | RX Pin | |------|--------|--------| | UART0| GPIO1 | GPIO3 | | UART1| 可选 | 可选 | | UART2| GPIO17 | GPIO16 | 注意:UART0 默认连接至 USB 调试端口;UART1 的引脚可通过编程改变;而 UART2 则固定于上述表格所示位置[^4]。 #### 设置通信参数 在开始任何实际的数据交换之前,应该先设定好合适的波特率以及其他可能影响到正常工作的选项。这一步骤通过调用 `.begin()` 方法完成,并传入期望的速度值及其他可选参数来定制化设置。 ```cpp void setup() { // 开启 UART0,默认已经开启,这里仅作示例 Serial.begin(115200); // 启动 UART1 并自定义其工作模式 Serial1.begin(9600, SERIAL_8N1, 12, 13); // 自定义RX,TX // 启动 UART2 Serial2.begin(115200); } ``` 以上代码片段展示了如何针对不同编号的 UART 进行基本初始化过程。 #### 发送与接收数据 一旦完成了前期准备工作之后就可以着手处理真正的消息传递任务了。发送字符串非常简单——只需利用相应对象上的 `print()` 函数即可实现文本输出功能。至于获取外部输入,则要依赖于轮询机制下的 `available()` 加上 `read()` 组合或是基于事件驱动型的设计思路采用中断服务程序的方式捕获到来的信息包。 ```cpp void loop() { if(Serial.available()){ char receivedChar = Serial.read(); Serial.print("Received on UART0: "); Serial.println(receivedChar); } if(Serial1.available()){ char receivedChar = Serial1.read(); Serial.print("Received on UART1: "); Serial.println(receivedChar); } if(Serial2.available()){ char receivedChar = Serial2.read(); Serial.print("Received on UART2: "); Serial.println(receivedChar); } } ``` 这段循环体内部包含了检查各个通道是否有新到达字符的动作,并将其打印出来以便观察效果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值