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

[复制链接]
13166|10
 楼主| wu0232 发表于 2010-1-23 11:25 | 显示全部楼层 |阅读模式
例如使用TC发送后中断,和RXNE接收中断。

如果正在发送数据,处于串口中断中,这时接收也来了一串数据,这种情况怎么处理?是不是就不能及时响应接收了呢?
djb20042008 发表于 2010-1-23 11:26 | 显示全部楼层
用NCIC配置中断的优先级
aozima 发表于 2010-1-23 12:04 | 显示全部楼层
如果正在发送数据,处于串口中断中,这时接收也来了一串数据


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

另外,CM3的中断嵌套是硬件实现的.
香水城 发表于 2010-1-23 12:05 | 显示全部楼层
接收器中还有一个字节的缓冲,只要在下一个字节没有完全到达之前处理中断,则不会丢失数据。
 楼主| wu0232 发表于 2010-1-23 12:38 | 显示全部楼层
谢谢各位
to djb20042008
貌似TC和RXNE这种中断不能用NVIC来配置吧,NVIC配置的是USART

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

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

再次感谢各位
香水城 发表于 2010-1-23 13:35 | 显示全部楼层
如果软件处理的不好,还是可能丢接收数据?
答:任何硬件环境,都会有这个问题。

在STM32上,如果接收缓冲区为空时,收到第一个数据时会设置RXNE标志,在没有清除RNXE标志(即没有读出第一个数据)时,如果第二个数据又来了,则第一个数据不会丢失,只要在第三个数据到来之前,读出数据,就不会丢失数据。
成成 发表于 2010-1-23 14:12 | 显示全部楼层
本帖最后由 成成 于 2010-1-23 14:19 编辑

楼主,如果串口发送的数据速率为115200(这在工业领域使用来说已经非常高了),
                           1
一个字节的传输时间是 ---------- * 10 = 86.8微秒,加上USART里面有一个接收缓冲,
                        115200
和一个移位寄存器,相当于两个字节字节的缓冲,也就是给你处理的时间有173.6微秒,
如果你的中断程序在这个时间之内,还不能把数据拿走,那只能换成DMA的方式处理。
如果115200,能搞定,那慢一点就更加没有问题了。
aozima 发表于 2010-1-23 14:23 | 显示全部楼层
俺都用921600的波特率....(仅调试):lol
成成 发表于 2010-1-23 14:42 | 显示全部楼层
to aozima
这么高的速率,你用在在工业控制领域吗?
 楼主| wu0232 发表于 2010-1-23 15:52 | 显示全部楼层
“如果软件处理的不好,还是可能丢接收数据?”
答:任何硬件环境,都会有这个问题。

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


此时,第一个字节在Receive Data Register (RDR)中,第二个字节在Receive Shift Register中,所以还没有丢失,对不?
 楼主| wu0232 发表于 2010-1-23 15:54 | 显示全部楼层
to 成成

谢谢~~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

130

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部