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

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

大家好:
4 k* z4 t3 v3 A* l) E       请教一下,用msh时,能否同时实现终端设备与电脑间串口通信的功能?
1 y- q4 @& d% F7 S! u( u. L1 d; I$ [$ [3 W8 ]- \+ v
我目前想的是这样的:8 i. A  K& n# H- @; S* i, \& c8 f

3 O2 s( d6 R9 u1、因为用secureCRT可以输入命令(这个我理解是MCU通过msh功能的串口接收到了这个命令数据的),并且可以打印返回信息(那么MCU应该是通过msh功能的串口向上位机发送了数据的)。那么如果我想MCU保存上位机发来的数据,那就应该从msh串口里截获该数据,不知RT-Thread最合适的做法是否是这样?
" B& ^: I2 v, d. H# U
4 Z0 Q) @% u; l4 ^2、如果第一条成立,那么就需要修改msh串口驱动,我用的nano,那么是否就是需要修改 device drivers里的serial.c文件呢?如果是,但因为用的nano,我找不到该文件在什么位置呢?
3 J" o& K8 C0 }- ?4 ]5 I+ q+ @& y3 A' F
3、如果第二条成立,并能修改serial.c文件了,是否就是在这个函数里修改呢?(如下红色字体)
. K3 N. f$ c0 j1 L
1 h! S' E$ b+ {( {7 @, s: [  gvoid rt_hw_serial_isr(struct rt_serial_device *serial, int event)( {4 i0 V6 S" O# P5 j: ?
{
6 |3 n1 P2 ?1 g" F' f! ^; |1 t9 D    switch (event & 0xff)) G$ q0 ~" ^) K9 W! D8 Q6 U* }
    {( Q& N8 U. B  a  D) l( @) \
        case RT_SERIAL_EVENT_RX_IND:% d  \3 I/ y8 x5 K5 `9 F
        {+ G/ q4 W' \! [: s
            int ch = -1;
# C  |8 E6 |; ^            rt_base_t level;
7 K3 {( |- a/ u) @; {            struct rt_serial_rx_fifo* rx_fifo;
9 s( S  \6 {2 L* k0 ]2 z4 H
1 b4 J/ g; d4 R2 j2 r# Q& ]( x            /* interrupt mode receive */# }$ V, Q: C. R+ V& r9 M
            rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx;
- r) F1 f: X" z            RT_ASSERT(rx_fifo != RT_NULL);# D+ i' \0 M6 G" v' X% Q# r

& P, U, x% F! g! o* q8 ^* _6 D            while (1)
5 V( _3 E8 m5 p& q) F            {
3 w2 X5 ^$ b( S- @" F7 I" ]& F! X                ch = serial->ops->getc(serial);- @, [$ K; N% [5 V
                if (ch == -1) break;
5 V2 Z" N7 Z+ L
6 S3 C5 t4 }0 Q3 t8 o/ A6 O
0 l; E3 n$ m8 S- l9 i1 q                /* disable interrupt */
, H( J7 H9 @) P0 \/ q! o! X                level = rt_hw_interrupt_disable();
# U/ q1 A, M  m3 @% I) }7 `
, ^5 I4 a2 _( e                rx_fifo->buffer[rx_fifo->put_index] = ch;/ P  s, c* }& }4 M
                rx_fifo->put_index += 1;
, z; H5 F; E: ^* W1 s# }! c                if (rx_fifo->put_index >= serial->config.bufsz) rx_fifo->put_index = 0;
9 q# H1 Y5 u7 q2 U4 l/ z$ H4 u5 Y; o" P" P5 i: i. [' B
                // 是否是在这里截获rx_fifo->buffer的数据???
% Z* i& e( _& y
% J0 Q0 p$ n( s; m) A2 |                /* if the next position is read index, discard this 'read char' */7 B2 J( U  A4 z5 S! k$ B: Z
                if (rx_fifo->put_index == rx_fifo->get_index)0 d! w- @+ r8 Y, A9 f
                {! ]+ @7 v/ L# @- a/ q# Y! G& W
                    rx_fifo->get_index += 1;9 A" [/ @( l2 G1 d8 ^: r
                    rx_fifo->is_full = RT_TRUE;
( N" L- `; M  h3 o/ v5 |0 W1 W+ R                    if (rx_fifo->get_index >= serial->config.bufsz) rx_fifo->get_index = 0;
& J+ \" o) _# @                }* m. E7 P9 Q" }

# x/ r0 U& s' Q) @+ M' n                /* enable interrupt *// L4 w( I0 N. f, X+ `) f7 k  D3 V
                rt_hw_interrupt_enable(level);# A9 w* g) f( \" p* d6 Y: ^; W
            }* d7 s4 r4 E& o/ x/ ~1 w, P- J
0 p: e, k( V$ R! c! N! h
            /* invoke callback */
$ P$ o0 a2 q9 Q5 w            if (serial->parent.rx_indicate != RT_NULL)
1 W+ q: R' T8 R6 {. {$ k2 {            {
8 J3 n5 O# y  O                rt_size_t rx_length;/ I2 V- O- `  h; G- C) P2 o4 ^5 S

9 ?* W9 T9 v3 F9 o  q. W% q                /* get rx length */: S7 F9 `7 N  j: ]+ L
                level = rt_hw_interrupt_disable();
( o: d! ~4 F7 B# p1 Z1 |' a; ~6 K                rx_length = (rx_fifo->put_index >= rx_fifo->get_index)? (rx_fifo->put_index - rx_fifo->get_index):
& j. p  v, h7 |- Z$ w$ e. H; N+ P                    (serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index));
9 @  E- _6 Z+ u: M0 r" _3 k                rt_hw_interrupt_enable(level);
6 N! g9 `3 X4 w* n% C1 `) m; n* i5 ?, j4 X
                if (rx_length)
: Q5 |% Y. H; {$ b4 @8 s                {, y; M+ K& ?4 @# E- ]) R
                    serial->parent.rx_indicate(&serial->parent, rx_length);4 [! u0 x# t3 U! D
                }+ u; u: [3 O/ e; u/ K
            }( }/ N: M' G- ^5 Q0 h$ r6 n, g, O
            break;
3 p6 Q- ?& p4 M% I, V; [        }
3 V7 z. Q. |6 k( n, a1 B        case RT_SERIAL_EVENT_TX_DONE:
+ q$ F3 X) Y0 |3 F. G$ `9 F        {
% u1 c# [+ E( Q) B0 T            struct rt_serial_tx_fifo* tx_fifo;) J- M0 t1 F* H, p) b, Q

: L& R8 O' k% Y" F7 b) a            tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx;3 ~, L! i: B, D, p4 T
            rt_completion_done(&(tx_fifo->completion));# P8 L! {9 W" t, N' X( c' P1 F
            break;
" X. _5 ^0 m, J* J  f4 Z0 |        }
" m: ^! d. W. R  T& o; _! n    }; I2 S9 k+ N* I* R; {  T
3 V: q2 J7 Y5 B' B8 _& M
! d4 U1 }2 J2 ]0 w& L

" g; B  l! A# {& ^谢谢各位
! E. ~1 \% b: e% R' P! x6 ^1 f* M! y( p4 Q
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-4-20 17:54:20 | 显示全部楼层
不用改框架,参考 AT 组件的实现,切换控制台实现,但是需要有个动作或事件触发切换。rt_console_get_device() 获取 uart 的 rt_device_t,然后正常编程收发上位机数据,完毕之后设置回去即可。9 V, S' `5 s: _: d& ^/ M8 n  u, Q7 \
使用道具 举报 回复
发表于 2019-4-20 19:10:51 | 显示全部楼层
水清沙白 发表于 2019-4-20 17:542 x' ~$ {$ J, f# U. K
不用改框架,参考 AT 组件的实现,切换控制台实现,但是需要有个动作或事件触发切换。rt_console_get_devic ...

' t6 F7 ]& `% O好的,谢谢,我先消化一下。。。
使用道具 举报 回复
发表于 2019-4-20 21:35:46 | 显示全部楼层
水清沙白 发表于 2019-4-20 17:54/ E8 c; ?: [  Z% ~9 d' K: ~4 m, i4 Z
不用改框架,参考 AT 组件的实现,切换控制台实现,但是需要有个动作或事件触发切换。rt_console_get_devic ...

6 T' W  D' \3 E* e1 C/ X# D1 W你好,我觉得好像不太合适呢?因为在我这里的应用场景是上位机发送数据到MCU的时间是随机的,MCU无法在合适的时间里触发切换吧?是这样吗?
4 B7 S' g2 y# r% ~
使用道具 举报 回复
发表于 2019-4-20 22:47:40 | 显示全部楼层
没注意时同时,最好是再引一个串口出来。不然很麻烦。
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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