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

基于串口写了个类似shell的东西

[复制链接]
freeelectron 发布时间:2017-2-12 23:10
本帖最后由 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 1.png , 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
  1. typedef void (*process_cmd)(void);* b. n) {- w1 q3 l
  2. typedef struct _CMD
    . \% _* Y* r6 M6 u6 j
  3. {
    4 ^% z* |  ]2 q6 ]
  4.         char *str;
    : J0 H% O2 \& G0 f8 I: Q6 `! l
  5.         char *help;
    8 L. ~* I7 y7 |+ h* m4 N
  6.         process_cmd  spectical_cmd_process;7 y+ L, t( n  t0 F9 h4 T* }
  7. }PC_CMD;1 M3 S  k+ _2 L/ i. m' x& }
  8. ; M& l4 v& |- ]% [+ E" v( Q
  9. PC_CMD PC_CMD_TAB[]=
    0 Q- A  W7 m- m' K% Y4 `
  10. {
    : P- N. Y$ X9 w3 ]
  11.         {"help",    "List all of the valid commands.",help_process},8 A9 b* [4 R, o2 T5 p4 U) c
  12.         {"led1",    "Led1 state.",led1_process},
    ( ?: J* v0 j& N- Y5 Y: }
  13.         {"led2on",  "Enable led2.",led2on_process},) B% P/ f+ k+ X0 S# p
  14.         {"led2off", "Disable led2.",led2off_process},( M" x3 E7 p0 ~; o4 h! ^, _6 M) }
  15.         {"reset",   "Software reset mcu.",reset_process},! {- h3 }# S! l  m
  16. };
    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
  1. void find_cmd(uint8_t *cmd)
      e( l8 \. m6 c, p
  2. {        . Z/ U% ~+ H& s/ b3 t; Z
  3.         uint8_t  cnt=0;
    # }, v0 Y+ s& D8 O. q
  4.         for(cnt=0;cnt<sizeof(PC_CMD_TAB)/sizeof(PC_CMD_TAB[0]);cnt++)$ ^/ `- d* w( d  e# a1 J, B
  5.         {
    7 j6 X$ i; x- G$ w0 L
  6.                 if(strcmp(PC_CMD_TAB[cnt].str,(char*)cmd)==0). T+ C0 U6 O& u! A5 k# T
  7.                 {( d$ M, T& U8 _, d
  8.                         buff_cnt=0;9 j' ^5 x2 I+ q7 q6 C) g
  9.                         PC_CMD_TAB[cnt].spectical_cmd_process();
    ! P7 G4 z4 K  p' \; p% z
  10.                         return;' ~+ X5 u- M! I1 b9 Q& w' R/ c7 Z
  11.                 }4 H  y8 i/ {+ x" i: @" W
  12.         }
    2 b& {1 [8 d) h9 O: n: {
  13.         buff_cnt=0;
    9 o8 W( {+ D- g! r8 O+ c/ L, T) F! z
  14.         printf("\r\nCmd error.\r\n");) [9 p: l8 e( I4 ~7 k0 g
  15. }
复制代码
说明:这个函数主要是用于遍历命令,并且执行命令对应的函数。
! 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)

评分

参与人数 1 ST金币 +5 收起 理由
creep + 5 很给力!

查看全部评分

赞 1 收藏 5 评论21 发布时间:2017-2-12 23:10

举报

21个回答
党国特派员 回答时间:2017-12-15 11:46:22
  1. #include "map"9 ^( k5 P/ b. a- g$ O
  2. #include "string"
    5 o# |) o- K& l. q4 C  q
  3. " f& @, `) O* s7 u0 q) @
  4. typedef void (*pFunc)(void);
    - ~$ C' y( Y5 ^" _7 \

  5. 0 b' C4 j: m! v8 d
  6. std::map<std::string,pFunc> funMap;
    ) W3 Y" E  f# g$ v. x
  7. 0 n0 M% D: c- z9 y' B+ E
  8. void Show(void)
    : K4 n& Z2 N3 Z$ H3 m! L
  9. {2 B; R! ?3 g: @* G4 Z8 ~
  10.         //TODO:Show function2 P! V( w3 m$ w4 B: W- V# X
  11.         return;9 {) p5 s% u, S$ z. B. M
  12. }* ]% A# J7 [0 y: R! m' I* B
  13. ; R/ H) _# _3 E: }. p
  14. void Help(void)
    0 {9 M. k; t- `3 a
  15. {
    ! i" }* I+ Q  {- f
  16.         //TODO:Help function; C0 r2 i& @2 M) R9 T3 y, `/ H5 n
  17.         return;
    - m. p* G8 f- }# G% V2 |0 i1 [
  18. }% }: o( r  ~5 A' g

  19. 6 c) d9 @" @7 I
  20. int main(void)2 P8 A, D: m6 ^5 U. {0 W
  21. {
    : T; G- r  u. D9 a
  22.         funMap["Show"] = Show;
    + t: H, }/ Z9 O  V  `# B$ S
  23.         funMap["Help"] = Help;6 Z0 Y. A3 L5 d  {
  24.        
    ( g, u0 ~4 J# q$ V& W
  25.         funMap["Show"]();
    3 w6 Y0 }( V+ h& w; y: H/ P* S& B
  26.         return 0;" N9 K% `% N/ @8 b, Y
  27. }
    2 B: I$ C8 p. k! |$ T1 s' a% Y5 S
