zoukankan      html  css  js  c++  java
  • 单片机实现AT调试命令分享

    单片机实现AT调试命令

    实现目的

    对于日常开发过程,我们经常需要借助串口调试设备,所以增加调试指令并且易于扩展是有必要的

    思路

    1、串口使用中断接收用户参数到接收缓冲区,定义0x0d作为结束标志
    2、调用命令类型解析回调函数AT_DeviceHandle,对命令消息进行分流,然后进入指令类型解析函数
    3、再指令解析函数里面对指令进行分流,分别处理对应的指令以及使用相关参数

    关键实现代码

    // 指令类型处理函数
    static int OnCfgDebug(uint32_t vp_Type, uint32_t vp_P1, uint32_t vp_P2, uint32_t vp_P3)
    {
    	p_info("info:OnCfgDebug:Type=%d,P1=%d,P2=%d,P3=%d.", vp_Type, vp_P1, vp_P2, vp_P3);
    	
    	switch(vp_Type)
    	{
    		case 1:
    		{
    			gTickS = 0;
     			gTickMs = 0;
    			StopTimer(1);
    			gOpenTime = vp_P1;
    			gCloseTime = vp_P2;
    			StartTimer(1);
    			SaveParamToFlash();
    			p_dbg("OK");
    			break;
    		}
    		default:
    			p_info("warn:PARAM INVALID!");
    			break;
    	}
    	
    	return 0;
    }
    
    // 格式:AT+cmdCfg=vl_CmdId,vl_Type,vl_P1,vl_P2,vl_P3
    // vl_CmdId:命令ID
    // vl_Type:指令类型
    // vl_P1,vl_P2,vl_P3:指令参数
    // 例如:AT+cmdCfg=103,1,1,2,3
    static int AT_DeviceHandle(const unsigned char *data_buf)
    {
    	count = 0;
    	
    	uint32_t i, vl_CmdId, vl_Type, vl_P1, vl_P2, vl_P3;
    	uint32_t nlen = strlen((const char *)data_buf);
    	char vl_FormateStr[64]; // 格式化缓冲区
    	
    	vl_CmdId = 0;
    	vl_Type = 0;
    	vl_P1 = 0;
    	vl_P2 = 0;
    	vl_P3 = 0;
    	
            // 至少有一个'='
    	if(!strstr((const char *)data_buf, "="))
    		goto RETURN;
    
    	memset(vl_FormateStr, 0, sizeof(vl_FormateStr)/sizeof(vl_FormateStr[0]));
    	memcpy(vl_FormateStr, "AT+cmdCfg=%d", strlen("AT+cmdCfg=%d"));
    	
    	for (i = 0; i < nlen; i++)
    	{
    		if ((',' == data_buf[i]) && (i < nlen - 1))
    			memcpy(vl_FormateStr + strlen(vl_FormateStr), ",%d", strlen(",%d"));
    	}
    	sscanf((const char *)data_buf, vl_FormateStr, &vl_CmdId, 
    		&vl_Type, &vl_P1, &vl_P2, vl_P3);
    	
    	memset((char *)data_buf, 0, nlen);
    	
    	p_dbg("vl_CmdId=%d, vl_Type=%d, vl_P1=%d, vl_P2=%d, vl_P3=%d", vl_CmdId, vl_Type, vl_P1, vl_P2, vl_P3);
    	if (TIME_CFG_CMD == vl_CmdId)
    		return OnCfgDebug(vl_Type, vl_P1, vl_P2, vl_P3);
    RETURN:
    	return -1;
    }
    

    扩展时,只需要增加消息类型以及对应的指令即可,参数目前默认支持3个,可自行扩展,以及定义数据结构来管理

    Posted By veis
  • 相关阅读:
    [建树(非二叉树)] 1106. Lowest Price in Supply Chain (25)
    [建树(非二叉树)] 1090. Highest Price in Supply Chain (25)
    [并查集] 1118. Birds in Forest (25)
    [二叉树建树&完全二叉树判断] 1110. Complete Binary Tree (25)
    OAuth2 Backend Web Application 验证过程
    我如何介绍 Microservice
    .NET 的 Debug 和 Release build 对执行速度的影响
    ASP.NET MVC 从零开始
    ASP.NET MVC 从零开始
    Visualize The Workshop
  • 原文地址:https://www.cnblogs.com/veis/p/15086204.html
Copyright © 2011-2022 走看看