找回密码
 注册
关于网站域名变更的通知
查看: 131|回复: 3
打印 上一主题 下一主题

在RT-Thread标准版里如何实现像伪代码那样的空闲中断

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-12 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
这个问题论坛里很多问的,我也看了看,网上也搜了搜,感觉还是需要讨论下
6 N" [% g- C7 d) Y* {2 q  \  Y1 T( v' M; z: j2 j9 {3 H, y
根据以往的撸代码经验,裸机或者使用RT-Thread nano时候,串口handler函数里代码大概是这个样子的。
! W' L7 U6 R2 ?0 _
7 o' A1 s4 Q2 i6 ?( t$ v//伪代码' {4 U  r3 B9 y. ?
void USART3_IRQHandler(void)
4 r0 Y% K% d0 d! T  y{% |- ?8 r% e$ Q+ U$ _8 \& R7 y" U/ P9 M
if(1 == 接收标志位)
" n0 r5 F6 G+ A2 A+ N6 d" Y{
" g+ Y6 X# I2 j6 K' ~3 Y把数据存到buf里面;
2 [1 ?$ Q6 k) v0 J$ A}
  r, m9 N7 j) M8 ~if(1 == 空闲标志位)2 Z3 n. l2 O3 x  o& X
{
+ p) o. z2 Z  _9 K& T5 Y发送个信号量,或者置一个标志位,给串口处理线程或main;
. l1 w& ]2 n- S$ W$ v+ e  M}) @- N+ l  b+ E- o+ ~9 @
}
$ d) d2 ?- p) X. }0 S: `现在开始用RT-Thread 标准版,驱动框架还没仔细研究,但是想按照以前的方式写一个串口接收不定长数据的代码都不好写出来了。看了下rt_hw_serial_isr,里面好像没有关于空闲中断的使用。
% Z) g2 z# Z5 z. J: v$ C) S( g& i3 L8 n/ `1 J
请教下各位,在RT-Thread 标准版里,如何实现,像上面伪代码那样的空闲中断?使用DMA和不使用DMA,实现起来是否一样?
% Q! J9 n$ k3 y- ^+ Z
% ^1 f* f, R1 p( k! v我看了文档里《串口设备使用示例》,没有用到空闲中断。在serial_thread_entry里面添加一个空闲标志位判断,会影响RTT驱动框架吗?如下更改:6 O6 q, L% a, V7 l4 z0 C" y
2 z4 T" G9 E  u( n. k% |
/* invoke callback /1 W2 U5 b7 X2 Y8 e3 o% a
if (serial->parent.rx_indicate != RT_NULL && USART_GetIntStatus(USART1, USART_INT_IDLEF) != RESET)9 s0 v% G& A% p2 V- H4 J
{) ^4 J4 ]* {8 I: n  U: K
rt_size_t rx_length;1 r: ^- L2 ~7 t' u6 G
/ get rx length */, G2 L2 M* u  w) J
level = rt_hw_interrupt_disable();' l- w$ l; c3 _6 y. Q
rx_length = (rx_fifo->put_index >= rx_fifo->get_index)? (rx_fifo->put_index - rx_fifo->get_index):
4 M; m7 A; S/ S/ i(serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index));, }' ^, t+ C$ n% G6 u% Y
rt_hw_interrupt_enable(level);
4 q. e. A% A, D5 q. ^; V1 ?if (rx_length)
1 f+ a8 t6 W* x1 ?1 U( @+ T  t{7 }' M( \: X$ \6 Y
serial->parent.rx_indicate(&serial->parent, rx_length);0 r3 m! r( X  B. O: z9 ]
}
- t+ I, X  j( C3 |}
! `3 `" I8 V. o不使用空闲中断,是不是因为,有些mcu没有空闲中断?为了保证兼容性?) n$ `+ Z  G- ?# C4 h8 d

该用户从未签到

2#
发表于 2022-7-12 16:57 | 只看该作者
可以使用rs485软件包实现不定长帧接收,设置适当的字节超时时间,就可自动分帧。
. C3 _2 e1 O) g/ U; X6 l

该用户从未签到

3#
发表于 2022-7-12 17:29 | 只看该作者
开个定时器判断字节间隔时间,太不好用了。。。为啥有空闲中断不用, c* I8 m' v" t! P6 p, A4 B) y. l  p% m

该用户从未签到

4#
发表于 2022-7-12 17:42 | 只看该作者
为什么不用硬件空闲中断分帧,因为时间太短且不可调,用于协议分帧不实用。* q9 z& t/ }- X  G5 K9 I3 v
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-18 14:34 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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