打印

请教各位朋友,我STM3串口中断接受数据老会丢掉几个字节

[复制链接]
2884|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SEASON3|  楼主 | 2013-7-19 09:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 SEASON3 于 2013-7-19 11:02 编辑

我串口中断接受数据老会丢掉几个字节,我现在想不出啥问题啊,大家帮看看

我是在串口一开了中断:

void USART1_IRQHandler(void)                        
{        
    if (USART_GetITStatus(USART1, USART_IT_RXNE)  !=  RESET)
    {
        Res = USART1->DR;
        USART_RX_BUF[USART_RX_STA & 0x01FF] = Res ;
        USART_RX_STA ++;
}
中断进去了,但是发出接收到的数据,比如说我发个 “123456789ABCDEFG”,很多时候我收到 “13579BDEG” 或者 “12468ACDF”等,有时候是隔一个字节丢有时候又不是。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

主函数中发送我就是:
while (1)
{        
    if (USART_RX_STA)
    {                                          
        len = USART_RX_STA & 0x01FF;
        for (t=0; t<len; t++)
        {
            USART1->DR = USART_RX_BUF[t];
            while((USART1->SR & 0X40) == 0);
        }
        USART_RX_STA = 0;
    }
}

而且我发现如果在串口1的接收中断里面添加printf的话,就会只打印出来一个字节的数据,非常纳闷。

谢谢各位耐心回答我的问题!




沙发
IJK| | 2013-7-19 09:29 | 只看该作者
先自发自收,确保正确,再做下一步。

使用特权

评论回复
板凳
SEASON3|  楼主 | 2013-7-19 10:13 | 只看该作者
IJK 发表于 2013-7-19 09:29
先自发自收,确保正确,再做下一步。

我是先自发自收喔,现在初步发现了问题所在了,主函数里面USART_RX_STA的问题。我再仔细研究看看。

使用特权

评论回复
地板
jamsan| | 2013-7-19 10:38 | 只看该作者
USART_RX_BUF[t], 发送和接收是同一个buffer?? 这不是来打架的吗?建议单独发送一串数据,然后看看接收回来的对不对。

使用特权

评论回复
5
SEASON3|  楼主 | 2013-7-19 11:02 | 只看该作者
jamsan 发表于 2013-7-19 10:38
USART_RX_BUF[t], 发送和接收是同一个buffer?? 这不是来打架的吗?建议单独发送一串数据,然后看看接收 ...

把接收到的数据存到这个buffer然后再把他发出去应该没啥问题吧,我现在觉得是主函数while里面USART_RX_STA的问题,波特率的速度远远低于主函数里面清零的速度导致的。

使用特权

评论回复
6
sjnh| | 2013-7-19 11:39 | 只看该作者
USART_RX_STA定义成volatile,防止优化问题;
在main中,如果发送完成正执行到USART_RX_STA = 0;前面,串口接收产生中断,中断中USART_RX_STA++,退出中断后USART_RX_STA被清0,就会出现丢失接收的数据现象,接收、发送不要用一个指针

使用特权

评论回复
7
SEASON3|  楼主 | 2013-7-19 14:13 | 只看该作者
sjnh 发表于 2013-7-19 11:39
USART_RX_STA定义成volatile,防止优化问题;
在main中,如果发送完成正执行到USART_RX_STA = 0;前面,串口 ...

我现在解决了,因为我从设备接收到的数据是没有声明结束标志位的,所以我现在干脆接收到那么多位数据再进行发送,主函数中判断接收到了这么多位数据方可发送,我函数之所以出问题是因为while (1)中USART_RX_STA频繁清零导致的,远远大于波特率接收中断的速度。 我打算日后再加一个时间判断,在接收数据不满那么多位的情况下,如果规定时间内再没接收到数据,就当作数据接收完了然后发出去即可

使用特权

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

本版积分规则

1

主题

54

帖子

1

粉丝