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

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

一、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 24


static 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);
}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值