复制代码
- m# k9 p  e% l# o& A% E  Z4 `
( h- L" ^' D  e
使用map更简单。
freeelectron 回答时间:2017-2-13 09:23:52
Mandelbrot_Set 发表于 2017-2-13 09:08
* |+ @: G# x4 x, Z3 P% @楼主给力
3 q0 U+ x# q5 ]0 q3 ]
共同学习,帮我顶一下这个帖子,谢谢https://www.stmcu.org.cn/module/forum/thread-610437-1-1.html:)
freeelectron 回答时间:2017-2-13 11:43:56
本帖最后由 freeelectron 于 2017-2-13 12:52 编辑
$ f" |: B/ |# }2 ^+ ^" u
toofree 发表于 2017-2-13 11:18  x4 y/ j4 M; P! _2 u4 b  A; e9 F
很好,也想这么弄。
3 \* |# s; e$ M/ |1 W3 `
欢迎指导,帮我顶一下这个帖子,谢谢https://www.stmcu.org.cn/module/forum/thread-610437-1-1.html
creep 回答时间:2017-2-13 08:43:53
感谢分享      
hwb_dream 回答时间:2017-2-13 08:54:11
谢谢分享            
freeelectron 回答时间:2017-2-13 08:58:27
creep 发表于 2017-2-13 08:43' O+ Y" ^+ |9 k
感谢分享

  o, G' D( v2 t4 v- o! U; {
Mandelbrot_Set 回答时间:2017-2-13 09:08:29
楼主给力
斜阳 回答时间:2017-2-13 09:21:27
mark一下
freeelectron 回答时间:2017-2-13 09:23:13
斜阳__ 发表于 2017-2-13 09:21
! k0 k# e6 P! G# v" R! g- c% ?mark一下
4 w  L5 B2 y0 ^! R6 U
共同学习,帮我顶一下这个帖子https://www.stmcu.org.cn/module/forum/thread-610437-1-1.html谢谢
七哥 回答时间:2017-2-13 11:18:38
很好,也想这么弄。
归心上路 回答时间:2017-4-24 08:37:53
谢谢分享,参考一下!
疯狂的骑士 回答时间:2017-6-3 23:12:23
7 J$ U1 ~: K( r- c
感谢分享   
深谷幽泉 回答时间:2017-6-4 19:23:35
感谢分享
没事逛荡 回答时间:2017-6-4 21:57:53
顶楼主,可以在里面加个输入提示,如>>之类的。
王力斯 回答时间:2017-12-15 08:58:42
支持大神一下
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版