289 lines
7.7 KiB
C
289 lines
7.7 KiB
C
#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 |