请教一下在msh中,使用串口与上位机交互的问题

发表在 内核学习营2019-4-20 14:09 [复制链接] 4 282

大家好:
. Q' u/ c5 x- S+ j6 y7 Z       请教一下,用msh时,能否同时实现终端设备与电脑间串口通信的功能?
3 p, ?) h$ b  Q. l, E# v1 t8 q8 ]# T: ?
我目前想的是这样的:" e; X" a; k+ \9 g
% e  l' v; J  p5 H5 G
1、因为用secureCRT可以输入命令(这个我理解是MCU通过msh功能的串口接收到了这个命令数据的),并且可以打印返回信息(那么MCU应该是通过msh功能的串口向上位机发送了数据的)。那么如果我想MCU保存上位机发来的数据,那就应该从msh串口里截获该数据,不知RT-Thread最合适的做法是否是这样?
# N( l5 P5 t* F$ T" o, a0 a( e) u2 M: c: E" Q
2、如果第一条成立,那么就需要修改msh串口驱动,我用的nano,那么是否就是需要修改 device drivers里的serial.c文件呢?如果是,但因为用的nano,我找不到该文件在什么位置呢?+ ]  i+ e+ g' n/ {/ L0 I1 F1 a

) v: d. Q* L, b' L3、如果第二条成立,并能修改serial.c文件了,是否就是在这个函数里修改呢?(如下红色字体)
! e" U0 t, t; b8 b: w/ J8 s( ^; l9 W: Y
void rt_hw_serial_isr(struct rt_serial_device *serial, int event)+ \* x% Q8 [1 w0 P# h
{9 w/ O# p' B% Y' H0 L
    switch (event & 0xff)
2 R+ h  D# ^# `' }, ]0 i7 k% F% a2 ]    {* E+ B) w5 t3 D' ?
        case RT_SERIAL_EVENT_RX_IND:7 S7 y8 x+ `+ f, C
        {
0 J$ v7 }: L# r) e* Q+ T+ F            int ch = -1;3 E6 H4 Z, `" |! V: K) I0 m
            rt_base_t level;
- e" }! E9 {6 c1 i9 |            struct rt_serial_rx_fifo* rx_fifo;
2 h3 J, F2 D/ l$ I8 [# Z; a& w: V! c$ y
            /* interrupt mode receive */
: Q: n/ S$ W; L/ f& z/ [  Q- B            rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx;! q* n6 I  k) q- f2 ~2 E; Z4 `
            RT_ASSERT(rx_fifo != RT_NULL);
  a6 b/ @+ z4 K5 H
6 k4 W# H: m+ p- M1 [! V- V/ _' z5 l4 |            while (1)
) b3 y& A$ a- Y            {
, Y$ X  l& A3 b: g0 p; k                ch = serial->ops->getc(serial);
: R+ I7 {- g% ?+ h( `- Q% }  M                if (ch == -1) break;# }. B+ J" B7 c5 i; U; Q

7 P' F3 u2 g0 x2 ^4 B
6 `9 H# y/ c' H6 F6 Z6 y* Q9 z                /* disable interrupt */
) ~3 K( Q8 w7 U0 `* N" H  Y                level = rt_hw_interrupt_disable();
; c, u4 j- w% U5 g+ P$ ]
5 r  b" j6 ~; J4 r2 E" g                rx_fifo->buffer[rx_fifo->put_index] = ch;
2 f  x# t7 t+ R# f                rx_fifo->put_index += 1;# D, P4 q" r- [# p1 h: C- a
                if (rx_fifo->put_index >= serial->config.bufsz) rx_fifo->put_index = 0;" \" V3 O7 j' n0 {
9 D4 \9 @- x$ h5 N7 ]+ G0 o* Y. _
                // 是否是在这里截获rx_fifo->buffer的数据???
  e4 v; r2 R0 ~2 k+ w% K. z2 K5 h' l3 }6 D: a3 _
                /* if the next position is read index, discard this 'read char' *// l! E9 _: _+ X1 c
                if (rx_fifo->put_index == rx_fifo->get_index)
: Q# U" M, O" m( M/ Q                {1 |+ C9 B6 I7 p6 _1 I0 \5 G
                    rx_fifo->get_index += 1;
