S32K144之SDK版:UART串口数据解析

通过串口输入可以命令可以打印对应的信息

一,uart2.c文件

/******************************************************************************/
#include"Cpu.h"
#include <stdio.h>
#include <string.h>
#include "stdarg.h"
#include <stdint.h>
#include <stdbool.h>

#include "main.h"
#include "queue.h"
#include "dri_lpuart2.h"
/******************************************************************************/
/*-------------------------Function Prototypes--------------------------------*/
/******************************************************************************/

/******************************************************************************/
/*-----------------------------------Macros-----------------------------------*/
/******************************************************************************/
#define RX2_BUFFER_SIZE 5U
#define TX2_BUFFER_SIZE 300U
/******************************************************************************/
/*-----------------------------Data Structures--------------------------------*/
/******************************************************************************/

/******************************************************************************/
/*------------------------------Global variables------------------------------*/
/******************************************************************************/
uint8_t rx2data[RX2_BUFFER_SIZE];
char    tx2data[TX2_BUFFER_SIZE];
uint8_t RXHanderdata2[15];
/******************************************************************************/
/*-------------------------Function Implementations---------------------------*/
/******************************************************************************/
QueueHandle_t g_QueueLpuart2RXData= NULL;             /// UART2接收数据队列
/******************************************************************************/
/*-------------------------Function Prototypes--------------------------------*/
/******************************************************************************/
void u2_Printf(char* fmt,...)
{
    va_list ap;
    va_start(ap,fmt);
    vsprintf((char*)tx2data,fmt,ap);
    va_end(ap);
    LPUART_DRV_SendDataBlocking(INST_LPUART2, (uint8_t *)tx2data, strlen(tx2data),20);
}

void DRI_Lpuart2_RX_ISR (void *driverState, uart_event_t event, void *userData)
 {
    (void) driverState;
    (void) userData;

    /*串口接收缓存满事件,每次接收一个字节,就用放进消息队列*/
    if(event==UART_EVENT_RX_FULL)
    {
        xQueueSendFromISR(g_QueueLpuart2RXData,&rx2data[0],NULL);
        LPUART_DRV_SetRxBuffer(INST_LPUART2, &rx2data[0], 1U);
    }
}
/**
 * @name      LPUART2_Init
 * @brief    LPUART2 module initialize
 * @parameter   void
 * @return  void
 *
 */

void DRI_Lpuart2_Init(void)
{
    LPUART_DRV_Init(INST_LPUART2, &lpuart2_State, &lpuart2_InitConfig0); //初始化串口
    INT_SYS_SetPriority(LPUART2_RxTx_IRQn,configLIBRARY_LOWEST_INTERRUPT_PRIORITY);   ///<设置优先级小,数值越大  这个函数有问题
    LPUART_DRV_InstallRxCallback(INST_LPUART2,DRI_Lpuart2_RX_ISR, NULL);//安装接收中断回调函数
    LPUART_DRV_ReceiveData(INST_LPUART2, rx2data, 1); //开启串口接收,每次接收一个字节,并安装中断
    g_QueueLpuart2RXData = xQueueCreate( 30, sizeof(uint8_t) );
    ///注册打印数据 Communication_RXPrintf自己定义的
    debug_register_Extern("ComRx",Communication_RXPrintf);
    debug_register_Extern("ComTx",Communication_TXPrintf);
}

void DRI_Lpuart2_Main(void)
{

}

二,debug.h文件

#ifndef DEBUG_H_
#define DEBUG_H_

#define     ARRAY_SIZE(x)   (sizeof(x) / (sizeof((x)[0])))          //用来计算结构体数组中,数组的个数。个数=结构体总长度/单个数组长度
#define     MAX_CMD_LENGTH      15                              // 最大命令名长度
#define     MAX_CMDS_COUNT      10                              // 最大命令数
/******************************************************************************/
/*-----------------------------Data Structures--------------------------------*/
/******************************************************************************/
typedef void ( *functions )( void );                            // 命令操作函数指针类型

///命令结构体类型 用于存储字符串命令和对应函数
typedef struct
{
    char cmd_name[MAX_CMD_LENGTH + 1];                          // 命令名 字符串末尾系统会自动添加结束符'/0'    sizeof("name")大小为 10
    functions cmd_functions;                                    // 命令操作函数     sizeof(func) 大小为 2
}CMD_Name_Func;

///命令列表结构体类型  用于存储字符串命令数组
typedef struct
{
    CMD_Name_Func cmdNames[MAX_CMDS_COUNT];                     // 存储字符串命令 和对应函数
    int num;                                                    // 命令数组个数
}CMD_LIST;
/******************************************************************************/
/*-------------------------Function Prototypes--------------------------------*/
/******************************************************************************/
extern  void DeBug_Init(void);
extern  void DeBug_Task(void);
extern  void debug_register_Extern( char cmd_name[],void ( *functions )( void ));
#endif /* DEBUG_H_ */

三,debug.c文件

