本帖最后由 freeelectron 于 2017-2-12 23:10 编辑
# Y5 k- f" {. z( u) l
' Y- \# b2 ]9 a* e前面的话:一直对通过在超级终端里面输入命令,查看系统参数等等比较好奇,前一阵才了解到linux里面叫做shell,同样的,也可以用单片机来实现一个,方便调试,当然,也可以输入参数等等。
- I$ Y5 M+ `* h4 ^/ U; u% Y3 L/ f/ T8 O# A! u' ]& s
先上个图:5 L* B& m" j M+ h- k9 h8 `
* O9 U5 c; h! ^( sPS:其他的命令类似,正确输入命令后,按回车键
: z! S0 i: M' x3 \! w5 A6 l, R2 |5 b1 r: T1 P+ K- P
代码1:
5 X6 Y4 Y" P5 u2 [- N- _+ G& p0 q- typedef void (*process_cmd)(void);: L9 R# `% x- I, G! ?; V8 r
- typedef struct _CMD
6 \2 T! Y, t9 L7 K- W/ z( k - {8 s1 L* |: n4 q2 n) j; K
- char *str;
7 o4 D1 d6 B8 v2 d/ e4 d: j2 ~ - char *help;' N7 h. K* [, q1 r6 `- v: l# a6 I
- process_cmd spectical_cmd_process;
( x9 s6 k" M: t) p! w- F" u3 D - }PC_CMD;+ w, I4 w* W6 M' w& g+ g
- ) i& K0 y/ E# x$ L. G9 P" h
- PC_CMD PC_CMD_TAB[]=) s. q2 \1 j3 a6 p/ _8 H6 |2 F
- {8 a6 |8 L1 R$ b
- {"help", "List all of the valid commands.",help_process},
& m4 ^: g$ e8 K+ x7 D - {"led1", "Led1 state.",led1_process},
, A5 l& |) t; r, x5 @6 e. j - {"led2on", "Enable led2.",led2on_process},! x" e) V- ^0 f! R9 w( ~6 o9 ?5 ^2 K# d
- {"led2off", "Disable led2.",led2off_process},5 j- s9 O- x% z7 w7 ~. V
- {"reset", "Software reset mcu.",reset_process},
, F5 m9 L8 L' D% ] - };
( I" ~, r0 x: G
复制代码 其中:
/ z2 ^! h2 i) q; P7 B" |typedef void (*process_cmd)(void);是一个函数指针,指向的函数是void类型,无参数。
1 X7 q" }+ @: h% t. m+ |6 M3 s2 l9 U
typedef struct _CMD3 R3 v _9 p4 E0 w' O+ {
{
5 F' w' p4 ]6 j- \$ Y5 ~3 C char *str;
$ g1 ]# E8 R3 _" b9 d9 a3 K/ V char *help;
: A& r% r1 F! w& G1 N0 S- {$ w. { process_cmd spectical_cmd_process;
0 T8 ^: j# |* L8 e0 ^/ U/ D( d}PC_CMD;这个是命令结构体,里面包含两个字符类型的指针,一个函数指针。
0 X/ @* _1 j# k/ X' V( Q1 x! _ B+ Z
, z4 R0 B5 X4 U% y' }4 Z7 w
PC_CMD PC_CMD_TAB[]=! d7 P- l1 o! a( Y; K8 P ~
{
$ q0 U* c2 y. D7 k9 g2 M {"help", "List all of the valid commands.",help_process},' ], C: X0 x4 G+ P1 X, n* f
{"led1", "Led1 state.",led1_process},
: h6 H' [. K: S& m/ r, T {"led2on", "Enable led2.",led2on_process},( D4 H @( @1 j) n! a
{"led2off", "Disable led2.",led2off_process},
3 E% e9 v1 Z6 f- _$ d {"reset", "Software reset mcu.",reset_process},
1 C0 I, n3 N# {7 |};这个是结构体数组,我们可以看到具体的命令就是在这里面定义的。" T: k6 m' X5 k5 c
& Y8 U4 U& r! F. ?- X
代码2:5 L$ P9 P5 Q$ @$ s5 j
- void find_cmd(uint8_t *cmd)
6 ]/ t' u2 M# V c - {
2 e( X1 y" D! v. B - uint8_t cnt=0;
7 m) U- q/ ]0 v, P' f8 R. W" } - for(cnt=0;cnt<sizeof(PC_CMD_TAB)/sizeof(PC_CMD_TAB[0]);cnt++)
: _- U4 ?. \) Q1 @8 I- q - {- P% C+ r% `+ p! e8 Y- H( Z
- if(strcmp(PC_CMD_TAB[cnt].str,(char*)cmd)==0)
* |8 G' l5 I5 { - {/ j# A( w) k8 G5 s0 q" e1 p5 H
- buff_cnt=0;- f2 M2 I0 P C8 h# K* [
- PC_CMD_TAB[cnt].spectical_cmd_process();
& P& j# ^0 L! j% z* o" A - return;
- Z' \4 K w" U! \, E! d - }2 m, ]( D( D9 B& s% Y* q
- }% ]5 q0 k- u7 M. _
- buff_cnt=0;
* ?6 _( \0 A+ ~$ t ` - printf("\r\nCmd error.\r\n");
0 H! z& r7 k& n$ F7 K; m - }
复制代码 说明:这个函数主要是用于遍历命令,并且执行命令对应的函数。& f* ^# H! V2 H& s6 i# C, u1 ]. S
* \7 z0 Y# s8 S( R4 e F2 J附上代码:基于stm32l1的工程代码。 v7 d1 r) G! @6 F5 l- l) w' D
L1ï¼shellï¼.rar
(5.24 MB, 下载次数: 387)
|
) u7 y, b5 M, |0 I1 {; x& Z
使用map更简单。
共同学习,帮我顶一下这个帖子,谢谢https://www.stmcu.org.cn/module/forum/thread-610437-1-1.html:)
欢迎指导,帮我顶一下这个帖子,谢谢https://www.stmcu.org.cn/module/forum/thread-610437-1-1.html
共同学习,帮我顶一下这个帖子https://www.stmcu.org.cn/module/forum/thread-610437-1-1.html谢谢
感谢分享