OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5460|回复: 4

请教原子大哥以及各位朋友,我串口中断接受数据老会丢掉几个字节,我现在想不出啥问题啊,大家帮看看。

[复制链接]

16

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2011-8-12
在线时间
6 小时
发表于 2013-7-19 09:12:01 | 显示全部楼层 |阅读模式
我是在串口一开了中断:

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的话,就会只打印出来一个字节的数据,非常纳闷。

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








正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-19 10:35:52 | 显示全部楼层
回复【楼主位】SEASON3:
---------------------------------
1,串口中断里面就别放printf了,严重影响数据接收.
2,USART_RX_STA,你这里用的逻辑混乱,自己好好分析下流程,能接受这么多数据我已经感叹你代码的神奇了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2011-8-12
在线时间
6 小时
 楼主| 发表于 2013-7-19 13:35:52 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥的提醒,我已经发现程序的问题错误所在了,我好好整理一下。
回复 支持 反对

使用道具 举报

16

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2011-8-12
在线时间
6 小时
 楼主| 发表于 2013-7-19 14:10:05 | 显示全部楼层
回复【2楼】正点原子:

回复【楼主位】SEASON3:
---------------------------------
1,串口中断里面就别放printf了,严重影响数据接收.
2,USART_RX_STA,你这里用的逻辑混乱,自己好好分析下流程,能接受这么多数据我已经感叹你代码的神奇了...

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

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-24
在线时间
1 小时
发表于 2013-9-5 22:42:12 | 显示全部楼层
回复【4楼】SEASON3:
---------------------------------
USART_RX_STA = 0;的前一句刚好中断来了,中断完了后接着USART_RX_STA 清零。不丢数据才怪
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 12:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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