本帖最后由 freeelectron 于 2017-2-12 23:10 编辑 ~* S. k' F' d! W
& ~9 p# ], G/ K2 H
前面的话:一直对通过在超级终端里面输入命令,查看系统参数等等比较好奇,前一阵才了解到linux里面叫做shell,同样的,也可以用单片机来实现一个,方便调试,当然,也可以输入参数等等。: `9 V) u" B5 A
- u- g# ~( B |' g% L: T" m2 A先上个图:
$ |1 ?7 ` {5 ]$ ~6 W
0 ?8 r3 d/ X+ gPS:其他的命令类似,正确输入命令后,按回车键
% ]9 k0 ~4 a: y6 d4 @
9 ?+ m) E- I7 P7 p代码1:" u2 z X! \5 B* d \
- typedef void (*process_cmd)(void);+ [0 A3 R; y4 P k+ Q+ F E
- typedef struct _CMD
& e! o, g" \! H2 v& g/ v4 x - {+ W0 @0 o) B% \5 K( F5 R, K
- char *str;- U0 m3 O5 j1 _6 X/ n0 V
- char *help;- f* A1 m& v4 O% P6 y0 b1 x# h
- process_cmd spectical_cmd_process;; n* Y/ U4 j0 W. [5 u6 e
- }PC_CMD;
( b4 |* u/ G! v' x8 C. X" ~
7 U4 M0 w- o3 u/ D, S7 T: X9 j1 B5 b- PC_CMD PC_CMD_TAB[]=9 `' K3 _: o3 S! @/ F
- {0 b/ N) |6 y! P, Y# Y
- {"help", "List all of the valid commands.",help_process},- p$ n5 J i+ o. }
- {"led1", "Led1 state.",led1_process},
! U* N ~: B F" w" M+ [ - {"led2on", "Enable led2.",led2on_process},
' R8 O$ q+ C9 g) W( x - {"led2off", "Disable led2.",led2off_process},8 R7 |9 w, g; ~* T, n- H+ b
- {"reset", "Software reset mcu.",reset_process},+ Y r1 k8 o& q. ~! i1 y. I; V, q
- };
& D7 R+ I+ T% c
复制代码 其中:! e$ U. ~9 i, T# _
typedef void (*process_cmd)(void);是一个函数指针,指向的函数是void类型,无参数。
" Q E. K8 k, x6 |
$ R( q) W# a) ftypedef struct _CMD
! V0 I9 d# }$ L, p* S{5 I5 f, C% h) [' y
char *str;+ U( X2 Q- E2 `7 ^- z
char *help;
9 L7 q9 ?- b7 e! l# K4 N& b8 x process_cmd spectical_cmd_process;
, @, z/ `% g* h; r9 P}PC_CMD;这个是命令结构体,里面包含两个字符类型的指针,一个函数指针。
) T! e9 y% `) ]! j+ V) W+ k
$ I2 @* o* U( O$ B- g h
# i$ A) J: T$ ]; l1 BPC_CMD PC_CMD_TAB[]=% R7 t8 W) V! N5 s! c! o
{& A( o% d7 y1 C- Z- o$ P# B
{"help", "List all of the valid commands.",help_process},
7 q- ^: n& [! E {"led1", "Led1 state.",led1_process},% H- k* I% p" {$ W; T
{"led2on", "Enable led2.",led2on_process},
& H$ O$ H# h6 m0 J; D {"led2off", "Disable led2.",led2off_process},
6 Y+ l$ C; D! \! _2 i4 m {"reset", "Software reset mcu.",reset_process},5 R) {' W! x; x- Z
};这个是结构体数组,我们可以看到具体的命令就是在这里面定义的。
! r" {0 H/ k: [# S5 m" C9 l3 V0 Y" X+ M t7 j H
代码2:
, N* y1 X: Q( A; N" A6 o: j- void find_cmd(uint8_t *cmd)
: x1 K$ B/ c0 p5 h2 A: A - {
3 O. M* J5 |0 }3 Q7 ?. H - uint8_t cnt=0;
+ o, v$ S' e! a2 z) ? X0 {. W - for(cnt=0;cnt<sizeof(PC_CMD_TAB)/sizeof(PC_CMD_TAB[0]);cnt++)
) O& @+ r) p: t6 I3 x4 c - {
. Y0 t, A i- ~$ a/ U8 z d% v - if(strcmp(PC_CMD_TAB[cnt].str,(char*)cmd)==0)
; \! g- v4 M/ Z8 O% i- y+ Q/ k - {
/ r# I$ a5 M( L# I# ? - buff_cnt=0;
7 ~+ ~. s: |: ?$ \ - PC_CMD_TAB[cnt].spectical_cmd_process();
1 o7 ]3 Z9 \! r& t" B - return;" G+ P- U3 v3 B0 C: F2 j
- }: B _# v! T: I' k" ~3 L
- }
$ r/ O" Y: s. r( F - buff_cnt=0;: J( `+ ~" r. F
- printf("\r\nCmd error.\r\n");9 L( G* M% t! k: M; m& X/ e& J
- }
复制代码 说明:这个函数主要是用于遍历命令,并且执行命令对应的函数。
/ j3 ]% k' K$ N1 t5 S2 | x
9 _4 w* V t7 c+ s0 D/ z附上代码:基于stm32l1的工程代码。. M( k" d2 x7 T; `
L1ï¼shellï¼.rar
(5.24 MB, 下载次数: 387)
|
9 ^6 }; `- ]6 b P# O, C
使用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谢谢
感谢分享