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进制通信指令调用实例相关推荐

  1. python3.6串口编程实例_Python3 串口接收与发送16进制数据包的实例

    Python3 串口接收与发送16进制数据包的实例 如下所示: import serial import string import binascii s=serial.Serial('com4',9 ...

  2. java串口发送16进制数据_MFC串口通信发送16进制数据的方法

    本文实例为大家分享了MFC串口通信发送16进制数据的具体代码,供大家参考,具体内容如下 MFC串口通信会使用m_mscomm控件. 发送数据一般是在edit control 里输入自己想发送的内容,然 ...

  3. STM32串口发送16进制数据

    方法一(用printf函数) 下面演示两个示例 //说明:用u8或unsigned char都能正常发送//示例 1 u8 send1=0x55; printf("%c",send ...

  4. java串口发送16进制_串口发送数据——字符串发送与十六进制发送的区别

    在计算机中,数据是以二进制的形式存储的,例如十进制 1(10)在计算机中用 0000 0001(2)来表示.我们在用串口发送数据的时候首先将待数据转换为对应的ASCII码,然后再将这些ASCII码按照 ...

  5. matlab上位机串口通信中如何发送16进制数,而不是当做ASCII字符发送(已实测成功)

    转载 (找了很长时间,朋友帮忙找到了发送方法) https://zhidao.baidu.com/question/383761631.html 用matlab发送16进制数据,可以用fwrite直接 ...

  6. 关于arduino和zigbee串口16进制通信问题

    2019独角兽企业重金招聘Python工程师标准>>> 这几天我做毕业设计遇到的问题.这个问题就是我的uno板子怎样和zigbee通信起来.先说说我的思路,把uno做成一个网关,从而 ...

  7. 串口调试助手 发送16进制与现实16进制数据

    话不多说,直接干货. 使用串口助手发送16进制数据: 如图所示:第一步,选中16进制发送. 第二步:输入你要发送的数据(所有的16进制数据去掉0x符号) 第三步:点击16进制显示 第四步:查看返回值 ...

  8. 使用串口调试助手发送16进制数

    发送16进制的1(即0x01),应该写01,不能去掉前面的0,更不能写成0x01

  9. python socket发送16进制数据_Python UDP Socket 16进制数据发送

    注:此篇文章首次发表于我的一篇CSDN博客里边,现转载于此. 今天琢磨了一下Python UDP Socket 16进制数据发送. 原以为UDP发送和接受的都是字符,怎么能够发送16进制?但细想,其实 ...

最新文章

  1. c#读写XML文件 (转)
  2. 如何在WIN7上添加磁盘
  3. XCode修改工程名注意
  4. GDCM:gdcm::ImageHelper的测试程序
  5. pytorch学习2:pytorch搭建Alexnet网络
  6. 傲腾服务器系统,英特尔傲腾加速 释放数据价值
  7. PIC单片机开发环境搭建
  8. hdu2844 Coins -----多重背包+二进制优化
  9. Python:学习笔记之函数的参数和返回值
  10. Oracle视图传递参数
  11. 第 7 章 Neutron - 067 - Neutron 架构
  12. vi不保存退出的命令
  13. 用大白话聊聊JavaSE -- 如何理解Java Bean(一)
  14. centos/redhat kernel-debug-info-xx.rpm与kernel-debuginfo-xx.rpm区别
  15. 2021-11-12号-java面试题-北京
  16. iqn怎么查 linux_Linux下配置iscsi-initiator - 存储资源
  17. java电商商品基本信息表,Java生鲜电商平台-商品表的设计
  18. Java经典入门教程!java工程师的进阶之路
  19. [Codewar练习-java]Snail Sort(蜗牛型排序)
  20. Altera DDR3调试记录

热门文章

  1. Spring框架(五):Spring事务简述(注解方式)
  2. sdut-String-1 识蛟龙号载人深潜,立科技报国志
  3. 中毒的硬盘如何恢复文件呢
  4. 每天定时提醒 每周定时提醒
  5. Excle条件格式与公式
  6. python bootstrap安装_Django配置Bootstrap, js实现过程详解
  7. DT观察 | DT时代的核心价值是什么?听听马云和彭蕾怎么说
  8. php许愿墙参考文献,许愿墙论文,关于我家的许愿墙相关参考文献资料-免费论文范文...
  9. python思想读后感_数据结构与算法:Python语言描述读后感1000字
  10. openssl 读状态机