[AIROC™ 蓝牙] 【英飞凌CYW20829测评】基础任务:串口调试

[复制链接]
1179|13
 楼主| mingxiangjun 发表于 2024-7-14 15:29 | 显示全部楼层 |阅读模式
本帖最后由 mingxiangjun 于 2024-7-14 15:41 编辑

基础任务:串口调试
一、说明
    在嵌入式领域,在没有GUI情况下,串口调试很重要,如输入“ver”查询版本号,输入“chip”回应芯片信息等等。由于C的可移植性,先简单在PC模拟一下,再移植到MCU:
二、编码
    可直接在例程UART_Transmit_and_Receive基础上进行修改,新建cmd.h:
  1. #ifndef __CMD_H__
  2. #define __CMD_H__
  3. typedef void (*pCmd)(void);
  4. typedef struct{
  5.     char *cmdName;
  6.     pCmd cmdHandler;
  7. }cmdTab_t;
  8. extern cmdTab_tcmdList[];
  9. extern int cmdNum;
  10. #endif
Cmd.c:
  1. #include <stdio.h>
  2. #include "cmd.h"
  3. void verHandler(void);
  4. void chipHandler(void);
  5. cmdTab_t cmdList[]=
  6. {
  7.     {"ver",verHandler},
  8.     {"chip",chipHandler}
  9. };
  10. int cmdNum=sizeof(cmdList)/sizeof(cmdTab_t);
  11. void verHandler()
  12. {
  13.     printf("%s%s\n",__DATE__,__TIME__);
  14. }
  15. void chipHandler()
  16. {
  17.     printf("Infineon CYW20829\n");
  18. }
主函数添加shell指令处理流程:
  1. #include "cmd.h"
  2. #include <string.h>
  3. #defineBUFF_SIZE                  (64)
  4. char txBuff[BUFF_SIZE];
  5. char rxBuff[BUFF_SIZE];
  6. volatile bool rxEnd = 0;
  7. volatile int txBuffIndex= 0;
  8. volatile int rxBuffIndex= 0;
主循环:
  1.     for (;;)
  2.     {
  3.         if (CY_RSLT_SUCCESS == cyhal_uart_getc(&cy_retarget_io_uart_obj,
  4.                                               (uint8_t *)&rxBuff[rxBuffIndex],0))
  5.         {
  6.          if(rxBuff[rxBuffIndex]=='\r'||rxBuff[rxBuffIndex]=='\n')
  7.          {
  8.             rxEnd=1;
  9.          }
  10.          else
  11.             rxBuffIndex++;
  12.          if(rxEnd==1&&rxBuffIndex!=0)
  13.          {
  14.             rxBuff[rxBuffIndex]='\0';
  15.             inti=0;
  16.             for(;i<cmdNum;i++)
  17.             {
  18.                 if(strcmp(rxBuff,cmdList.cmdName)==0)
  19.                 {
  20.                     printf("%s\n",rxBuff);//回显
  21.                     cmdList.cmdHandler();
  22.                     break;
  23.                 }
  24.             }
  25.                 if (i==cmdNum)
  26.                 {
  27.                    printf("Cmd not found\n");
  28.                 }
  29.                rxBuffIndex=0;
  30.          }
  31.          rxEnd=0;
  32.         }
  33.         else
  34.         {
  35.            handle_error();
  36.         }
  37.     }

三、效果
    可以看到单线程死循环能很好执行指令并返回结果,和PC上效果一致:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

@qintian0303 :都是基于eclipse,有类似STM32CubeMX的图形化初始代码生成工具、工程生成器、烧录器等等,用过就知道了  发表于 2024-7-15 22:36
英飞凌的开发环境特殊吗?  发表于 2024-7-15 15:18
louyj 发表于 2024-7-15 09:47 | 显示全部楼层
不错,学习一下。
逢dududu必shu 发表于 2024-8-17 01:01 | 显示全部楼层
cmd.h: 头文件定义了命令处理器的结构体和全局变量。
Amazingxixixi 发表于 2024-10-30 16:37 | 显示全部楼层
串口调试好了基本上就可以实现互通了
地瓜patch 发表于 2024-10-30 18:25 来自手机 | 显示全部楼层
不错,用的查询接收
中国龙芯CDX 发表于 2024-10-30 19:06 | 显示全部楼层
单线程死循环能很好执行指令并返回结果
小夏天的大西瓜 发表于 2024-10-30 20:14 | 显示全部楼层
串口调试非常方便
小小蚂蚁举千斤 发表于 2024-10-30 22:39 | 显示全部楼层
UART_Transmit_and_Receive串口基础通讯案例
哈根达斯uz 发表于 2025-2-28 21:00 | 显示全部楼层
使用 cmdTab_t 结构体来管理命令和命令处理函数。
xiaoqi000 发表于 2025-4-30 16:54 | 显示全部楼层
在没有图形用户界面的嵌入式系统中,串口调试是一种常见的交互方式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部