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

STM32F103实现类似SHELL命令调试

[复制链接]
寂寞,点燃一支烟 发布时间:2018-7-12 10:29
楼主也是参考别人整理的,主要是为了和我一样的菜鸟 进行 CTRI+C  CTRL+V 做的准备  让你一分钟就移植成功,后续我再做在操作系统TreeRTOS下的,当前别人可以做一下 方便我们学习,不BB了,看效果图:
0 Q  w4 F. b6 b/ s# a6 g
# U. R1 p, U% H. ^+ |
命令结束符是回车  这个主意一下 ,不然就是未识别命令,我估计很多人会用SecureCRT 这类软件,这个是可以用的,自己配置一下就OK7 K# d3 Q" e/ L% E3 U

* t: V9 V7 e+ w/ N0 {" k

' c) `% D2 x' @4 O: O$ ^' b2 @) }) U6 H% \6 I
8 D6 c) Z3 J' |) c
# {1 y0 ^/ O# A: q+ D: l7 }

2 P: B, `$ o; k( J8 S& h代码解析概要:  Z  x) E9 s! T# _% w9 J: Y, i6 i1 u
中断接收处理: 这段代码的方式大家应该陌生,收到之后缓存. M1 x6 W' {$ `" V
int i;0 j" s- k, D+ K  Y
unsigned char ch;( X5 n" ?3 U9 l6 K
void USART1_IRQHandler(void)/ e0 o5 a4 l) ]" Y: D
{            
' \4 a- Q  {$ \2 m" b9 Q, q          ch = getchar();
/ a) }+ Q  O1 `# f/ L/ S                  if(ch!=0)  ?9 |" e0 R( T$ Y% P
                        {1 f0 k# L" i  ]$ ~8 W- n
                                cmd[i++] = ch;. R5 c/ O( @) {4 {
                                if(i>CMD_MAX_LENGTH)2 D3 e2 u( E4 z
                                {
9 Y1 G$ w. e& U! x                                        i = 0;: [: ?( R3 ~+ X) t
                                }                       
+ _5 ^8 l  d8 W  v" k) y                                if((cmd[i-1]=='\n')&&(cmd[i-2]=='\r'))
5 E# w' @5 o2 }" U1 |  g2 e0 ?                                {
  p' {6 y8 [% R* d2 h0 O, K. j( l                                        cmd[i-1]=0;7 ^/ j3 x+ e0 u
                                        cmd[i-2]=0;        ! m0 [; k- t7 K
                                        i=0; $ p( I% ^/ G: S; i
                                        flag=1 ;
3 t% Q& G, h  c" a- L0 w; g  x, X: A" s$ `: @( s$ s$ G

' C7 P7 p4 ?& R$ S9 p                                }        3 R% E8 g, C0 X9 S5 @
                  }
