OpenEdv-开源电子网

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

在使用两个STM串口来实现收发数据,为什么在接受数据时,延迟打印后,每当发送4个数据后就会有一个数据被覆盖。

[复制链接]

4

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-8-28
在线时间
4 小时
发表于 2017-8-28 22:06:12 | 显示全部楼层 |阅读模式
1金钱
发送程序
//while(++time%500 != 0);
                                        usart3_send(0xff);
                                delay_ms(30);
                                //while(++time%500 != 0);
                                  usart3_send(0xfe);
                  delay_ms(30);                               
                                //while(++time%500 != 0);
                                  usart3_send(2);
                                  delay_ms(30);
                                //while(++time%500 != 0);
                                  usart3_send(1);
                                delay_ms(30);
                                //while(++time%500 != 0);
                                  usart3_send(72);
                                delay_ms(30);
                                //while(++time%500 != 0);
                                  usart3_send(10);
                                delay_ms(30);
                                //while(++time%500 != 0);
                                  usart3_send(20);
                                delay_ms(30);
                                //while(++time%500 != 0);
                                  usart3_send(30);
                                        delay_ms(30);
                                //while(++time%500 != 0);
                                  usart3_send(40);
                                        delay_ms(30);

发送的函数
void usart3_send(u8 data)
{
        USART3->DR = data;
        while((USART3->SR&0x40)==0);       
}

接受程序
int USART3_IRQHandler(void)
{       
        if(USART3->SR&(1<<5))//接收到数据
        {             
                u8 res;       
                res=USART3->DR;
                delay_ms(20);
                printf( "\r\n USART3接收到的数据=%d\r\n",res );
               
   }
return 0;       
}


最佳答案

查看完整内容[请看2#楼]

不带你这么玩的 ,1 要用双缓冲 1组缓冲最少1K 2.收到数据不要处理先扔缓冲 3.要用定时器判断数据超时
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2017-8-28 22:06:13 | 显示全部楼层
不带你这么玩的  ,1 要用双缓冲 1组缓冲最少1K   2.收到数据不要处理先扔缓冲   3.要用定时器判断数据超时
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-8-29 09:06:10 | 显示全部楼层
中断不要做延时和printf()函数
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-8-28
在线时间
4 小时
 楼主| 发表于 2017-8-29 09:57:56 | 显示全部楼层
。。我知道是delay(20)出的问题,但和printf没有关系吧,我是想问我在发送那边搞了个delay(30);在延迟打印搞了个delay(20);这不相当于在发送端延迟了delay(10);为什么,下面还是会出现我说的错误,我是想搞明白30是怎样被40覆盖的。麻烦知道的说具体点
回复

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2017-8-29
在线时间
32 小时
发表于 2017-8-29 12:16:25 | 显示全部楼层
首先在接收中断里面放延时这就是错误的写法。。中断的时间越短越好,你应该在你的循环里面做文章,肯定没问题。
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-29 12:56:40 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-29 12:58 编辑

接受程序
void USART3_IRQHandler(void)
{        
        if(USART3->SR&(1<<5))//接收到数据
        {              
                u8 res;        
                res=USART3->DR;
                delay_ms(20);
                printf( "\r\n USART3接收到的数据=%d\r\n",res );                 }
   USART_ClearITPendingBit(USART3, USART_IT_RXNE);  //加上清除中断标志
}
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-7-8
在线时间
9 小时
发表于 2017-8-29 15:01:14 | 显示全部楼层
首先,中断函数就有问题,中断函数可以有返回值吗???还有出了中断要清中断
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-8-28
在线时间
4 小时
 楼主| 发表于 2017-8-29 15:33:07 | 显示全部楼层
zey 发表于 2017-8-29 15:01
首先,中断函数就有问题,中断函数可以有返回值吗???还有出了中断要清中断

哥,return 0 是C语言的写法没错的,而且,只要读取寄存器的数据他就自动将RXNE清除了
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-8-28
在线时间
4 小时
 楼主| 发表于 2017-8-29 15:36:02 | 显示全部楼层
实话,跟你说吧,我只要注释掉DELAY(20),就实现正常的收发了,就是在那里加延迟才错的,你在看看我是怎么问的
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-7-8
在线时间
9 小时
发表于 2017-8-29 15:54:52 | 显示全部楼层
少爷在哪里 发表于 2017-8-29 15:33
哥,return 0 是C语言的写法没错的,而且,只要读取寄存器的数据他就自动将RXNE清除了

int USART3_IRQHandler(void)我说你这个写法不对,中断函数怎么可能又返回值?
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-8-28
在线时间
4 小时
 楼主| 发表于 2017-8-29 16:06:22 | 显示全部楼层
你不要纠结这个,问题不在哪里
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-8-30 00:35:20 | 显示全部楼层
自己去计算时间printf,很耗时间。。。
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-8-28
在线时间
4 小时
 楼主| 发表于 2017-8-30 15:37:40 | 显示全部楼层
正点原子 发表于 2017-8-30 00:35
自己去计算时间printf,很耗时间。。。

兄弟,打印很耗时间吗,这个我不知道耶,能不能叫我怎么计算啊,拜托了,大佬
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-8-28
在线时间
4 小时
 楼主| 发表于 2017-8-30 19:14:25 | 显示全部楼层
我还是不懂,为什么前面的数据没错,到了第四个就被覆盖了,
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-8-28
在线时间
4 小时
 楼主| 发表于 2017-8-30 19:15:40 | 显示全部楼层
少爷在哪里 发表于 2017-8-30 19:14
我还是不懂,为什么前面的数据没错,到了第四个就被覆盖了,

我就是知道具体是怎么错的,你能讲的在详细点吗
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2017-9-1 14:35:19 | 显示全部楼层
本帖最后由 aiyeba 于 2017-9-1 14:45 编辑
少爷在哪里 发表于 2017-8-30 19:15
我就是知道具体是怎么错的,你能讲的在详细点吗

要注意优先级的问题。就是cpu的使用权问题。

接送中断里面,当第一个字节接收到的时候,发送端还在跑自己的程序会继续发送。

如果,第二个字节又发送过来的时候,但是接收的函数还在中断函数里面。这个就丢失了。

你应该查查,为什么会出现,我数据都发送过来了,你还在中断里面,而且还是有规律的。

不妨,把20   改称25试试。
自己选择的路,成家前走完。
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-9-3 07:05:58 来自手机 | 显示全部楼层
在串口中断里使用^-^延时和打印一定要慎重考虑
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 20:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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