我是靠谱客的博主 帅气身影,最近开发中收集的这篇文章主要介绍esp32的uart串口发送16进制通信指令调用实例esp32的uart串口发送16进制通信指令调用实例,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
esp32的uart串口发送16进制通信指令调用实例
简介
最近想用esp32通过uart发送的16进制指令来控制一个语言播放模块,记录一下调用uart的过程,请大佬斧正。比较愚笨,过程中踩了很多坑,如下:
- 将串口号设置为了0,但0串口是已经被设置好用来打印工作状态的串口,导致发送出来的数据混乱
- 没有申请一个内存用来存储要发送的数据,用到数组,但按理说数组指针传递的也是数组第一个数据的指针,(没有想通,会导致前三位数发送不出来)
- 重复调用安装串口函数,导致程序运行到第二个uart_write_bytes()函数时发生错误,函数返回,芯片重启
esp32串口调用流程
- uart驱动安装
#define UART_PORT_NUM (1)
ESP_ERROR_CHECK(uart_driver_install(UART_PORT_NUM, 1024*2, 0, 0, NULL, intr_alloc_flags));
- 给对应uart配置参数
/*这里需要写一个结构体,传递给下面的uart_param_config((),来配置相关参数*/
uart_config_t uart_config = {
.baud_rate = 9600, //波特率
.data_bits = UART_DATA_8_BITS, //发送数据长度
.parity = UART_PARITY_DISABLE, //数据验证方式,这里不要
.stop_bits = UART_STOP_BITS_1, //停止位1位
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE, //硬件流控,不要disable了
.source_clk = UART_SCLK_APB, };
ESP_ERROR_CHECK(uart_param_config(UART_PORT_NUM, &uart_config));
- 配置uart串口对应的gpio
#define TXD (GPIO_NUM_4) //D4是txd
#define RXD (GPIO_NUM_5) //D5是rxd
#define RTS (UART_PIN_NO_CHANGE)
#define CTS (UART_PIN_NO_CHANGE)
ESP_ERROR_CHECK(uart_set_pin(UART_PORT_NUM, TXD, RXD, RTS, CTS));
- 申请一个buffer来存储接受的数据或者发送的数据
uint8_t * tx_buf = (uint8_t *)malloc(6);
/*tx_buf系这个内存的指针啦,这里还不是const类型的指针,因为我还需要使用这个指针来进行写内存,到后面发送数据需要转换成const类型的指针*/
具体流程请参照idf官方文档中对应的uart的内容。
串口调用的完整代码
#ifndef _UART_TASK_H_
/*
*这个头文件中定义了uart使用的gpio和两个需要用到的函数
*/
#define TXD (GPIO_NUM_4) //D4是txd
#define RXD (GPIO_NUM_5) //D5是rxd
#define RTS (UART_PIN_NO_CHANGE)
#define CTS (UART_PIN_NO_CHANGE)
#define UART_PORT_NUM (1) //uart编号
#define UART_BAUD_RATE (9600) //9600波特率
#define intr_alloc_flags = 0; //中断信号为0,不启用中断
/*
*uart_init()函数是用来初始化uart端口的函数,在函数体内进行了串口结构体的定义、驱动安装、传递参数、设置引脚、分配tx的buffer
*函数的返回值是一个uint8_t类型的指针,指针指向malloc函数申请的内存空间(buffer),方便下一个函数使用
*/
uint8_t * UART_INIT()
{ /*定义数据结构*/
uart_config_t uart_config = {
.baud_rate = UART_BAUD_RATE, //波特率,上面define了
.data_bits = UART_DATA_8_BITS, //发送数据长度
.parity = UART_PARITY_DISABLE, //数据验证方式,这里不要
.stop_bits = UART_STOP_BITS_1, //停止位1位
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE, //硬件流控,不要disable了
.source_clk = UART_SCLK_APB, //没看懂这个是什么,一种特殊功能,写0ok
};
/*安装驱动*/
ESP_ERROR_CHECK(uart_driver_install(UART_PORT_NUM, 1024*2, 0, 0, NULL, intr_alloc_flags));
ESP_ERROR_CHECK(uart_param_config(UART_PORT_NUM, &uart_config));
ESP_ERROR_CHECK(uart_set_pin(UART_PORT_NUM, TXD, RXD, RTS, CTS));
/*申请buffer内存*/
uint8_t * tx_buf = (uint8_t *)malloc(6); //申请6字节内存
*tx_buf = 0xAA;
*(tx_buf+1) = 0x07;
*(tx_buf+2) = 0x02;
*(tx_buf+3) = 0x00;
return(tx_buf); //返回buffer指针
}
/*
*UART_TaskCreate()函数有两个形参,int mode是需要被播放的音频的编号,uint8_t *是buffer的指针,即UART_INIT()函数的返回值
*/
void UART_TaskCreate(int mode,uint8_t * tx_buf)
{
/*根据不同的曲目更改uart的tx——buffer中的数值*/
switch (mode)
{
case 0:
*(tx_buf+4) = 0x01;*(tx_buf+5) = 0xB4;
break;
case 1:
*(tx_buf+4) = 0x02;*(tx_buf+5) = 0xB5;
break;
case 2:
*(tx_buf+4) = 0x03;*(tx_buf+5) = 0xB6;
break;
case 3:
*(tx_buf+4) = 0x04;*(tx_buf+5) = 0xB7;
break;
case 4:
*(tx_buf+4) = 0x05;*(tx_buf+5) = 0xB8;
break;
case 5:
*(tx_buf+4) = 0x06;*(tx_buf+5) = 0xB9;
break;
case 6:
*(tx_buf+4) = 0x07;*(tx_buf+5) = 0xBA;
break;
default:
break;
}
/*写数据到uart的FIFO里,开始发送数据*/
uart_write_bytes(UART_PORT_NUM,(const uint8_t *)tx_buf,6);
}
#endif
主函数
主函数中只需要调用上面的头文件中的uaet_init()函数一次,传回内存地址后,传递给UART_TaskCreate()用就行,因为我的程序中发送数据贯穿始终,要用很多次,所以我直接给它申请一个6个字节的内存,生命周期从init开始到主函数结束。
最后
以上就是帅气身影为你收集整理的esp32的uart串口发送16进制通信指令调用实例esp32的uart串口发送16进制通信指令调用实例的全部内容,希望文章能够帮你解决esp32的uart串口发送16进制通信指令调用实例esp32的uart串口发送16进制通信指令调用实例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复