; ?1 `5 u2 j& h& Q' P }8 m  f, U! x9 m3 t5 X9 L. i
/ W/ E) p% B7 n
重定向C语言函数
: _3 H$ {* M: n. c1 l& \' {int fgetc(FILE *f)+ e- s% M) D4 z  |, L
{' k% c# z+ ^9 h4 S2 _
        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
# v- u% z3 Q/ Y! b6 o        return (uint8_t)USART_ReceiveData(USART1);
8 u; c8 a/ d5 v; S! I* M}
6 f" F$ o+ P5 l" Q+ |9 }int fputc(int ch, FILE *f)7 @) ]% `1 K* H+ [( r, q# G
{
% v( l$ ~3 o2 T- C        USART_SendData(USART1, ch);
" u" h9 j# }0 D6 T0 `    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );# W$ o5 F- v  y* S* W/ L
        return ch;# @7 Q2 k( e$ H5 L" y, \0 A3 \* Y
( g* I) i6 }, B* y( f5 z

, M) V) Y( y  S7 r, [; v}
4 h; b, x* H) B* k8 D  U

, ^" n# o+ Q$ k. q2 K/ u" e9 V
) d1 g. _0 i  N: {( R- R  i
6 D3 p8 H6 [6 @) L$ ~
命令缓存
; G8 Z) j  r1 r2 G; ~) H3 X4 `
) H, K( j* D& i5 u8 X

" H- U6 @, u. b7 ztCmdLineEntry g_sCmdTable[ ] =
9 l+ M8 P( }- R) Q  i) w/ T, f9 @{/ t% e: \2 v: i
    {"help",        Cmd_help,"\t\tisplay list of commands\r\n" },
+ Q2 w4 j( @& C8 `    {"?",           Cmd_help,"\t\tisplay list of commands\r\n" },2 [# z2 z( [% d8 @2 p& b6 l4 }
    {"getbaud",     Cmd_get_baud,"\t\t:Get the current baud rate\r\n"},; A, k3 [  }, Y
   {"getstate",    Cmd_get_state,"\t:Get the current flag state\r\n"},2 l& i! h8 m. u
   {"setstate",    Cmd_set_state,"\t:Set the current flag state \r\n"},8 r9 w/ P* h9 \& E! ^6 S
    {"resetmcu",    Cmd_MCU_Reset,"\t:Reset MCU\r\n"}," h% o$ d% D+ N- t- W
    {0,0,0}' ?& t/ R# B, z
};
6 L5 [4 R( R0 G. J8 n1 q* y& a
0 o5 c* q2 L5 u" z% C
) m8 O  u7 S- {- O  D* k
" G2 w% n+ S/ T8 T5 U2 i6 |

% {7 ^, S# ?! E) W8 t" R) F8 L这个 格式就是 输入的命令   函数名字   提示符
+ F1 k+ e1 t' t# r, Q自己往里面加就可以了
% I1 i0 u: h( n至于这些函数自己实现就行了5 R% |' X% X4 e" C1 \5 k% z
int Cmd_get_baud(int argc, char *argv[])
, P: j% E3 {0 ]/ n7 T{
' V6 U- a( }0 ^        uint32_t baud=115200;
% Z% \: |, d( i: t4 P5 p1 l7 k    uint8_t APP_Data[8]={ 0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x55};//»ñȡЭÒéÊý¾Ý- u4 M1 x1 c" a1 F! y3 I" f
        uint8_t i;+ \/ a0 {; m# L" p+ O
    printf("baud= %d\r\n",baud);9 @7 ]! [0 A% _) l2 C
    for(i=0;i<8;i++)! R5 z# k* W) M2 g1 V/ u
    {7 T2 h3 `4 O6 c* S
        printf("APP_Data[%d]=%-d\t",i,APP_Data);
: u3 \9 y# \6 o1 X0 n# s    }
5 S- T0 ^. \9 C  ]/ Y; Y4 I    return 0;# S$ \- L2 A' V9 s8 Z3 P  g: j5 n
}
) N) U. m" _9 g% I# I
# L" D% o  h+ h0 s3 b
+ ]$ M2 N* U0 N, ?
就这样:2 {4 p$ w- c: P3 m" }+ m
注意  很多和我一样的菜鸟不玩linux 可能对函数int Cmd_get_baud(int argc, char *argv[]) 不是很懂,建议百度 秒懂
6 k, z! D+ X5 Q' c5 j8 j% u" o
: r( U% t  W. E* H/ C7 O7 `
1 J4 m* [& B# w
命令解析部分  可以不用管 看这个函数  主要就是提取解析 结束符和 上面红色函数的参数,其实我也不是很懂,有能力的可以详细解释一下" C0 z" ~7 c0 B- K

  ?$ z2 C9 K% \% ?/ j( g( M( E

' O: F! G6 z! ~8 p8 {; y" e  Kint CmdLineProcess(char *pcCmdLine)! Q/ j0 y5 q9 v
4 M: W5 k& G5 r" G$ B$ ~4 B
/ t. r* e$ b. _* i2 u0 F' i: I
main函数
8 G6 _" v" K+ f- `" k* }2 Iwhile(1)
% e' Y( A9 h) X  W8 o{& t. s. ~! o, a  K$ }! \
        if(flag)
  C6 o! `' U/ t; P( d1 Z6 Z& T4 H                {
0 @2 t( U; e3 X                        if(CMDLINE_BAD_CMD == CmdLineProcess(cmd))
" v4 E# j) a! D                        {( s1 I  x+ F; P! w# A) t% [
                                printf("unkown command, please input \"help\" \n\r");
  V; T. X+ j% l9 S& k                        }3 u) {) Q+ O2 s' C' d7 W! Y
                        flag=0;. Z/ {0 r: z( T) u. E1 W
                       
5 x# s( s: }6 P% M2 D, m                } 8 j$ P1 k5 E5 `  ~$ b" n

6 ]4 `. r/ r! Q
% y  k: i7 I8 J( }5 i- v
- C* G( W# w$ Q, @+ M& G
}0 }) ]& _6 T3 s  y' \! v8 X; K, T
打工搞成 ,记得选Use MicroLIB 不然可能会死机哦  如果自己修改过不用这个库的话   就不必要做了" r% O8 \) G  h& \
                SHELL.rar (1.57 MB, 下载次数: 182)
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【】出现了表情 这个是字符格式个表情重复了 ,不惜在意4 ?) f$ ], x# F& h' Z/ z% l
源代码没有问题!
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:032 _) d$ F* K5 y" {: }: v7 h+ [4 r
建议也把工程文件发上来!!!

4 B; _& g1 P0 {: |+ z0 }; P提交了啊 ,欢迎下载
寂寞,点燃一支烟 回答时间:2018-7-13 14:06:48
creep 发表于 2018-7-12 13:50
# W$ x) r8 s1 C支持!!!

# `/ k' h9 W' o6 e2 {2 @6 o4 i0 g& S 谢谢大神
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
" W% A1 k$ D/ Y' B4 v我有移植UBOOT的命令行到407

! {6 Z$ b6 O1 R9 e: l' G欢迎分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版