打印

STM32如果串口发送数据的时候,接收也来了数据,怎么办

[复制链接]
11293|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wu0232|  楼主 | 2010-1-23 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
例如使用TC发送后中断,和RXNE接收中断。

如果正在发送数据,处于串口中断中,这时接收也来了一串数据,这种情况怎么处理?是不是就不能及时响应接收了呢?
沙发
djb20042008| | 2010-1-23 11:26 | 只看该作者
用NCIC配置中断的优先级

使用特权

评论回复
板凳
aozima| | 2010-1-23 12:04 | 只看该作者
如果正在发送数据,处于串口中断中,这时接收也来了一串数据


如果程序是这样
//中断入口
{
   if(TC)
   if(RXNE)
}
如果此时执行到TC处,则数据在RXNE处就被接收了,如果此时已经在执行RXNE,并准备退出,则退出后,会再来一次中断.

另外,CM3的中断嵌套是硬件实现的.

使用特权

评论回复
地板
香水城| | 2010-1-23 12:05 | 只看该作者
接收器中还有一个字节的缓冲,只要在下一个字节没有完全到达之前处理中断,则不会丢失数据。

使用特权

评论回复
5
wu0232|  楼主 | 2010-1-23 12:38 | 只看该作者
谢谢各位
to djb20042008
貌似TC和RXNE这种中断不能用NVIC来配置吧,NVIC配置的是USART

to aozima
明白你的意思。两个大if,判断条件TC或RXNE。如果在运行if(TC)的时候,有数据来,则在下一步运行if(RXNE)中就能接收;如果数据是在快要出中断的时候才来,那么RXNE仍然在本次串口中断退出后,再触发一次,接收到数据。
问题就是:这种方法能够确保在连续发送数据的时候,接收到突然来的一串数据么?

to 香版
那就是,如果软件处理的不好,还是可能丢接收数据?

再次感谢各位

使用特权

评论回复
6
香水城| | 2010-1-23 13:35 | 只看该作者
如果软件处理的不好,还是可能丢接收数据?
答:任何硬件环境,都会有这个问题。

在STM32上,如果接收缓冲区为空时,收到第一个数据时会设置RXNE标志,在没有清除RNXE标志(即没有读出第一个数据)时,如果第二个数据又来了,则第一个数据不会丢失,只要在第三个数据到来之前,读出数据,就不会丢失数据。

使用特权

评论回复
7
成成| | 2010-1-23 14:12 | 只看该作者
本帖最后由 成成 于 2010-1-23 14:19 编辑

楼主,如果串口发送的数据速率为115200(这在工业领域使用来说已经非常高了),
                           1
一个字节的传输时间是 ---------- * 10 = 86.8微秒,加上USART里面有一个接收缓冲,
                        115200
和一个移位寄存器,相当于两个字节字节的缓冲,也就是给你处理的时间有173.6微秒,
如果你的中断程序在这个时间之内,还不能把数据拿走,那只能换成DMA的方式处理。
如果115200,能搞定,那慢一点就更加没有问题了。

使用特权

评论回复
8
aozima| | 2010-1-23 14:23 | 只看该作者
俺都用921600的波特率....(仅调试):lol

使用特权

评论回复
9
成成| | 2010-1-23 14:42 | 只看该作者
to aozima
这么高的速率,你用在在工业控制领域吗?

使用特权

评论回复
10
wu0232|  楼主 | 2010-1-23 15:52 | 只看该作者
“如果软件处理的不好,还是可能丢接收数据?”
答:任何硬件环境,都会有这个问题。

在STM32上,如果接收缓冲区为空时,收到第一个数据时会设置RXNE标志,在没有清除RNXE标志(即没有读出第一个数据)时,如果第二个数据又来了,则第一个数据不会丢失,只要在第三个数据到来之前,读出数据,就不会丢失数据。香水城 发表于 2010-1-23 13:35


此时,第一个字节在Receive Data Register (RDR)中,第二个字节在Receive Shift Register中,所以还没有丢失,对不?

使用特权

评论回复
11
wu0232|  楼主 | 2010-1-23 15:54 | 只看该作者
to 成成

谢谢~~~~~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

130

帖子

1

粉丝