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

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

[复制链接]
freeelectron 发布时间:2017-2-12 23:10
本帖最后由 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 `
1.png
* 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
  1. typedef void (*process_cmd)(void);: L9 R# `% x- I, G! ?; V8 r
  2. typedef struct _CMD
    6 \2 T! Y, t9 L7 K- W/ z( k
  3. {8 s1 L* |: n4 q2 n) j; K
  4.         char *str;
    7 o4 D1 d6 B8 v2 d/ e4 d: j2 ~
  5.         char *help;' N7 h. K* [, q1 r6 `- v: l# a6 I
  6.         process_cmd  spectical_cmd_process;
    ( x9 s6 k" M: t) p! w- F" u3 D
  7. }PC_CMD;+ w, I4 w* W6 M' w& g+ g
  8. ) i& K0 y/ E# x$ L. G9 P" h
  9. PC_CMD PC_CMD_TAB[]=) s. q2 \1 j3 a6 p/ _8 H6 |2 F
  10. {8 a6 |8 L1 R$ b
  11.         {"help",    "List all of the valid commands.",help_process},
    & m4 ^: g$ e8 K+ x7 D
  12.         {"led1",    "Led1 state.",led1_process},
    , A5 l& |) t; r, x5 @6 e. j
  13.         {"led2on",  "Enable led2.",led2on_process},! x" e) V- ^0 f! R9 w( ~6 o9 ?5 ^2 K# d
  14.         {"led2off", "Disable led2.",led2off_process},5 j- s9 O- x% z7 w7 ~. V
  15.         {"reset",   "Software reset mcu.",reset_process},
    , F5 m9 L8 L' D% ]
  16. };
    ( 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
  1. void find_cmd(uint8_t *cmd)
    6 ]/ t' u2 M# V  c
  2. {        
    2 e( X1 y" D! v. B
  3.         uint8_t  cnt=0;
    7 m) U- q/ ]0 v, P' f8 R. W" }
  4.         for(cnt=0;cnt<sizeof(PC_CMD_TAB)/sizeof(PC_CMD_TAB[0]);cnt++)
    : _- U4 ?. \) Q1 @8 I- q
  5.         {- P% C+ r% `+ p! e8 Y- H( Z
  6.                 if(strcmp(PC_CMD_TAB[cnt].str,(char*)cmd)==0)
    * |8 G' l5 I5 {
  7.                 {/ j# A( w) k8 G5 s0 q" e1 p5 H
  8.                         buff_cnt=0;- f2 M2 I0 P  C8 h# K* [
  9.                         PC_CMD_TAB[cnt].spectical_cmd_process();
    & P& j# ^0 L! j% z* o" A
  10.                         return;
    - Z' \4 K  w" U! \, E! d
  11.                 }2 m, ]( D( D9 B& s% Y* q
  12.         }% ]5 q0 k- u7 M. _
  13.         buff_cnt=0;
    * ?6 _( \0 A+ ~$ t  `
  14.         printf("\r\nCmd error.\r\n");
    0 H! z& r7 k& n$ F7 K; m
  15. }
复制代码
说明:这个函数主要是用于遍历命令,并且执行命令对应的函数。& 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)

评分

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

查看全部评分

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

举报

21个回答
党国特派员 回答时间:2017-12-15 11:46:22
  1. #include "map"
    ; u- {' s$ y' Y3 x7 f( N( q
  2. #include "string"- l* g7 C( ~7 l! }/ J
  3. 9 T( V$ J1 h* q+ q
  4. typedef void (*pFunc)(void);
    3 Y" G. X$ Q) L- P$ L% X
  5. . f' P* z/ \+ C
  6. std::map<std::string,pFunc> funMap;
    8 D( D* ?1 A; ^. h

  7. + [5 G. ?, o4 A+ q, b7 h, k; r( z  b
  8. void Show(void)& G- N3 F- ?4 X' G; y5 a+ x
  9. {; z" Q7 P0 L0 `: n# {
  10.         //TODO:Show function" l' A! U& ~+ M
  11.         return;) Y" P# ~' a$ C+ z: ?9 e* n$ D
  12. }% D) N* x) q4 H/ q+ l
  13. $ ~/ S" c; @7 ?) h( k! k
  14. void Help(void)" B. k+ L. t1 Y
  15. {  x: }( ?7 E8 B9 |9 u
  16.         //TODO:Help function  q) f8 c7 }" C1 D0 @
  17.         return;
      o( H0 F& ?- Y% p. z
  18. }& [, s6 n! t9 f0 ~- i& f# Y
  19. * R1 h5 m* O5 M  V, a3 K
  20. int main(void)
    * b5 X0 P  S5 ?7 M. [% v" H) Z
  21. {
    % N4 V% i  D% r; P* p, X0 `9 F
  22.         funMap["Show"] = Show;5 e  t( G6 f- _  S8 @1 F
  23.         funMap["Help"] = Help;
    ; B4 o& E1 {2 X
  24.         1 A, v5 F8 C5 r+ N+ P
  25.         funMap["Show"]();
    ; |7 W$ U% [& l, K5 l" L
  26.         return 0;
    / K/ P6 R9 p. a! C% l( Q) L
  27. }
    & }5 |' X* E& v* |5 V/ g; i
复制代码
: n( j/ D/ `( \% y: p0 i
) u7 y, b5 M, |0 I1 {; x& Z
使用map更简单。
freeelectron 回答时间:2017-2-13 09:23:52
Mandelbrot_Set 发表于 2017-2-13 09:08/ V  h5 s9 Q, s- l- _- v( o; m) [0 w
楼主给力
0 @1 c" M7 |% E: s8 P- j2 G/ W! Z
共同学习,帮我顶一下这个帖子,谢谢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 编辑
9 |8 s* s" k2 a7 i8 ?
toofree 发表于 2017-2-13 11:18
$ M8 F! Y" I! I* Q1 R5 j很好,也想这么弄。

1 }) ^. D  \) R$ I( Y( U. ~- a: q欢迎指导,帮我顶一下这个帖子,谢谢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; ~4 S8 `4 N8 z! O
感谢分享
) M$ i0 p5 C4 c2 e9 ^3 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
# F8 n) G# |& o. c3 K6 T) ?4 W/ gmark一下
+ D( J* C2 c; l
共同学习,帮我顶一下这个帖子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
' g" L& j& \" {2 e$ k7 g% A, X2 d2 a
感谢分享   
深谷幽泉 回答时间: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 手机版