OpenEdv-开源电子网

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

请教一下大家和原子哥,关于清空串口缓存区数据的问题

[复制链接]

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
发表于 2021-3-31 10:30:07 | 显示全部楼层 |阅读模式
20金钱
请教一下大家和原子哥,关于清空串口缓存区数据的问题
  1. if(WriteReciPoint<BUFRECI)
  2.                 {
  3.                         Buf_Reci[WriteReciPoint]=SBUF1;
  4.                         WriteReciPoint++;
  5.                 }
复制代码
我在串口中断中接收报文并进行处理,接收的数据都存在Buf_Reci[WriteReciPoint]数组里,接收的报文可能是十几个16进制码,也可能是二十几个16进制码,每次处理后,需要将Buf_Reci[WriteReciPoint]进行清空,这一步该如何处理?我会处理清空固定数量报文,这种每次接收都不一样数量的该如何清除呢?

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

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-3-31 10:43:55 | 显示全部楼层
类似原子串口那样,加个接收协议,有个接收状态
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2021-3-31 10:56:01 | 显示全部楼层
hou18 发表于 2021-3-31 10:43
类似原子串口那样,加个接收协议,有个接收状态

有没有更简单的办法,我只是想清空缓存区里的数组
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-3-31 11:00:23 | 显示全部楼层
清除WriteReciPoint长度不就行了
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2021-3-31 11:01:10 | 显示全部楼层
nashui_sx 发表于 2021-3-31 11:00
清除WriteReciPoint长度不就行了

WriteReciPoint=0;这样没用
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-3-31 11:04:05 | 显示全部楼层
支持者2400 发表于 2021-3-31 11:01
WriteReciPoint=0;这样没用

memset(Buf_Reci,0,WriteReciPoint); 你那等于0有啥用
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2021-3-31 11:27:24 | 显示全部楼层
nashui_sx 发表于 2021-3-31 11:04
memset(Buf_Reci,0,WriteReciPoint); 你那等于0有啥用

我的处理程序是这样的,但是效果没啥变化啊
  1. void Int_serial1() interrupt 16// using 1 //,若不指定R区,则保存用到的R,并可节省8个字节RAM
  2. {
  3.         // ES=0;/*关串行口中断*/
  4.           //耗时 24us
  5.         //低位在前高位在后
  6.         if(SCON1 & 0x01) // RI1
  7.         {
  8.                 SCON1 &= (~0x01);  //RI1=0
  9.         
  10.                 if(WriteReciPoint<BUFRECI)
  11.                 {
  12.                         Buf_Reci[WriteReciPoint]=SBUF1;
  13.                         WriteReciPoint++;
  14.                 }
  15.       

  16.        if((0xEE==Buf_Reci[0])&&(0xB1==Buf_Reci[1])&&(0x04==Buf_Reci[6])&&(0x01==Buf_Reci[9])&&(0xFF==Buf_Reci[13]))//进仓
  17.                       {
  18.                SPEAKER_CTL1(ON);
  19.                              msDelay1(1000);      
  20.                WriteReciPoint=0;            
  21.                            Buf_Reci[13]=0;
  22.                memset(Buf_Reci,0,WriteReciPoint);
  23.                        }
  24.          else if((0xEE==Buf_Reci[0])&&(0xB1==Buf_Reci[1])&&(0x04==Buf_Reci[6])&&(0x00==Buf_Reci[9])&&(0xFF==Buf_Reci[13]))//出仓
  25.                        {
  26.                SPEAKER_CTL1(OFF);
  27.                 msDelay1(1000);  
  28.                 WriteReciPoint=0;
  29.                             Buf_Reci[13]=0;
  30. memset(Buf_Reci,0,WriteReciPoint);
  31.                        }
  32. }
复制代码
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2021-3-31 11:28:06 | 显示全部楼层
nashui_sx 发表于 2021-3-31 11:04
memset(Buf_Reci,0,WriteReciPoint); 你那等于0有啥用

和以前一样,处理固定长度的报文没问题,换一个不同的报文,就不行了
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2021-3-31 11:38:32 | 显示全部楼层
支持者2400 发表于 2021-3-31 11:28
和以前一样,处理固定长度的报文没问题,换一个不同的报文,就不行了

清空整个数组
memset(Buf_Reci,0,sizeof(Buf_Reci));
茵茵猪头
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2021-3-31 11:57:19 | 显示全部楼层
一般我都比较懒 因为现在内存都比较充裕了 我直接定义一个2048字节的数组 然后不管收到多少个 都全部清空  反正也要不了多少时间
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2021-3-31 13:39:37 | 显示全部楼层
simms01 发表于 2021-3-31 11:57
一般我都比较懒 因为现在内存都比较充裕了 我直接定义一个2048字节的数组 然后不管收到多少个 都全部清空   ...

代码如何实现,您指导一下
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2021-3-31 14:08:55 | 显示全部楼层
串口接收可以使用 循环队列  
一个数组 一个队头 一个队尾
只要判断队头与队尾就可以知道接收数据的情况
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2021-3-31 15:04:55 | 显示全部楼层
DongInker 发表于 2021-3-31 14:08
串口接收可以使用 循环队列  
一个数组 一个队头 一个队尾
只要判断队头与队尾就可以知道接收数据的情况

是的,现在需要对数据进行清空
回复

使用道具 举报

11

主题

2147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4894
金钱
4894
注册时间
2015-1-10
在线时间
612 小时
发表于 2021-3-31 15:49:01 | 显示全部楼层
全局数组a[n],直接memset(a, 0, sizeof(a));
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-3-31 23:25:21 | 显示全部楼层
百度下“环形队列”,有你要的答案。你这样把数据解码都扔中断里,不可取。
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2021-4-1 09:35:46 | 显示全部楼层
阿侑kevin 发表于 2021-3-31 15:49
全局数组a[n],直接memset(a, 0, sizeof(a));

没有用
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2021-4-1 10:24:09 | 显示全部楼层
pdwdzz 发表于 2021-3-31 23:25
百度下“环形队列”,有你要的答案。你这样把数据解码都扔中断里,不可取。

愿闻其详
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-4-2 00:23:47 | 显示全部楼层

思路很简单。可用用数组方式实现。
1.定义一个接收队列数组,如fifo[MAX1]; 两个变量count_in;count_out;初始时可以count_in=count_out=0,也可以count_in=count_out=-1(注意0初值和-1初值的区别);作用是定位接收、取出的数据的位置,用于判断是否有数据入列。
2.入列,在接收中断实现。每接收一个数据,根据count_in位置放入fifo,并且count_in++;count_in超出fifo就回到0,实现循环。
3.定义一个数据解析缓存。如data[MAX2];一个变量data_num=0;用于把接收队列的数据拷贝到这里解析。data_num表示解析未解析的数据大小,当然也做数组下标。
4.出列,主循环实现。发现count_in跑在count_out前边,说明有数据入列,那么就拷贝当前count_out到count_in位置的数据到data[data_num]后,data_num+数据大小。
5.数据解析,主循环实现。发现data_num非0,说明有数据出列待解析。从data[0]开始找数据帧头,如果非帧头,那说明是无用数据,整个data数组前移,把非帧头数据移出data数组丢弃。data_num-=移出数据大小。如果是帧头,不进行数组前移,等待data_num==一帧数据大小,也就是收满一帧。然后校验这帧数据。如果确实是数据,把数据处理后data 前移把这整帧都移出,data_num-=移出数据大小。如果数据校验不对说明是误帧头,同上把误帧头移出,继续寻找帧头。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 05:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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