本帖最后由 freeelectron 于 2017-2-12 23:10 编辑 ( T6 [3 o9 ?! I8 C, B
3 k; h& K7 `7 j( c2 W. w4 i8 i5 w
前面的话:一直对通过在超级终端里面输入命令,查看系统参数等等比较好奇,前一阵才了解到linux里面叫做shell,同样的,也可以用单片机来实现一个,方便调试,当然,也可以输入参数等等。! f: b* O, X) H. C% v8 y
: T( e5 K4 N9 C$ J( J7 i3 u
先上个图:
; T# _5 }4 a6 o9 y: O& T
, Z# X4 a( Z4 S+ [0 A
PS:其他的命令类似,正确输入命令后,按回车键: E& d5 E# g6 A" T% Z
% ]" J4 }' A$ f& p# U& `8 a
代码1:( ?5 T; ^9 \$ Z9 a
- typedef void (*process_cmd)(void);* b. n) {- w1 q3 l
- typedef struct _CMD
. \% _* Y* r6 M6 u6 j - {
4 ^% z* | ]2 q6 ] - char *str;
: J0 H% O2 \& G0 f8 I: Q6 `! l - char *help;
8 L. ~* I7 y7 |+ h* m4 N - process_cmd spectical_cmd_process;7 y+ L, t( n t0 F9 h4 T* }
- }PC_CMD;1 M3 S k+ _2 L/ i. m' x& }
- ; M& l4 v& |- ]% [+ E" v( Q
- PC_CMD PC_CMD_TAB[]=
0 Q- A W7 m- m' K% Y4 ` - {
: P- N. Y$ X9 w3 ] - {"help", "List all of the valid commands.",help_process},8 A9 b* [4 R, o2 T5 p4 U) c
- {"led1", "Led1 state.",led1_process},
( ?: J* v0 j& N- Y5 Y: } - {"led2on", "Enable led2.",led2on_process},) B% P/ f+ k+ X0 S# p
- {"led2off", "Disable led2.",led2off_process},( M" x3 E7 p0 ~; o4 h! ^, _6 M) }
- {"reset", "Software reset mcu.",reset_process},! {- h3 }# S! l m
- };
2 A/ Z( t8 }3 Q) w! f6 g
复制代码 其中:% F. v3 u' U# y3 n
typedef void (*process_cmd)(void);是一个函数指针,指向的函数是void类型,无参数。
# A0 D% U1 z3 ]6 l
- N; v2 ~$ ^. Y( ktypedef struct _CMD" ]# O6 }% s0 K+ X1 Z
{
: l! o8 B0 W5 p5 R. W8 p char *str;
! q/ M) c* K2 T( M0 j6 h2 `# S7 f char *help;2 H6 `* k% x( m7 c! r, P
process_cmd spectical_cmd_process;
8 x! C3 o' n8 ^* ^ ?; c$ H}PC_CMD;这个是命令结构体,里面包含两个字符类型的指针,一个函数指针。
' \: x% t3 o; a5 y& e
: z# g2 _" `! j' r
2 | h' K; ^- L# X* R4 Z; \PC_CMD PC_CMD_TAB[]=
1 c% o/ C; @ R3 }! y4 O9 O( U{
r1 n! B. h; A, J3 e" e {"help", "List all of the valid commands.",help_process},. `, i& C u3 D' c0 v
{"led1", "Led1 state.",led1_process},1 ~6 f: L% r/ B$ P# ]( I: _: D
{"led2on", "Enable led2.",led2on_process},# W, x. s' E' [9 d" o: m
{"led2off", "Disable led2.",led2off_process},
/ m- t* R/ k N1 p# Q" C {"reset", "Software reset mcu.",reset_process},6 K0 b3 A0 _( b* J' O( E a
};这个是结构体数组,我们可以看到具体的命令就是在这里面定义的。
' o. W R3 Z: _& c4 [2 n% Y* A
( S- C# o+ _* z) L5 P X; A代码2:8 ^3 K- c; E" D- a! g; h
- void find_cmd(uint8_t *cmd)
e( l8 \. m6 c, p - { . Z/ U% ~+ H& s/ b3 t; Z
- uint8_t cnt=0;
# }, v0 Y+ s& D8 O. q - for(cnt=0;cnt<sizeof(PC_CMD_TAB)/sizeof(PC_CMD_TAB[0]);cnt++)$ ^/ `- d* w( d e# a1 J, B
- {
7 j6 X$ i; x- G$ w0 L - if(strcmp(PC_CMD_TAB[cnt].str,(char*)cmd)==0). T+ C0 U6 O& u! A5 k# T
- {( d$ M, T& U8 _, d
- buff_cnt=0;9 j' ^5 x2 I+ q7 q6 C) g
- PC_CMD_TAB[cnt].spectical_cmd_process();
! P7 G4 z4 K p' \; p% z - return;' ~+ X5 u- M! I1 b9 Q& w' R/ c7 Z
- }4 H y8 i/ {+ x" i: @" W
- }
2 b& {1 [8 d) h9 O: n: { - buff_cnt=0;
9 o8 W( {+ D- g! r8 O+ c/ L, T) F! z - printf("\r\nCmd error.\r\n");) [9 p: l8 e( I4 ~7 k0 g
- }
复制代码 说明:这个函数主要是用于遍历命令,并且执行命令对应的函数。
! p! G$ X2 K7 a8 B0 T6 U& g" }: F- w! ]& ?. R/ J: p" k
附上代码:基于stm32l1的工程代码。' }9 _$ N- d# l' t' _& P9 _
L1ï¼shellï¼.rar
(5.24 MB, 下载次数: 387)
|
( h- L" ^' D e
使用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谢谢
感谢分享