【ESP32】C语言映射表在嵌入式串口解析中的应用

2023-10-17 20:20

本文主要是介绍【ESP32】C语言映射表在嵌入式串口解析中的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文章主要以ESP32开发环境为例记录,C语言映射表在嵌入式串口解析中的应用

【ESP32】C语言映射表在嵌入式串口解析中的应用

    • 一、C语言映射表在串口数据解析中的应用
      • 1、数据结构
      • 2、指令、函数映射表
      • 3、串口解析函数实现
    • 二、实验现象
    • 三、实验代码

一、C语言映射表在串口数据解析中的应用

1、数据结构

typedef struct 
{char CMD[CMDLen];unsigned char (*cmd_operate)(char *data);
}Usart_Tab;

2、指令、函数映射表

static const Usart_Tab InstructionList[CMDMax]=
{{"PWON",PowOn},{"PWOFF",PowOff},
};

3、串口解析函数实现

/* 串口解析函数实现 */
unsigned char DataAnalysis(char *buf)
{unsigned char i,Result = 0;int NEXT=0;for(i=0;i<CMDMax;i++){NEXT=strcmp((char *)buf,(char*)InstructionList[i].CMD);if(NEXT==0){Result = (InstructionList[i].cmd_operate)(buf) ;break;}}return Result;
}

二、实验现象

请添加图片描述

三、实验代码

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart.h"
#include "string.h"
#include "driver/gpio.h"#include "ring_buffer.h"static const int RX_BUF_SIZE = 1024;#define TXD_PIN (GPIO_NUM_4)
#define RXD_PIN (GPIO_NUM_5)#define CMDMax 2
#define CMDLen 24static unsigned char PowOn(char *data);
static unsigned char PowOff(char *data);/* 数据结构定义 */
typedef struct 
{char CMD[CMDLen];unsigned char (*cmd_operate)(char *data);
}Usart_Tab;typedef unsigned char (*usartfuncp)(char *data);/* 指令、函数映射表 */
static const Usart_Tab InstructionList[CMDMax]=
{{"PWON",PowOn},{"PWOFF",PowOff},
};/* 串口解析函数实现 */
unsigned char DataAnalysis(char *buf)
{unsigned char i,Result = 0;int NEXT=0;for(i=0;i<CMDMax;i++){NEXT=strcmp((char *)buf,(char*)InstructionList[i].CMD);if(NEXT==0){Result = (InstructionList[i].cmd_operate)(buf) ;break;}}return Result;
}static unsigned char PowOn(char *data)
{printf("%s \r\n",data);return 0;
}static unsigned char PowOff(char *data)
{printf("%s \r\n",data);return 0;
}void uart_init(void) {const 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,.source_clk = UART_SCLK_APB,};// We won't use a buffer for sending data.uart_driver_install(UART_NUM_1, RX_BUF_SIZE * 2, 0, 0, NULL, 0);uart_param_config(UART_NUM_1, &uart_config);uart_set_pin(UART_NUM_1, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);static void rx_task(void *arg)
{static const char *RX_TASK_TAG = "RX_TASK";esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE+1);while (1) {const int rxBytes = uart_read_bytes(UART_NUM_1, data, RX_BUF_SIZE, 100 / portTICK_RATE_MS);if (rxBytes > 0) {data[rxBytes] = '\0';ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);//ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);DataAnalysis((char *)data);//ring_buffer_writeArry(&ring_buffer,(const char*)data,rxBytes);}}free(data);
}void app_main(void)
{uart_init();ring_buffer_init(&ring_buffer, buf_arr, sizeof(buf_arr));xTaskCreate(rx_task, "uart_rx_task", 1024*2, NULL, configMAX_PRIORITIES, NULL);//xTaskCreate(tx_task, "uart_tx_task", 1024*2, NULL, configMAX_PRIORITIES-1, NULL);
}
}

这篇关于【ESP32】C语言映射表在嵌入式串口解析中的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/227742

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R