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

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

[复制链接]
freeelectron 发布时间:2017-2-12 23:10
本帖最后由 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 1.png
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  \
  1. typedef void (*process_cmd)(void);+ [0 A3 R; y4 P  k+ Q+ F  E
  2. typedef struct _CMD
    & e! o, g" \! H2 v& g/ v4 x
  3. {+ W0 @0 o) B% \5 K( F5 R, K
  4.         char *str;- U0 m3 O5 j1 _6 X/ n0 V
  5.         char *help;- f* A1 m& v4 O% P6 y0 b1 x# h
  6.         process_cmd  spectical_cmd_process;; n* Y/ U4 j0 W. [5 u6 e
  7. }PC_CMD;
    ( b4 |* u/ G! v' x8 C. X" ~

  8. 7 U4 M0 w- o3 u/ D, S7 T: X9 j1 B5 b
  9. PC_CMD PC_CMD_TAB[]=9 `' K3 _: o3 S! @/ F
  10. {0 b/ N) |6 y! P, Y# Y
  11.         {"help",    "List all of the valid commands.",help_process},- p$ n5 J  i+ o. }
  12.         {"led1",    "Led1 state.",led1_process},
    ! U* N  ~: B  F" w" M+ [
  13.         {"led2on",  "Enable led2.",led2on_process},
    ' R8 O$ q+ C9 g) W( x
  14.         {"led2off", "Disable led2.",led2off_process},8 R7 |9 w, g; ~* T, n- H+ b
  15.         {"reset",   "Software reset mcu.",reset_process},+ Y  r1 k8 o& q. ~! i1 y. I; V, q
  16. };
    & 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
  1. void find_cmd(uint8_t *cmd)
    : x1 K$ B/ c0 p5 h2 A: A
  2. {        
    3 O. M* J5 |0 }3 Q7 ?. H
  3.         uint8_t  cnt=0;
    + o, v$ S' e! a2 z) ?  X0 {. W
  4.         for(cnt=0;cnt<sizeof(PC_CMD_TAB)/sizeof(PC_CMD_TAB[0]);cnt++)
    ) O& @+ r) p: t6 I3 x4 c
  5.         {
    . Y0 t, A  i- ~$ a/ U8 z  d% v
  6.                 if(strcmp(PC_CMD_TAB[cnt].str,(char*)cmd)==0)
    ; \! g- v4 M/ Z8 O% i- y+ Q/ k
  7.                 {
    / r# I$ a5 M( L# I# ?
  8.                         buff_cnt=0;
    7 ~+ ~. s: |: ?$ \
  9.                         PC_CMD_TAB[cnt].spectical_cmd_process();
    1 o7 ]3 Z9 \! r& t" B
  10.                         return;" G+ P- U3 v3 B0 C: F2 j
  11.                 }: B  _# v! T: I' k" ~3 L
  12.         }
    $ r/ O" Y: s. r( F
  13.         buff_cnt=0;: J( `+ ~" r. F
  14.         printf("\r\nCmd error.\r\n");9 L( G* M% t! k: M; m& X/ e& J
  15. }
复制代码
说明:这个函数主要是用于遍历命令,并且执行命令对应的函数。
/ 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)

评分

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

查看全部评分

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

举报

21个回答
党国特派员 回答时间:2017-12-15 11:46:22
  1. #include "map"
    ! w9 O: o9 o( x, v9 t7 `4 B1 t
  2. #include "string". L) m0 R* R6 Q* k9 p& P

  3. 9 R3 Y2 {$ q* A8 {/ I
  4. typedef void (*pFunc)(void);7 ^- p+ L2 X; p" m+ X
  5. # K( I$ h. C9 n; s0 z& v& _! `% n
  6. std::map<std::string,pFunc> funMap;! j) y0 s; g1 ?8 E$ Y$ J* J6 s

  7. ( a1 U4 h0 s# s5 T; u# f
  8. void Show(void)2 V. [" k. m* B4 u
  9. {5 c; R6 T, l) S2 H- y) n3 {
  10.         //TODO:Show function! n. x! E% {7 z( F; Y2 X) h
  11.         return;* f. J/ i$ \5 ?8 j3 s
  12. }% n3 e8 l3 n$ `$ y2 t

  13. % W9 x" J1 b4 L) K
  14. void Help(void)
    ' T* S" h/ V6 [; T3 i% x, }+ T
  15. {
    + f# u* w, _; ]1 o, t" ]0 r7 m- [( ^
  16.         //TODO:Help function
    1 R1 O: _  ~, O/ G4 H5 B
  17.         return;
    4 R2 [: _( }: a& \8 x$ ?
  18. }1 L: J% u. B7 s; H+ c$ a

  19. ; k1 I8 b8 d* U- ?$ Z; n6 y8 r
  20. int main(void): X3 V& X6 p, U7 I: r7 N+ Z5 O
  21. {# R0 w5 n3 U7 j8 b
  22.         funMap["Show"] = Show;
    6 N  \8 M+ H* J' w1 Z. N/ G
  23.         funMap["Help"] = Help;4 H0 l+ v0 x2 a, F4 Z- K- L
  24.        
    - m) f, ~/ s2 P' y' N
  25.         funMap["Show"]();2 c, u9 e6 |( X# }0 p. g" b' z0 T: E
  26.         return 0;1 q8 ^& j, @' L2 B
  27. }; g" y$ h9 T0 V# E
复制代码
6 h6 X4 t; }# w
9 ^6 }; `- ]6 b  P# O, C
使用map更简单。
freeelectron 回答时间:2017-2-13 09:23:52
Mandelbrot_Set 发表于 2017-2-13 09:08$ R% \) g8 ^; n" ^$ {
楼主给力
. {' r, Q7 t& A
共同学习,帮我顶一下这个帖子,谢谢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 编辑
# C: g7 V; k" \. Y% b! Q
toofree 发表于 2017-2-13 11:18# f3 G% |" b" m2 Q
很好,也想这么弄。
; t3 O- H' T% r0 [* _
欢迎指导,帮我顶一下这个帖子,谢谢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! ]2 b3 v: a, c) I, Y  K
感谢分享

# y  A1 F$ e6 H1 J: t2 `! L
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
5 g4 d, L4 f% J6 B5 t- t4 B3 Cmark一下

) l* s- u: z8 A$ n+ U7 I- @共同学习,帮我顶一下这个帖子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

4 w( S/ c7 t. `& d" c' p7 W感谢分享   
深谷幽泉 回答时间: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 手机版