你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103实现类似SHELL命令调试

[复制链接]
寂寞,点燃一支烟 发布时间:2018-7-12 10:29
楼主也是参考别人整理的,主要是为了和我一样的菜鸟 进行 CTRI+C  CTRL+V 做的准备  让你一分钟就移植成功,后续我再做在操作系统TreeRTOS下的,当前别人可以做一下 方便我们学习,不BB了,看效果图:

命令结束符是回车  这个主意一下 ,不然就是未识别命令,我估计很多人会用SecureCRT 这类软件,这个是可以用的,自己配置一下就OK






代码解析概要:
中断接收处理: 这段代码的方式大家应该陌生,收到之后缓存
int i;
unsigned char ch;
void USART1_IRQHandler(void)
{            
          ch = getchar();
                  if(ch!=0)
                        {
                                cmd[i++] = ch;
                                if(i>CMD_MAX_LENGTH)
                                {
                                        i = 0;
                                }                       
                                if((cmd[i-1]=='\n')&&(cmd[i-2]=='\r'))
                                {
                                        cmd[i-1]=0;
                                        cmd[i-2]=0;       
                                        i=0;
                                        flag=1 ;


                                }       
                  }
}

重定向C语言函数
int fgetc(FILE *f)
{
        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
        return (uint8_t)USART_ReceiveData(USART1);
}
int fputc(int ch, FILE *f)
{
        USART_SendData(USART1, ch);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
        return ch;


}



命令缓存


tCmdLineEntry g_sCmdTable[ ] =
{
    {"help",        Cmd_help,"\t\tisplay list of commands\r\n" },
    {"?",           Cmd_help,"\t\tisplay list of commands\r\n" },
    {"getbaud",     Cmd_get_baud,"\t\t:Get the current baud rate\r\n"},
   {"getstate",    Cmd_get_state,"\t:Get the current flag state\r\n"},
   {"setstate",    Cmd_set_state,"\t:Set the current flag state \r\n"},
    {"resetmcu",    Cmd_MCU_Reset,"\t:Reset MCU\r\n"},
    {0,0,0}
};




这个 格式就是 输入的命令   函数名字   提示符
自己往里面加就可以了
至于这些函数自己实现就行了
int Cmd_get_baud(int argc, char *argv[])
{
        uint32_t baud=115200;
    uint8_t APP_Data[8]={ 0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x55};//»ñȡЭÒéÊý¾Ý
        uint8_t i;
    printf("baud= %d\r\n",baud);
    for(i=0;i<8;i++)
    {
        printf("APP_Data[%d]=%-d\t",i,APP_Data);
    }
    return 0;
}


就这样:
注意  很多和我一样的菜鸟不玩linux 可能对函数int Cmd_get_baud(int argc, char *argv[]) 不是很懂,建议百度 秒懂


命令解析部分  可以不用管 看这个函数  主要就是提取解析 结束符和 上面红色函数的参数,其实我也不是很懂,有能力的可以详细解释一下


int CmdLineProcess(char *pcCmdLine)


main函数
while(1)
{
        if(flag)
                {
                        if(CMDLINE_BAD_CMD == CmdLineProcess(cmd))
                        {
                                printf("unkown command, please input \"help\" \n\r");
                        }
                        flag=0;
                       
                }



}
打工搞成 ,记得选Use MicroLIB 不然可能会死机哦  如果自己修改过不用这个库的话   就不必要做了
                SHELL.rar (1.57 MB, 下载次数: 183)
baud.png
CMD.png
help.png

评分

参与人数 2 ST金币 +12 收起 理由
creep + 10 很给力!
MrJiu + 2 赞一个!

查看全部评分

1 收藏 3 评论11 发布时间:2018-7-12 10:29

举报

11个回答
寂寞,点燃一支烟 回答时间:2018-7-12 10:32:00
提交了之后发现  那个tCmdLineEntry g_sCmdTable【】出现了表情 这个是字符格式个表情重复了 ,不惜在意
源代码没有问题!
MrJiu 回答时间:2018-7-12 11:03:20
建议也把工程文件发上来!!!
creep 回答时间:2018-7-12 13:50:16
支持!!!
andey 回答时间:2018-7-12 17:28:00
提示: 作者被禁止或删除 内容自动屏蔽
西点钟灵毓秀 回答时间:2018-7-12 20:02:13
bucuo 不错不错
anobodykey 回答时间:2018-7-12 21:41:46
感谢楼主分享
寂寞,点燃一支烟 回答时间:2018-7-13 14:06:27
MrJiu 发表于 2018-7-12 11:03
建议也把工程文件发上来!!!

提交了啊 ,欢迎下载
寂寞,点燃一支烟 回答时间:2018-7-13 14:06:48

谢谢大神
wujique 回答时间:2018-7-14 18:27:41
我有移植UBOOT的命令行到407
zero99 回答时间:2018-7-16 17:11:53
赞一个
寂寞,点燃一支烟 回答时间:2018-7-25 09:25:38
huangxuejia-292 发表于 2018-7-14 18:27
我有移植UBOOT的命令行到407

欢迎分享

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版