概述
通过串口输入可以命令可以打印对应的信息
一,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 :%srn",RXHanderdata2_debug);
match_cmd( (char*)RXHanderdata2_debug );
g_rxflag = 0;
test++;
DBG_PRINTF("test:%d rn",test);
}
else
{
}
memset(RXHanderdata2_debug,0,sizeof(RXHanderdata2_debug)); ///<信息缓冲区清零
}
最后
以上就是舒心大船为你收集整理的S32K144之SDK版:UART串口数据解析的全部内容,希望文章能够帮你解决S32K144之SDK版:UART串口数据解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复