#include <string.h>
#include "task.h"
#include "queue.h"
#include "debug.h"

/******************************************************************************/
/*-----------------------------Data Structures--------------------------------*/
/******************************************************************************/
CMD_LIST command_list ;  /// 全局命令列表,保存已注册命令集合
/******************************************************************************/
/*------------------------------Global variables------------------------------*/
/******************************************************************************/
static uint8_t g_rxflag;
char RXHanderdata2_debug[15];
uint8_t g_uart2RcvIndex = 0;
static uint8_t test = 0;
/******************************************************************************/
/*-------------------------Function Implementations---------------------------*/
/******************************************************************************/
/*
* 函数介绍: 命令注册函数 每新添加一个命令,就添加到命令列表中
* 输入参数: reg_cmds 待注册命令结构体数组
*            length   数组个数
* 输出参数: 无
* 返回值 :  无
* 备    注: length 不得超过 MAX_CMDS_COUNT
*/
static void register_cmds( CMD_Name_Func reg_cmds[], int length )
{
    int i;

    if ( length > MAX_CMDS_COUNT )
    {
        return;
    }

    for ( i = 0; i < length; i++ )
    {
        if ( command_list.num < MAX_CMDS_COUNT ) // 命令列表未满
        {
            strcpy( command_list.cmdNames[command_list.num].cmd_name, reg_cmds[i].cmd_name );       //将字符串命令拷贝到列表中
            command_list.cmdNames[command_list.num].cmd_functions = reg_cmds[i].cmd_functions;      //将命令对应的函数存储在列表中
            command_list.num++;                                                                     // 数量值默认为0,每添加一个命令,数量加1.
        }
    }
}

/*
* 函数介绍: 命令匹配执行函数
* 输入参数: cmdStr 待匹配命令字符串
* 输出参数: 无
* 返回值 :  无
* 备    注: cmdStr 长度不得超过 MAX_CMD_NAME_LENGTH
*/
static void match_cmd( char *cmdStr )
{
    uint8_t i;

    if ( strlen( cmdStr ) > MAX_CMD_LENGTH )
    {
        return;
    }

    for ( i = 0; i < command_list.num; i++ )                                    // 遍历命令列表
    {
        if ( strcmp( command_list.cmdNames[i].cmd_name, cmdStr ) == 0 )         //比较接收到的命令字符串 和 列表中存储的命令字符串是否相等,如果相等就调用命令字符串对应的函数。
        {
            command_list.cmdNames[i].cmd_functions();
        }
    }
}


static void debug_register( void )
{
    ///初始化 字符串命令和对应函数
    CMD_Name_Func debug_cmds[] =
    {
        {"CPUStatus", Printf_CPU_RunStatus},                  // 一个结构体变量大小为 12 (字符串大小10 + 函数名大小2)
        {"CPUTime", Printf_CPU_RunTime},                      // 一个结构体变量大小为 12
        {"MCUFre", Printf_MCU_Frequency},                     // 一个结构体变量大小为 12
    };
    ///将命令添加到列表中
    register_cmds( debug_cmds, ARRAY_SIZE( debug_cmds ) );  // ARRAY_SIZE 用来计算结构体数组中,数组的个数。个数=结构体总长度/单个数组长度
}

void debug_register_Extern( char cmd[],void ( *functions )( void ))
{
    ///初始化 字符串命令和对应函数
    CMD_Name_Func debug_cmds[] =
    {
        {
                .cmd_functions = functions,
        },
    };
    strcpy( debug_cmds[0].cmd_name, cmd );
    ///将命令添加到列表中
    register_cmds( debug_cmds, ARRAY_SIZE( debug_cmds ) );  // ARRAY_SIZE 用来计算结构体数组中,数组的个数。个数=结构体总长度/单个数组长度
}

/**
 * @name     DeBug_Init
 * @brief    PowerMange module initialize
 * @parameter   void
 * @return  void
 *
 */
void DeBug_Init(void)
{
    debug_register();
}

void DeBug_Task(void)
{

    ///从消息队列中接收串口2的数据
    for(g_uart2RcvIndex = 0; g_uart2RcvIndex < 15; g_uart2RcvIndex++)
    {
        if ( pdTRUE == xQueueReceive( g_QueueLpuart2RXData, &RXHanderdata2_debug[g_uart2RcvIndex], 0 ) )
        {
            g_rxflag = 1;
        }
        else
        {
            ///接收完成退出本次接收
            break;
        }
    }

    ///处理接收到的数据
    if ( 1 == g_rxflag )
    {
        u2_Printf("Uart2  Receive data :%s\r\n",RXHanderdata2_debug);
        match_cmd( (char*)RXHanderdata2_debug );
        g_rxflag = 0;
        test++;
        DBG_PRINTF("test:%d \r\n",test);
    }
    else
    {

    }

    memset(RXHanderdata2_debug,0,sizeof(RXHanderdata2_debug)); ///<信息缓冲区清零

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值