CN110597482B - 一种用于串口在fifo中查找最新有效数据包的方法 - Google Patents
一种用于串口在fifo中查找最新有效数据包的方法 Download PDFInfo
- Publication number
- CN110597482B CN110597482B CN201910811151.8A CN201910811151A CN110597482B CN 110597482 B CN110597482 B CN 110597482B CN 201910811151 A CN201910811151 A CN 201910811151A CN 110597482 B CN110597482 B CN 110597482B
- Authority
- CN
- China
- Prior art keywords
- data
- packet
- fifo
- length
- effective data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F5/00—Methods or arrangements for data conversion without changing the order or content of the data handled
- G06F5/06—Methods or arrangements for data conversion without changing the order or content of the data handled for changing the speed of data flow, i.e. speed regularising or timing, e.g. delay lines, FIFO buffers; over- or underrun control therefor
- G06F5/10—Methods or arrangements for data conversion without changing the order or content of the data handled for changing the speed of data flow, i.e. speed regularising or timing, e.g. delay lines, FIFO buffers; over- or underrun control therefor having a sequence of storage locations each being individually accessible for both enqueue and dequeue operations, e.g. using random access memory
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Transfer Systems (AREA)
Abstract
本发明公开了一种用于串口在FIFO中查找有效数据包的方法,属于数据处理的技术领域,先把串口FIFO中的数据存入一个设定大小的缓存数组中,然后在缓存数组中查找有效数据包,最后将有效数据从缓存数组中移出并使用,该方法包括如下步骤:(1)接收串口数据,以获取有效数据长度;(2)查找有效数据包;(3)取出有效数据包;以达到串口能够在缓存数组中快速查找有效数据,并将有效数据移出并使用的目的。
Description
技术领域
本发明属于数据处理的技术领域,具体而言,涉及一种用于串口在FIFO中查找最新有效数据包的方法。
背景技术
FIFO即为先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令;串口是一种常用的异步通信接口,串口通信因具有传送距离远,抗干扰能力强等优点得到了广泛应用。
为了保证接收数据系统正确识别数据,需要发送端和接收端约定一个通信协议,用数据包的形式进行信息的传输和交换。
现有的串口在数据包接收过程中,存在以下缺陷:
(1)在数据传输过程中,对数据的查找效率较低,无法快速查找到最新的数据;
(2)在数据传输过程中,对数据的验证过程不合理,导致无法保证数据正确性;
(3)在数据传输过程中,无法灵活处理和应对刷新周期较快的串口数据。
发明内容
鉴于此,为了解决现有技术存在的上述问题,本发明的目的在于提供一种用于串口在FIFO中查找最新有效数据包的方法以达到串口能够在缓存数组中快速查找有效数据,并将有效数据移出并使用的目的。
本发明所采用的技术方案为:一种用于串口在FIFO中查找最新有效数据包的方法,该方法包括如下步骤:
(1)接收串口数据,以获取有效数据长度;
(2)查找有效数据包
1)当有效数据长度小于该串口中定义的数据包长度,退出并返回包头位置;否则执行步骤2);
2)将包头位置置为缓存数组中尾指针往后一个数据包长度的位置,检测包头位置初始是否为包头,若为包头且校验正确,则认为找到有效数据包,置有效数据长度为0,并返回包头位置;否则,执行步骤3);
3)将包头位置回溯一个字节查找,检测到包头且该位置往前一个数据包长度位置也为包头且校验正确,认为找到有效数据包,置有效数据长度为回溯次数,并返回包头位置;否则,重复执行并将回溯次数累加,直到查找完有效数据且均未找到有效数据包,置有效数据长度为数据包长度减1,退出并返回包头位置;
(3)取出有效数据包
将缓存数组从包头位置开始,拷贝出一个数据包长度的数据,并将缓存数组中对应位置的数据清0。
进一步地,所述步骤(1)中,接收串口数据的步骤如下:
a)读取该串口的FIFO状态寄存器,并将计算器置0;
b)读取该串口的FIFO地址数据到缓存数组,计算器加1;
c)查看FIFO地址数据中的状态位,若为“0”,则FIFO为非空,再次执行步骤b);若为“1”,则FIFO为空,执行步骤d);
d)记录缓存数组中尾指针位置,并返回该计算器本次所读取的字节数,以获取有效数据长度。
进一步地,所述步骤a)中,若FIFO状态寄存器中FIFO空标志为空,则返回0并退出;若FIFO状态寄存器中FIFO空标志为非空,则执行步骤b)。
进一步地,所述步骤b)中,当缓存数组中尾指针到达缓存数组的末尾时,若还要继续增加则跳到该缓存数组的起始位置。
进一步地,所述步骤b)中,所述缓存数组的长度设置为大于两倍该串口中定义的数据包长度,以实现该缓存数组中能够存入至少一个有效数据包。
进一步地,所述计算器用于记录从FIFO中读取的数据字节数。
进一步地,所述步骤3)中,回溯次数的初始值为0。
本发明的有益效果为:
1.采用本发明所提供的用于串口在FIFO中查找最新有效数据包的方法,缓存数组中尾指针和有效数据长度的灵活使用能够处理在快速接收时接收到非整包数据的情形。
2.采用本发明所提供的用于串口在FIFO中查找最新有效数据包的方法中,包头位置回溯一个字节查找,以有效数据长度为回溯次数,采用倒序查找方式,保证查找到最新的数据,并节省查找时间,提高了对有效数据包的查找效率。
3.采用本发明所提供的用于串口在FIFO中查找最新有效数据包的方法中,在查找有效数据包的过程中,均需要将包头和校验进行双重验证,保证数据正确性。
4.采用本发明所提供的用于串口在FIFO中查找最新有效数据包的方法,将缓存数组的长度设置为大于两倍数据包长度,保证能够存入至少一个有效数据包,以对查找有效数据包提供可靠保障。
附图说明
图1是本发明所提供的用于串口在FIFO中查找最新有效数据包的方法中查找有效数据包的运行逻辑流程图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本发明实施例的描述中,需要说明的是,指示方位或位置关系为基于附图所示的方位或位置关系,或者是该发明产品使用时惯常摆放的方位或位置关系,或者是本领域技术人员惯常理解的方位或位置关系,或者是该发明产品使用时惯常摆放的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于区分描述,而不能理解为指示或暗示相对重要性。
在本发明实施例的描述中,还需要说明的是,除非另有明确的规定和限定,术语“设置”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是直接连接,也可以通过中间媒介间接连接。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义;实施例中的附图用以对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
实施例1
在本实施例中具体提供了一种用于串口在FIFO中查找最新有效数据包的方法,该方法包括如下步骤:
(1)接收串口数据,以获取有效数据长度,其过程如下:
a)读取该串口的FIFO状态寄存器,并将计算器置0,计算器用于记录本次从FIFO中读取的数据字节数;FIFO寄存器,包括寄存器单元的序列,寄存器单元包括数据部分和状态部分,其中在输入部分提供的数据通过寄存器单元中的数据部分移位到输出端,每个单元的状态部分指示那个单元中的数据部分是否包括有效数据;
在该步骤a)中,若FIFO状态寄存器中FIFO空标志为空,表明串口的FIFO中并不存在有效数据,则返回0并退出;若FIFO状态寄存器中FIFO空标志为非空,表明串口的FIFO中存在有效数据,则执行步骤b)。
b)读取该串口的FIFO地址数据到缓存数组,计算器加1;缓存数组又称为缓冲队列,该缓冲队列通常通过串口缓冲区指针类型、头指针、尾指针以及数据长度进行定义;该缓存数组的长度设置为大于两倍该串口中定义的数据包长度,以实现该缓存数组中能够存入至少一个有效数据包;当缓存数组中尾指针到达缓存数组的末尾时,若还要继续增加则跳到该缓存数组的起始位置;
采用该方法的原理为:形成环形缓冲区,该环形缓冲区则为所述缓存数组,该缓存数组中包括头指针和尾指针,通过移动头指针和尾指针就可以实现缓冲区的数据读取和写入,在通常情况下,应用程序读取缓存数组的数据仅仅会影响头指针,而串口接收数据仅仅会影响尾指针;当串口接收到新的数组,则将数组保存到缓存数组中,同时将尾指针加1,以保存下一个数据;应用程序在读取数据时,头指针加1,以读取下一个数据;当“尾指针”超过数组大小时,则尾指针重新指向数组的首元素,从而形成环形缓冲区。
c)查看FIFO地址数据中的状态位,若为“0”,则FIFO为非空,再次执行步骤b);若为“1”,则FIFO为空,执行步骤d);
d)记录缓存数组中尾指针位置,并返回该计算器本次所读取的数据字节数,以获取/定义为有效数据长度;
(2)查找有效数据包
1)当有效数据长度小于该串口中定义的数据包长度,则返回-1,退出并返回包头位置;否则执行步骤2);
2)将包头位置置为缓存数组中尾指针往后一个数据包长度的位置,检测包头位置开始是否为包头,若为包头且校验正确,则认为找到有效数据包,置有效数据长度为0,此处找到一个有效数据包,而且是在缓存数组的最后部分,所以认为缓存数组中已经没有有效数据了,置有效数据长度为0,执行下一循环的步骤1)时,根据接收情况,重新计算有效数据长度并在查找时使用,并返回包头位置;否则,执行步骤3);
3)将包头位置回溯一个字节查找,检测到包头且该位置往前一个数据包长度位置也为包头且校验正确,认为找到有效数据包,置有效数据长度为回溯次数,并返回包头位置,置为回溯次数表示本次找出有效数据包后,只有最后回溯次数个字节的数据还有效,下一循环查找时还会查找这几个字节;否则,重复执行并将回溯次数累加,回溯次数的初始值为0,直到查找完有效数据且均未找到有效数据包,置有效数据长度为数据包长度减1,返回-1,退出并返回包头位置,有效数据是指从尾指针往前,有效数据长度之内的数据;由于查找需要一个完整包,所以这里实际等价于回溯次数达到剩余有效数据长度减去一个数据包长度时,此时,若继续进行查找也无法找到一个完整包,因此,查找结束并认为查找完有效数据。
(3)取出有效数据包
将缓存数组从包头位置开始,拷贝出一个数据包长度的数据,并将缓存数组中对应位置的数据清0。
本发明不局限于上述可选实施方式,任何人在本发明的启示下都可得出其他各种形式的产品,但不论在其形状或结构上作任何变化,凡是落入本发明权利要求界定范围内的技术方案,均落在本发明的保护范围之内。
Claims (7)
1.一种用于串口在FIFO中查找最新有效数据包的方法,其特征在于,该方法包括如下步骤:
(1)接收串口数据,以获取有效数据长度;
(2)查找有效数据包
1)当有效数据长度小于该串口中定义的数据包长度,退出并返回;否则执行步骤2);
2)将包头位置置为缓存数组中尾指针往后一个数据包长度的位置,检测包头位置初始是否为包头,若为包头且校验正确,则认为找到有效数据包,置有效数据长度为0,并返回包头位置;否则,执行步骤3);
3)将包头位置回溯一个字节查找,检测到包头且该位置往前一个数据包长度位置也为包头且校验正确,认为找到有效数据包,置有效数据长度为回溯次数,并返回包头位置;否则,重复执行并将回溯次数累加,直到查找完有效数据且均未找到有效数据包,置有效数据长度为数据包长度减1,退出并返回包头位置;
(3)取出有效数据包
将缓存数组从包头位置开始,拷贝出一个数据包长度的数据,并将缓存数组中对应位置的数据清0。
2.根据权利要求1所述的用于串口在FIFO中查找最新有效数据包的方法,其特征在于,所述步骤(1)中,接收串口数据的步骤如下:
a)读取该串口的FIFO状态寄存器,并将计算器置0;
b)读取该串口的FIFO地址数据到缓存数组,计算器加1;
c)查看FIFO地址数据中的状态位,若为“0”,则FIFO为非空,再次执行步骤b);若为“1”,则FIFO为空,执行步骤d);
d)记录缓存数组中尾指针位置,并返回该计算器本次所读取的字节数,以获取有效数据长度。
3.根据权利要求2所述的用于串口在FIFO中查找最新有效数据包的方法,其特征在于,所述步骤a)中,若FIFO状态寄存器中FIFO空标志为空,则返回0并退出;若FIFO状态寄存器中FIFO空标志为非空,则执行步骤b)。
4.根据权利要求2所述的用于串口在FIFO中查找最新有效数据包的方法,其特征在于,所述步骤b)中,当缓存数组中尾指针到达缓存数组的末尾时,若还要继续增加则跳到该缓存数组的起始位置。
5.根据权利要求2所述的用于串口在FIFO中查找最新有效数据包的方法,其特征在于,所述步骤b)中,所述缓存数组的长度设置为大于两倍该串口中定义的数据包长度,以实现该缓存数组中能够存入至少一个有效数据包。
6.根据权利要求2所述的用于串口在FIFO中查找最新有效数据包的方法,其特征在于,所述计算器用于记录从FIFO中读取的数据字节数。
7.根据权利要求1所述的用于串口在FIFO中查找最新有效数据包的方法,其特征在于,所述步骤3)中,回溯次数的初始值为0。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910811151.8A CN110597482B (zh) | 2019-08-30 | 2019-08-30 | 一种用于串口在fifo中查找最新有效数据包的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910811151.8A CN110597482B (zh) | 2019-08-30 | 2019-08-30 | 一种用于串口在fifo中查找最新有效数据包的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110597482A CN110597482A (zh) | 2019-12-20 |
CN110597482B true CN110597482B (zh) | 2021-11-16 |
Family
ID=68856431
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910811151.8A Active CN110597482B (zh) | 2019-08-30 | 2019-08-30 | 一种用于串口在fifo中查找最新有效数据包的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110597482B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114710566A (zh) * | 2022-06-06 | 2022-07-05 | 辰星(天津)自动化设备有限公司 | 机器人控制系统的通讯交互方法、及机器人系统 |
CN115596988B (zh) * | 2022-12-13 | 2023-04-21 | 四川凯德源科技有限公司 | 一种lng加气站站控系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102111383A (zh) * | 2009-12-28 | 2011-06-29 | 北京安码科技有限公司 | 一种利用优先级队列防止dos攻击的方法 |
CN104639460A (zh) * | 2015-02-03 | 2015-05-20 | 重庆邮电大学 | 一种基于众核处理器的高速网络数据包并行化接收方法 |
CN109213143A (zh) * | 2017-07-03 | 2019-01-15 | 百度(美国)有限责任公司 | 操作自动驾驶车辆的使用事件循环的集中调度系统 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10521390B2 (en) * | 2016-11-17 | 2019-12-31 | The United States Of America As Represented By The Secretary Of The Air Force | Systems and method for mapping FIFOs to processor address space |
CN107395565B (zh) * | 2017-06-15 | 2020-03-17 | 北京机械设备研究所 | 一种定长单字节格式报文协议下串口接收预处理方法 |
CN109936553A (zh) * | 2017-12-18 | 2019-06-25 | 宁波中科集成电路设计中心有限公司 | 一种串口通信协议自动适配中间件 |
-
2019
- 2019-08-30 CN CN201910811151.8A patent/CN110597482B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102111383A (zh) * | 2009-12-28 | 2011-06-29 | 北京安码科技有限公司 | 一种利用优先级队列防止dos攻击的方法 |
CN104639460A (zh) * | 2015-02-03 | 2015-05-20 | 重庆邮电大学 | 一种基于众核处理器的高速网络数据包并行化接收方法 |
CN109213143A (zh) * | 2017-07-03 | 2019-01-15 | 百度(美国)有限责任公司 | 操作自动驾驶车辆的使用事件循环的集中调度系统 |
Non-Patent Citations (1)
Title |
---|
基于DPDK的数据包查表技术的设计与实现;杨军;《中国优秀硕士学位论文全文数据库 信息科技辑》;20160315;I138-2793 * |
Also Published As
Publication number | Publication date |
---|---|
CN110597482A (zh) | 2019-12-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110597482B (zh) | 一种用于串口在fifo中查找最新有效数据包的方法 | |
EP3206123B1 (en) | Data caching method and device, and storage medium | |
CN107395565B (zh) | 一种定长单字节格式报文协议下串口接收预处理方法 | |
CN100596077C (zh) | 通道化逻辑单通道统计的方法和装置 | |
CN108462652B (zh) | 一种报文处理方法、装置和网络设备 | |
CN110515881A (zh) | 一种串口通信帧的同步系统及同步高性能方法 | |
EP2219114A1 (en) | Method and apparatus for allocating storage addresses | |
CN105446699A (zh) | 数据帧队列管理方法 | |
CN102629235A (zh) | 一种提高ddr存储器读写速率的方法 | |
CN101594305B (zh) | 一种报文处理方法及装置 | |
EP2442500B1 (en) | Data transfer device and data transfer method | |
CN108108148B (zh) | 一种数据处理方法和装置 | |
CN116610608B (zh) | 直接内存访问描述符处理方法、系统、装置、设备及介质 | |
CN114153758B (zh) | 具有帧计数功能的跨时钟域数据处理方法 | |
CN110851390B (zh) | 一种基于fpga实现4m 1553b总线协议的方法及系统 | |
US20030005344A1 (en) | Synchronizing data with a capture pulse and synchronizer | |
CN111367494B (zh) | 一种串行数据帧接收方法及装置 | |
CN115002052B (zh) | 一种分层的缓存控制器、控制方法及控制设备 | |
CN117499351A (zh) | 报文转发装置及方法、通信芯片及网络设备 | |
CN114900484A (zh) | 一种不同网络接口间的数据传输方法、装置、设备及介质 | |
CN105099948A (zh) | 一种报文信息处理方法及装置 | |
CN106126435B (zh) | 一种实现链表流水操作的电路结构及操作方法 | |
CN113835634B (zh) | 一种基于环形内存双缓冲的多参量数据同步收录方法及装置 | |
CN115292029A (zh) | 一种基于arm的不定字节串口可靠接收方法 | |
JP3666285B2 (ja) | 電子回路 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |