本帖最后由 mingxiangjun 于 2024-7-14 15:41 编辑
基础任务:串口调试 一、说明 在嵌入式领域,在没有GUI情况下,串口调试很重要,如输入“ver”查询版本号,输入“chip”回应芯片信息等等。由于C的可移植性,先简单在PC模拟一下,再移植到MCU: 二、编码 可直接在例程UART_Transmit_and_Receive基础上进行修改,新建cmd.h: - #ifndef __CMD_H__
- #define __CMD_H__
- typedef void (*pCmd)(void);
- typedef struct{
- char *cmdName;
- pCmd cmdHandler;
- }cmdTab_t;
- extern cmdTab_tcmdList[];
- extern int cmdNum;
- #endif
Cmd.c: - #include <stdio.h>
- #include "cmd.h"
- void verHandler(void);
- void chipHandler(void);
- cmdTab_t cmdList[]=
- {
- {"ver",verHandler},
- {"chip",chipHandler}
- };
- int cmdNum=sizeof(cmdList)/sizeof(cmdTab_t);
- void verHandler()
- {
- printf("%s%s\n",__DATE__,__TIME__);
- }
- void chipHandler()
- {
- printf("Infineon CYW20829\n");
- }
主函数添加shell指令处理流程: - #include "cmd.h"
- #include <string.h>
- #defineBUFF_SIZE (64)
- char txBuff[BUFF_SIZE];
- char rxBuff[BUFF_SIZE];
- volatile bool rxEnd = 0;
- volatile int txBuffIndex= 0;
- volatile int rxBuffIndex= 0;
主循环: - for (;;)
- {
- if (CY_RSLT_SUCCESS == cyhal_uart_getc(&cy_retarget_io_uart_obj,
- (uint8_t *)&rxBuff[rxBuffIndex],0))
- {
- if(rxBuff[rxBuffIndex]=='\r'||rxBuff[rxBuffIndex]=='\n')
- {
- rxEnd=1;
- }
- else
- rxBuffIndex++;
- if(rxEnd==1&&rxBuffIndex!=0)
- {
- rxBuff[rxBuffIndex]='\0';
- inti=0;
- for(;i<cmdNum;i++)
- {
- if(strcmp(rxBuff,cmdList.cmdName)==0)
- {
- printf("%s\n",rxBuff);//回显
- cmdList.cmdHandler();
- break;
- }
- }
- if (i==cmdNum)
- {
- printf("Cmd not found\n");
- }
- rxBuffIndex=0;
- }
- rxEnd=0;
- }
- else
- {
- handle_error();
- }
- }
三、效果 可以看到单线程死循环能很好执行指令并返回结果,和PC上效果一致:
|