OpenEdv-开源电子网

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

请教一下大家,串口接收的数据无法实现实时性,只能读取一次,怎么办?

[复制链接]

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
发表于 2020-8-21 16:56:10 | 显示全部楼层 |阅读模式
请教一下大家,串口接收的数据无法实现实时性,只能读取一次,怎么办?就是第一次传输数据可以完成读取显示的工作,改变数据值,屏幕数据就不动了,这段程序应该如何修改?

  1. void USART1_IRQHandler(void)                        //′®¿ú1ÖD¶Ï·tÎñ3ìDò
  2. {  
  3.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  4.                 {       
  5.      RxBuffer1[i++]=USART_ReceiveData(USART1);   
  6.                         }       

  7.                 USART1_rev_data(RxBuffer1);
  8. }

  9. void USART1_rev_data(u8 RxBuffer[])
  10. {          
  11.        
  12.          if((0x16==RxBuffer1[0])&&(0x09==RxBuffer1[1])&&0x01==RxBuffer1[2]&&0xB5==RxBuffer1[11])
  13.        {                                 
  14.              a=(RxBuffer1[3]<<8)+RxBuffer1[4];
  15.                                      b=(RxBuffer1[5]<<8)+RxBuffer1[6];
  16.                                            sprintf(buf,"%d",a);
  17.                                      // printf("%d",a);
  18.                                      sprintf(buf,"%d",b);
  19.                    LCD_ShowxNum(56,50,a/10,5,16,0);
  20.                                      LCD_ShowxNum(56,80,b/10,5,16,0);
  21.                                             LED0=0;
  22.              }
  23. }
复制代码


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

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1434
金钱
1434
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-8-21 17:03:52 | 显示全部楼层
处理完数据,清空RxBuffer1数组,即把i置0. if((0x16==RxBuffer1[0])&&(0x09==RxBuffer1[1])&&0x01==RxBuffer1[2]&&0xB5==RxBuffer1[11])这个条件生效,加一句 i= 0;
回复 支持 反对

使用道具 举报

0

主题

79

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1928
金钱
1928
注册时间
2018-10-11
在线时间
256 小时
发表于 2020-8-22 08:06:02 | 显示全部楼层
一个问题问了好几天,是时候要恶补一下C语言基础了...
回复 支持 反对

使用道具 举报

12

主题

3397

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8669
金钱
8669
注册时间
2020-5-11
在线时间
4132 小时
发表于 2020-8-22 08:33:05 | 显示全部楼层
再想一下,假如USART1_rev_data里的if不成立,i什么时候清0,i的最大值是多少,RxBuffer1[i++]会不会写到数组之外。
假如if成立,且i已清0,下次收到一个字节的0x16,那么这个if语句是不是仍然成立?是不是不对?
专治疑难杂症
回复 支持 反对

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2020-8-24 08:41:46 | 显示全部楼层
spritels 发表于 2020-8-22 08:06
一个问题问了好几天,是时候要恶补一下C语言基础了...

回复 支持 反对

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2020-8-24 09:12:58 | 显示全部楼层
叶子君 发表于 2020-8-21 17:03
处理完数据,清空RxBuffer1数组,即把i置0. if((0x16==RxBuffer1[0])&&(0x09==RxBuffer1[1])&&0x01==RxBuff ...

没有用
回复 支持 反对

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2020-8-24 11:10:23 | 显示全部楼层
解决了,串口中断不能用打印函数
回复 支持 反对

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4498
金钱
4498
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-8-24 12:23:02 | 显示全部楼层
中断只负责把数据搬运到数组缓冲里面,在while中进行耗时的计算。我都是如果 3个字节接收时间内没收到新的数据再断帧的
回复 支持 反对

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2020-8-25 15:05:59 | 显示全部楼层
姚先起 发表于 2020-8-24 12:23
中断只负责把数据搬运到数组缓冲里面,在while中进行耗时的计算。我都是如果 3个字节接收时间内没收到新的 ...

是的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 17:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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