/ z5 J! D8 D3 E6 F3 o6 X2 P                    rx_fifo->is_full = RT_TRUE;
. I- j! e  J. p- b+ d# M0 }                    if (rx_fifo->get_index >= serial->config.bufsz) rx_fifo->get_index = 0;
5 ?3 X' D, u. ?1 [- ^7 h6 c                }
! [' j0 {9 S- x) t: I
3 b- d- T7 m' a+ K                /* enable interrupt */3 B+ h6 P0 Q% ~3 r6 F7 M* m
                rt_hw_interrupt_enable(level);. y  E& z; I0 g& K" m- G) J
            }6 X8 F1 Z* ^1 q; r# j" q- W, [

+ ?& u/ o  x0 M) y* E            /* invoke callback */
; C8 @; ?0 h" i7 P7 t            if (serial->parent.rx_indicate != RT_NULL)
5 t. y) X1 H/ p            {$ |: P2 C7 n1 `9 P
                rt_size_t rx_length;
( X+ N0 \; R- T, k8 b) j+ `& r* C6 t+ {  j
                /* get rx length */
" A: K- t  w* }: D7 Y5 G4 u' D; c                level = rt_hw_interrupt_disable();
& \; N, Q: I' _+ n5 S# E7 E                rx_length = (rx_fifo->put_index >= rx_fifo->get_index)? (rx_fifo->put_index - rx_fifo->get_index):
" q9 g& S/ A  q) B0 n* ?                    (serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index));# o1 A* B: P( I0 }
                rt_hw_interrupt_enable(level);
4 t, b* y& ^6 i4 K
( J, p  Q2 `, f, i6 e( U) T3 d  A                if (rx_length)( H- a& Y- j5 e& q" }
                {
: ^- M- g8 o- h- n6 G* x                    serial->parent.rx_indicate(&serial->parent, rx_length);
% h% c& u3 Y6 [/ n' a8 t1 I                }3 o) W7 ]! R5 Q! f. {  l
            }
% K2 j1 ]9 b9 P0 v  E# p) I) }            break;
: n7 V0 R  O  Y% z: S7 \        }
4 G3 ], A  ]" W% y- @! P# ~        case RT_SERIAL_EVENT_TX_DONE:0 K3 N7 b$ ?# O
        {8 @1 H' U' s5 n8 `
            struct rt_serial_tx_fifo* tx_fifo;* y6 u; t. E" n2 O/ u* W5 a
- x- e" M* O7 S  d
            tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx;$ y; W. Q! S! ~$ V
            rt_completion_done(&(tx_fifo->completion));
8 D* f7 R" }; b7 v$ k            break;2 F$ w/ s( H9 Q7 {# ]
        }* t1 R4 {7 ]; ]5 Q" i4 R# w- W
    }- w. s( T" C/ `' {

. l2 B0 G$ V- t% ?7 o
8 s2 @  ^" ?: [6 {0 C$ C( D5 m5 k! E( R
谢谢各位
. }1 }) N- R) u" G& L# U! P/ O# H
6 A- K8 x' b& N+ |% s" V. o5 j
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-4-20 17:54:20 | 显示全部楼层
不用改框架,参考 AT 组件的实现,切换控制台实现,但是需要有个动作或事件触发切换。rt_console_get_device() 获取 uart 的 rt_device_t,然后正常编程收发上位机数据,完毕之后设置回去即可。! F. W2 U8 B; G3 R( j% R" |% i
使用道具 举报 回复
发表于 2019-4-20 19:10:51 | 显示全部楼层
水清沙白 发表于 2019-4-20 17:54
  D6 n( i# _6 _# S: P5 N$ H不用改框架,参考 AT 组件的实现,切换控制台实现,但是需要有个动作或事件触发切换。rt_console_get_devic ...
; L) @# Z0 s; |' W/ F$ c) g1 `
好的,谢谢,我先消化一下。。。
使用道具 举报 回复
发表于 2019-4-20 21:35:46 | 显示全部楼层
水清沙白 发表于 2019-4-20 17:54- n: G+ s' C! U: k+ T
不用改框架,参考 AT 组件的实现,切换控制台实现,但是需要有个动作或事件触发切换。rt_console_get_devic ...
+ E7 t0 Q1 }& ?7 R
你好,我觉得好像不太合适呢?因为在我这里的应用场景是上位机发送数据到MCU的时间是随机的,MCU无法在合适的时间里触发切换吧?是这样吗?
% b" a3 Z! v1 t' Y& @+ r' U
使用道具 举报 回复
发表于 2019-4-20 22:47:40 | 显示全部楼层
没注意时同时,最好是再引一个串口出来。不然很麻烦。
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

快速回复 返回顶部 返回列表