sdk/UART/SimplUART/APP/uartConsole.c

289 lines
7.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdio.h"
#include "BoardCfg.h"
#include "userTimer.h"
#define ERR_CMP 0xffff
#if(UART_CONSOLE)
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
模块注释
内容:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
typedef struct
{
char cmd[20];
void (*hdl)(u8);
} CONSOLE_HDL;
static u8 UartRecBuff[128] = {0};
static unsigned int ValGetBuff[10];
static float ValGetFloatBuff[10];
static u8 pos = 0;
void ConsoleDealMsg();
/**********************************************************
行注释
内容HAL
**********************************************************/
static volatile u8 UartConsole_ID = TASK_NULL;
/**
* @brief 控制台接收中断
*
*/
void UART0_Handler(void)
{
uint32_t chr;
// Printf("UART0_Handler\n");
if(UART_INTRXThresholdStat(UART0) || UART_INTTimeoutStat(UART0))
{
while(UART_IsRXFIFOEmpty(UART0) == 0)
{
if(UART_ReadByte(UART0, &chr) == 0)
{
if(pos<125){
/**********************************************************
行注释
内容拷贝接收buff
**********************************************************/
UartRecBuff[pos] = chr;
pos++;
/**********************************************************
行注释
内容:提交定时器任务
**********************************************************/
if(UartConsole_ID == TASK_NULL){
UartConsole_ID = UserTimerOutAdd(ConsoleDealMsg,NULL,5);
}else{
UserTimerResetTime(UartConsole_ID,5);
}
}
}
}
}
}
/**********************************************************
行注释
内容:软件层
**********************************************************/
/**
* @brief 测试1
*
* @param cmdCnt
*/
void testDeal(u8 cmdCnt)
{
if (cmdCnt == 0)
{
Printf("testDeal get \n");
}
else
{
Printf("testDeal get cmd:%d,%f\n", ValGetBuff[cmdCnt - 1],ValGetFloatBuff[cmdCnt - 1]);
// printf("testDeal get cmd:%d\n", ValGetBuff[cmdCnt - 1]);
}
}
/**
* @brief 测试2
*
* @param cmdCnt
*/
void testDeal2(u8 cmdCnt)
{
if (cmdCnt == 0)
{
Printf("testDeal2 get \n");
}
else
{
Printf("testDeal2 get cmd:%d,%f\n", ValGetBuff[cmdCnt - 1],ValGetFloatBuff[cmdCnt - 1]);
}
}
static void Console_Flash_Read_ID(u8 cmdCnt){
if (cmdCnt == 0){
Flash_Read_ID();
}
}
static void Console_UART1_Test(u8 cmdCnt){
if (cmdCnt == 0){
extern u32 NetSend(u8 *data, u32 len,u8* destAddr);
u8 data[] = "hello world 111222222223333444555666\n";
u8 destAddr[2] = {0,1};
NetSend(data,sizeof(data),destAddr);
}
}
/**********************************************************
行注释
内容:注册表
**********************************************************/
static const CONSOLE_HDL tisDeal[] = {
{"test", testDeal},
{"test2", testDeal2},
{"flash_read_id",Console_Flash_Read_ID},
{"uart1_test",Console_UART1_Test},
};
/**********************************************************
行注释
内容:软件驱动
**********************************************************/
static u8 StringCmp(const char *cmd, char *rec)
{
u8 result = 1;
while (*cmd != '\0')
{
// printf("%c,%c\n", *cmd, *rec);
if (*cmd != *rec)
{
result = 0;
break;
}
rec++;
cmd++;
}
// printf("%d,%d\n", *cmd, *rec);
if (result == 1)
{
if (*rec != ' ' && *rec != '\0' && *rec != '-' && *rec != 13)
{
// Printf("other err:%d\n",*rec);
result = 0;
}
}
return result;
}
static u8 StringLen(const char *c)
{
u8 len = 0;
while (*c != '\0')
{
len++;
c++;
}
return len;
}
/*
核心解码程序
判读指令和数据
将数据缓存到数据缓存区,并将命令执行
*/
void ConsoleDealMsg()
{
UartRecBuff[pos] = '\0';
pos++;
u16 tisPos = 0;
u16 cmd = 0xffff;
u8 valRec=0;
//数据存储到哪里了
volatile u8 valGet = 0;
//整数缓存
unsigned int tempVal = 0;
//浮点数缓存
float valGetFloat = 0.0;
//浮点数"."扫描
u8 valGetFloatState = 0;
while (pos != 0)
{
// Printf("%c\n", UartRecBuff[tisPos]);
//数值搜索命令
if (UartRecBuff[tisPos] == ' ' || UartRecBuff[tisPos] == '-' || UartRecBuff[tisPos] == '\0' ||
UartRecBuff[tisPos] == 13)
{
if (valRec)
{
//保存扫到的值
ValGetBuff[valGet] = tempVal;
ValGetFloatBuff[valGet] = valGetFloat;
// printf("get val:%d\n",tempVal);
//清理缓存数值
tempVal = 0;
valGetFloat=0.0;
//设置相关标志位
valGetFloatState=0;
valRec = 0;
valGet++;
//执行一下程序,看下是否需要执行指令
if (cmd != 0xffff)
{
tisDeal[cmd].hdl(valGet);
}
}
}
//开始搜索命令
if (UartRecBuff[tisPos] == '-')
{
//搜索到命令,开始处理信息
tempVal = 0; //清除数据
valGet = 0; //清除参数计数
valRec = 0; //清除参数标志
cmd = 0xffff; //清除命令记忆
for (u8 i = 0; i < sizeof(tisDeal) / sizeof(CONSOLE_HDL); i++)
{
if (StringCmp(tisDeal[i].cmd, &UartRecBuff[tisPos + 1]))
{
//记录CMD??ID号
cmd = i;
// printf("cmd:%d\n", i);
//数值指针进行偏移
u8 len = StringLen(tisDeal[i].cmd);
pos = pos - len - 1;
tisPos = tisPos + len + 1;
//执行一下程序,valGet =0
tisDeal[i].hdl(valGet);
}
}
}
//小数符号扫描
if (UartRecBuff[tisPos] == '.')
{
valGetFloatState = 1;
}
// printf("@%c\n", UartRecBuff[tisPos]);
if (UartRecBuff[tisPos] >= '0' && UartRecBuff[tisPos] <= '9')
{
//标记下,找到了数字
valRec=1;
//如果没扫到小数点,直接记录整数部分
if (valGetFloatState == 0)
{
//整数扫描
if (tempVal)
{
tempVal = tempVal * 10 + UartRecBuff[tisPos] - '0';
}
else
{
tempVal = UartRecBuff[tisPos] - '0';
}
//小数部分的整数部分--QAQ--
if (valGetFloat == 0.0)
{
valGetFloat = (UartRecBuff[tisPos] - '0');
}
else
{
valGetFloat = valGetFloat * 10.0 + (UartRecBuff[tisPos] - '0');
}
}
else
{
//小数部分的小数部分--QAQ--
float Temp10 = 1;
for (u8 i = 0; i < valGetFloatState; i++)
{
Temp10 = Temp10 * 0.1;
}
valGetFloatState++;
valGetFloat = valGetFloat + Temp10 * (UartRecBuff[tisPos] - '0');
}
}
pos--;
tisPos++;
}
UartConsole_ID = TASK_NULL;
}
#endif