我是靠谱客的博主 帅气身影,最近开发中收集的这篇文章主要介绍esp32的uart串口发送16进制通信指令调用实例esp32的uart串口发送16进制通信指令调用实例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

esp32的uart串口发送16进制通信指令调用实例

简介

最近想用esp32通过uart发送的16进制指令来控制一个语言播放模块,记录一下调用uart的过程,请大佬斧正。比较愚笨,过程中踩了很多坑,如下:

  1. 将串口号设置为了0,但0串口是已经被设置好用来打印工作状态的串口,导致发送出来的数据混乱
  2. 没有申请一个内存用来存储要发送的数据,用到数组,但按理说数组指针传递的也是数组第一个数据的指针,(没有想通,会导致前三位数发送不出来)
  3. 重复调用安装串口函数,导致程序运行到第二个uart_write_bytes()函数时发生错误,函数返回,芯片重启

esp32串口调用流程

  1. uart驱动安装
#define UART_PORT_NUM      (1)
ESP_ERROR_CHECK(uart_driver_install(UART_PORT_NUM, 1024*2, 0, 0, NULL, intr_alloc_flags));
  1. 给对应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));
  1. 配置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));
  1. 申请一个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进制通信指令调用实例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部