CN111181819A - 一种基于链表结构的接收多字节数据帧的串口通讯方法 - Google Patents
一种基于链表结构的接收多字节数据帧的串口通讯方法 Download PDFInfo
- Publication number
- CN111181819A CN111181819A CN201911358381.XA CN201911358381A CN111181819A CN 111181819 A CN111181819 A CN 111181819A CN 201911358381 A CN201911358381 A CN 201911358381A CN 111181819 A CN111181819 A CN 111181819A
- Authority
- CN
- China
- Prior art keywords
- data
- frame
- linked list
- thread
- byte
- 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.)
- Granted
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L12/00—Data switching networks
- H04L12/28—Data switching networks characterised by path configuration, e.g. LAN [Local Area Networks] or WAN [Wide Area Networks]
- H04L12/40—Bus networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L12/00—Data switching networks
- H04L12/28—Data switching networks characterised by path configuration, e.g. LAN [Local Area Networks] or WAN [Wide Area Networks]
- H04L12/40—Bus networks
- H04L2012/40208—Bus networks characterized by the use of a particular bus standard
- H04L2012/40228—Modbus
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Software Systems (AREA)
- Communication Control (AREA)
Abstract
本发明的实施例提供了一种基于链表结构的接收多字节数据帧的串口通讯方法和装置。所述方法包括接收数据项,存储于接收数据链表,使数据项在接收数据链表中的顺序与接收数据项的先后顺序一致;对接收数据链表中的数据项进行串接,利用帧提取线程识别完整帧,提取完整帧的数据到所述接收数据链表,并复制到帧数据链表进行存储;在所述完整帧的数据从接收数据链表复制到帧数据链表后,删除接收数据链表的完整帧的数据;启动帧解析线程,通过帧解析线程链表对所述完整帧的数据进行解析。以此方式,可以解决数据帧被分散的问题,实现无时间等待的连续性数据接收,对字节数随机的帧数据的接收;线程队列的方式降低系统自身对线程调度的时间消耗。
Description
技术领域
本发明的实施例一般涉及串口通讯领域,并且更具体地,涉及一种基于链表结构的接收多字节数据帧的串口通讯方法。
背景技术
在工业现场进行通讯,一般采用现场总线,其特点是结构简化、易于维护、稳定及实时性高,常用的现场传输协议包括串口、can等。根据开放式系统互联(OSI)规定的7层网络协议,这些现场传输方式相当于OSI的第2层,即数据链路层,该层的主要功能是将数据按照通用的数据链路控制协议(HDLC)安全传输至目的设备,该协议要求以帧的方式发送控制信息及数据信息,且数据信息一次不能超过2000比特,因此有效携带数据不超过250个字节。上述常用串口和can传输方式每次可发送的字节数分别为1字节和8字节,其作为数据链路层单次可携带数据量更是远远低于250个字节。而实际现场应用中,单次发送的一组有效数据也被以帧方式进行传输,称为应用数据帧,为便于区分,将数据链路传输使用的帧定义为链路帧。实际场景中,应用数据帧的长度会大于链路帧单次可携带数据量,在这种情况下,应用帧的数据在写入发送缓冲区后将被链路层层自动拆分为多个数据包进行传输,这就需要在接收方进行数据组装。更可以说,只要应用帧的长度大于链路帧的长度,一定会发生应用数据被拆分为多个数据包进行发送的情况。
在实际的互联网传输应用中,传输层会将大数据帧进行拆分、编制序列号,在接收方进行重新组装,但由于现场总线每次传输的数据量有限,如果加入过多的特定标识,有效信息携带量将成倍减少。对于串口这种每次只发送一个字节的传输方式,实现OSI的传输层使用拆分等功能是不可能的。只能靠先后顺序接收数据,最后在接收方进行组装。
目前工业现场常用的能够基于小链路帧传递应用帧的方法有MODBUS协议和YMODEM协议等,但这些协议均有其弊端,例如MODBUS协议必须采用时间间隔停顿的方式来识别被拆分发送的应用帧;又例如YMODEM协议强制要求应用帧长度必须小于链路帧长度。故,现有技术中没有既能实现不间断传输又能实现帧字节数随机变化的传输协议。
在现场的数据传统方式中串口通讯由于其布线简单、接口通用等特点一直作为现场通讯的主力军。串口的特点为每次只能发送一个字节,
发明内容
根据本发明的实施例,提供了一种基于链表结构的接收多字节数据帧的串口通讯方案。
在本发明的第一方面,提供了一种基于链表结构的接收多字节数据帧的串口通讯方法。该方法包括:
从串口缓冲区接收数据,存储于接收数据链表;
通过帧提取线程调用帧提取操作,识别接收数据链表中的完整帧,提取完整帧的数据,复制到帧数据链表进行存储;
在所述完整帧的数据从接收数据链表复制到帧数据链表后,删除接收数据链表中对应的数据;
通过帧解析线程调用帧解析操作,对帧数据链表中完整帧的数据进行解析。
进一步地,所述接收数据链表由若干个链表元素根据接收数据的先后顺序串接形成,每个链表元素只存储一个字节数组,每个字节数组包含一个用于存储字节数据的成员和一个标志位成员;其中字节数据为单次从串口缓冲区读取到的数据,标志位用于表示对应的字节数据是否进行过帧提取操作。
进一步地,所述帧数据链表由若干个链表元素根据提取帧数据的先后顺序串接形成,每个链表元素只存储一个帧数据对象,每个帧数据对象包含一个用于存储帧数据的成员和两个标志位的成员,其中帧数据为从接收数据链表中提取的帧数据,第一标志位用于表示帧数据是否被解析,第二标志位用于表示帧数据是否是完整帧。
进一步地,所述删除接收数据链表中对应的数据,包括:
从首项开始,对接收数据链表中的链表元素按照串接顺序逐个进行遍历,累加被遍历链表元素内数据的字节长度,当累加的字节长度等于待删除字节数时,停止遍历,记录被遍历的链表元素个数;其中待删除字节数为提取的所有完整帧的总字节数;
从接收数据链表中,删除被遍历的链表元素。
进一步地,所述删除接收数据链表中对应的数据,还包括:
从首项开始,对接收数据链表中的链表元素按照串接顺序逐个进行遍历,累加被遍历链表元素内数据的字节长度,当累加的字节长度大于待删除字节数时,停止遍历,记录被遍历的链表元素个数;
此时最后一个待删除字节落在最后一个被遍历链表元素内,则删除待删除的字节对应的数据,新建数组,并将该链表元素中的剩余数据复制到新数组中,用新数组替换原数组。
进一步地,所述完整帧的数据包括:
上一帧的帧尾与下一帧帧头之间的数据;
本帧帧头与下一帧帧头之间的数据;
本帧帧头与本帧帧尾之间的数据。
进一步地,还包括从接收数据链表中提取非完整帧的数据,置于所述帧数据链表的末位置。
进一步地,所述非完整帧的数据为:
在未发现下一帧帧头及下一帧帧尾,且存在上一帧帧尾的情况下,上一帧帧尾至数据结尾之间的数据;
在未发现下一帧帧头及下一帧帧尾,且存在本帧帧头的情况下,本帧帧头至数据结尾之间的数据。
进一步地,还包括线程链表,用于存储帧提取线程和帧解析线程,通过添加线程操作和移除线程操作,使同一类型的可运行状态下的线程个数不超过1。
进一步地,所述添加线程操作为:
线程链表检测其表内的链表元素个数,如果不大于1,则创建线程,并将其加入线程链表;
再次检测线程链表内的链表元素个数,如果等于1,则启动运行该线程;否则将该线程置为等待状态;
所述移除线程操作为:
先从线程链表中移除第一个链表元素中的线程,再判断链表内元素数,元素数不为0时,启动链表中的第一个元素中的线程。
应当理解,发明内容部分中所描述的内容并非旨在限定本发明的实施例的关键或重要特征,亦非用于限制本发明的范围。本发明的其它特征将通过以下的描述变得容易理解。
本发明很好的解决了数据帧被分散的问题,实现无时间等待的连续性数据接收,对字节数随机的帧数据的接收;线程队列的工作方式也降低了系统自身对线程调度的时间消耗;采用数据在帧提取完毕后就立刻进行删除的设计,使得对内存的占用明显小于帧解析完毕后再删除数据的方法,降低了内存的压力;并通过对数据的提取和解析过程的分离,达到数据接收与处理之间无相关性,为应用的扩展提供良好的架构。
附图说明
结合附图并参考以下详细说明,本发明各实施例的上述和其他特征、优点及方面将变得更加明显。在附图中,相同或相似的附图标记表示相同或相似的元素,其中:
图1示出了根据本发明的实施例的基于链表结构的接收多字节数据帧的串口通讯方法的流程图;
图2示出了根据本发明的帧格式示意图;
图3示出了根据本发明的队列形式管理的帧提取过程的实施例的流程图;
图4示出了根据本发明的队列形式管理的帧解析过程的实施例的流程图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的全部其他实施例,都属于本发明保护的范围。
另外,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
目前工业现场常用的能够基于小链路帧传递应用帧的方法主要有MODBUS协议和YMODEM协议等,但这些协议均有其弊端,例如MODBUS协议必须采用时间间隔停顿的方式来识别被拆分发送的应用帧,又例如YMODEM协议强制要求应用帧长度必须小于链路帧长度。具体特征比对如下表所示:
表1常见通讯协议特征
故,现有技术中没有既能实现不间断传输又能实现帧字节数随机变化的传输协议。
本发明中,通过对接收到的数据进行存储、帧提取、对提取到的完整帧进行数据删除和置零,之后进行帧解析,很好的解决了数据帧被分散的问题;线程队列的工作方式也降低了系统自身对线程调度的时间消耗;采用数据在帧提取完毕后就立刻进行删除的设计,使得对内存的占用明显小于帧解析完毕后再删除数据的方法。
图1示出了本发明实施例的基于链表结构的接收多字节数据帧的串口通讯方法的流程图。
该方法100包括:
S101、从串口缓冲区接收数据,存储于接收数据链表。
在多线程技术的平台上,为了实现数据处理的实时性,以串口中断作为数据存储过程的激发入口,从串口缓冲区接收到数据。
接收数据的类型包含一个用来存储字节数据的成员及一个标志位成员。字节数据来自于单次从串口缓冲区读取到的数据,标志位用于表示字节数据是否进行过帧提取操作,例如当前标志位为1,则表示其对应的字节数据进行过帧提取操作,如果当前标志位为0,则表示其对应的字节数据没有进行过帧提取操作。
这些接收数据存储于接收数据链表中,定义接收数据链表包括若干个链表元素,若干个链表元素根据接收数据的先后顺序串接形成接收数据链表,每个链表元素对应一个字节数组,该字节数组用于有序复制串口缓冲区内新接收的数据,数据由每次接收的串口缓冲区内的字节填充,并将字节数组以节点形式追加至接收数据链表末端,使得字节数组在接收数据链表内存储的位置与接收数据的先后顺序一致。其作用在于使整个链表中队列有序,为帧提取操作提供数据基础,链表元素有序排列,提取到的帧数据才有意义。
S102、通过帧提取线程调用帧提取操作,识别接收数据链表中的完整帧,提取完整帧的数据,复制到帧数据链表进行存储;实现无时间等待的连续性数据接收以及帧字节数随机的帧数据接收。
帧提取操作是从某一字节数组中按完整帧定义抽取完整帧数据和非完整帧数据,将完整帧数据复制到存储帧数据类型的对象中,并将该对象加入帧数据链表,将非完整帧定位于帧数据链表的最后位置或丢弃非完整帧。
帧提取线程,用于先根据完整帧和非完整帧的定义,按帧头和帧尾对所有字节进行逻辑分割。
如图2所示为本发明的帧格式示意图。
对于帧格式定义如下:
本发明发送的数据帧要求至少具备以下元素:帧头标识(SOH)、信息域、帧尾(EOT)。
对于识别接收数据链表中的完整帧,首先需要定义完整帧:
完整帧是指有如下三种情况:
(1)发现存在上一帧帧尾与下一帧帧头;
(2)发现存在本帧帧头与下一帧帧头;
(3)发现存在本帧帧头与本帧帧尾。
根据上述完整帧的三种情况,其对应完整帧的数据指:
当满足(1)时,上一帧帧尾与下一帧帧头之间的数据;
当满足(2)时,本帧帧头与下一帧帧头之间的数据;
当满足(3)时,本帧帧头与本帧帧尾之间的数据。
需要注意的是,该定义的完整帧,其内部并不一定是本帧的完整且正确的数据,只是在逻辑认知上认为这是一帧完整的数据,其中可能存在字节错误或字节丢失情况。
所述帧数据链表由若干个链表元素根据提取帧数据的先后顺序串接形成,例如提取到第一帧数据复制到元素1中,提取到第二帧数据复制到元素2中,提取到第三帧数据复制到元素3中,则根据提取的帧数据的顺序将帧数据链表中的元素按照元素1、元素2、元素3的顺序串接。每个链表元素只存储一个帧数据对象,每个帧数据对象包含一个用于存储帧数据的成员和两个标志位的成员,其中帧数据为从接收数据链表中提取的帧数据,第一标志位用于表示帧数据是否被解析,第二标志位用于表示帧数据是否是完整帧。例如第一标志位为1,表示帧数据被解析;第一标志位为0,表示帧数据未被解析。又如,第二标志位为1,表示帧数据为完整帧;第二标志为为0,表示帧数据为非完整帧。
非完整帧是指有如下两种情况:
(1)在未发现下一帧帧头及下一帧帧尾,且存在上一帧帧尾;
(2)在未发现下一帧帧头及下一帧帧尾,且存在本帧帧头。
根据上述非完整帧的两种情况,其对应完整帧的数据指:
在符合(1)的情况下,上一帧帧尾至数据结尾之间的数据;
在符合(2)的情况下,本帧帧头至数据结尾之间的数据。
S103、在所述完整帧的数据从接收数据链表复制到帧数据链表后,删除接收数据链表的完整帧的数据。
为了降低内存的消耗及防止对数据重复处理,需要对帧提取操作完成的数据进行删除。统计提取的所有完整帧的总字节数目,作为待删除的字节数。
作为本发明的一种数据删除的实施例,具体包括:从首项开始,对接收数据链表中元素逐个进行遍历,累加被遍历元素内的数据长度,当累加长度等于待删除字节数时,遍历停止,记录被遍历的元素数目,从接收数据链表中,删除被遍历元素。例如,接收数据链表中有50个字节,每10个字节为一个链表元素。经过统计,待删除的字节数为40。从首项开始,从元素1开始逐个进行遍历,累加被遍历元素内的数据长度,当遍历到元素4时,累加的长度为40,与待删除的字节数相等,则遍历停止,删除元素1~元素4。
作为本发明的另一种数据删除的实施例,具体包括:从首项开始,对接收数据链表中元素逐个进行遍历,累加被遍历元素内的数据长度,当累加长度大于待删除字节数时,遍历停止,记录被遍历的元素数目。此时最后一个待删除字节将落在最后一个被遍历元素内的数据中部的某一位置(称为位置A),保留此元素,删除此元素内数据中位置A之前(包括处于位置A)的数据。例如,接收数据链表中有50个字节,每10个字节为一个链表元素。经过统计,待删除的字节数为35。从首项开始,从元素1开始逐个进行遍历,累加被遍历元素内的数据长度,当遍历到元素4时,累加的长度为40,大于待删除的字节数,则遍历停止,此时最后一个待删除的字节落在元素4的第5个字节位置,保留元素4,删除第1~35字节的数据。
作为一种优选的实施例,当累加长度大于待删除字节数时,此时最后一个待删除字节将落在最后一个被遍历元素内,删除待删除的字节对应的数据,新建数组,并将该链表元素中的剩余数据复制到新数组中,用新数组替换原数组。例如,接收数据链表中有50个字节,每10个字节为一个链表元素。经过统计,待删除的字节数为35。从首项开始,从元素1开始逐个进行遍历,累加被遍历元素内的数据长度,当遍历到元素4时,累加的长度为40,大于待删除的字节数,则遍历停止,此时最后一个待删除的字节落在元素4内,则删除第1~35字节的数据,新建数组,将第36~40字节的数据复制到新数组中,用新数组替换原数组。
通过对完成帧提取的数据进行删除,降低内存的消耗,可以避免对数据的重复处理,节省资源成本。接收的原始数据在帧提取完毕后就立刻进行删除的设计,使得对内存的占用明显小于帧解析完毕后再删除数据的方法。通过帧提取线程对帧的提取,数据的存储方式从字节数组链表变为以帧为项的链表,由于通常帧提取的过程耗时远低于对帧内容解析的过程,完成帧提取就使得接收的原始字节流的数据能够被及时删除,从而防止数据积压;当帧解析过程比较耗时,也就是数据解析速度低于接收速度时,也能够按帧进行删除,提高工作效率。另外,及时删除接收的原始数据也能够防止数据被重复解析和处理。
如图3所示,在本发明的一种实施例中,当新的数据被存储后,即启动帧提取过程。线程调用帧提取函数,由于数据接收的随机性,可能出现新的帧提取线程创建时,先前的帧提取线程并未退出的情况,使多个帧提取线程同时工作,导致他们使用的数据存在不一致的现象,从而提取到同样内容的帧数据,在S103的数据删除的过程中会发生重复删除的问题,因此需要确保只有一个可运行状态下的帧提取线程存在。
通过线程链表,存储帧提取线程和帧解析线程,通过添加线程操作和移除线程操作进行线程管理,使同一类型的可运行状态下的线程个数不超过1。所述线程链表用于线程类型的对象,该对象将被以链表元素形式存储至本链表,一个链表元素只存储一个对象。
添加线程操作具体为:当发现线程链表为空时,则新建线程并加入线程链表,并启动该线程;当线程链表内元素数为1时,则新建线程并加入线程链表,但不启动新建线程;当线程链表内元素数为2时,则不作任何操作。
线程链表根据线程类型分为帧提取线程链表和帧解析线程链表。
对于帧提取线程链表,作为本实施例的一种添加帧提取线程操作的实施方式,当有新的帧提取线程待加入时,帧提取线程链表检测当前表内的帧提取线程个数,此时帧提取线程个数为1,则创建帧提取线程,并将其加入帧提取线程链表,判断此时帧提取线程链表中的帧提取线程个数为2,则将新加入的帧提取线程链表状态置为等待状态,等待队列中的帧提取线程删除后,再进行启动。
对于帧提取线程链表,作为本实施例的一种添加帧提取线程操作的实施方式,当有新的帧提取线程待加入时,帧提取线程链表检测当前表内的帧提取线程个数,此时帧提取线程个数为0,则创建帧提取线程,并将其加入帧提取线程链表,并判断此时帧提取线程链表的帧提取线程个数为1,则启动该帧提取线程进行帧提取。
作为本发明的一种添加帧提取线程操作的实施例,当有新的帧提取线程待加入时,帧提取线程链表检测当前表内的帧提取线程个数,此时帧提取线程个数为2,则不做任何操作。
移除帧提取线程操作,具体为:先从帧提取线程链表中移除第一个元素中的线程,再判断链表内元素数,元素数不为0时,启动链表中的第一个元素中的帧提取线程。
作为本发明的一种实施例,当所述帧提取线程提取完接收数据链表中的完整帧数据后,从所述帧提取线程链表中删除第一个元素中的帧提取线程,此时所述帧提取线程链表元素中有一个等待状态的帧提取线程,则启动帧提取线程链表的第一个元素中的帧提取线程,即启动该帧提取线程。
作为本发明的一种实施例,当所述帧提取线程提取完接收数据链表中的完整帧数据后,从所述帧提取线程链表中删除第一个元素中的帧提取线程,此时所述帧提取线程链表中已经没有帧提取线程,则不作任何操作。
从帧提取线程链表中删除所述帧提取线程具体为当一个帧提取线程处理完数据后在线程函数的最后位置做从帧提取线程链表中自我删除的操作。
通过帧提取线程链表对帧提取线程进行队列管理,保证队列中最多只有一个可运行状态的帧提取线程,可避免由于数据接收的随机性,出现多个帧提取线程同时存在于帧提取线程链表中的情况,以及多个帧提取线程同时工作导致数据提取重复等问题的出现。
S104、通过帧解析线程调用帧解析操作,对帧数据链表中完整帧的数据进行解析。
帧解析操作,对帧数据链表中元素内存储的完整帧数据进行解析,解析完毕后将元素内的标志位置为已解析状态。遍历帧数据链表元素,删除标志位处于已解析状态的元素。
如图4所示,对于帧解析线程链表,作为本实施例的一种添加帧解析线程操作的实施方式,所述帧解析线程链表用于检测其表内的帧解析线程个数,如果不大于1,则创建帧解析线程,并将其加入帧解析线程链表;如果大于1,则不做任何操作。再次检测表内的帧解析线程个数,如果等于1,则启动该帧解析线程;否则将该帧解析线程置为等待状态,等待队列中的帧解析线程删除后,再进行启动。
通过帧解析线程链表对帧解析线程进行队列管理,保证队列中最多只有一个可运行状态的帧解析线程,可避免多个帧解析线程同时存在于帧解析线程链表中的情况,多个帧解析线程同时工作导致数据解析重复等问题的出现。另外,帧解析和帧提取过程分离,达到数据接收与处理之间无相关性,为应用的扩展提供良好的架构。
作为本发明的一种实施例,当有新的帧解析线程要待加入时,帧解析线程链表检测当前表内的帧解析线程个数,此时帧解析线程个数为1,则创建帧解析线程,并将其加入帧解析线程链表,并判断此时帧解析线程链表中的帧解析线程个数为2,则将新加入的帧解析线程链表状态置为等待状态,等待队列中的帧解析线程删除后,再进行启动。
作为本发明的一种实施例,当有新的帧解析线程要待加入时,帧解析线程链表检测当前表内的帧解析线程个数,此时帧解析线程个数为0,则创建帧解析线程,并将其加入帧解析线程链表,并判断此时帧解析线程链表的帧解析线程个数为1,则启动该帧解析线程进行帧解析处理。
作为本发明的一种实施例,当有新的帧解析线程要待加入时,帧解析线程链表检测当前表内的帧解析线程个数,此时帧解析线程个数为2,则不做任何操作。
移除帧解析线程操作,具体为:先从帧解析线程链表中移除第一个元素中的帧解析线程,再判断帧解析线程链表内元素数,元素数不为0时,启动链表中的第一个元素中的帧解析线程。
作为本发明的一种实施例,当所述帧解析线程解析完帧数据链表中的所有完整帧数据后,从所述帧解析线程链表中删除第一个元素中的帧解析线程,此时所述帧解析线程链表元素中有一个等待状态的帧解析线程,则启动帧解析线程链表的第一个元素中的帧解析线程,即启动该帧解析线程。
作为本发明的一种实施例,当所述帧解析线程解析完帧数据链表中的所有完整帧数据后,从所述帧解析线程链表中删除第一个元素中的帧解析线程,此时所述帧解析线程链表中已经没有帧解析线程,则不作任何操作。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本发明所必须的。
本发明很好的解决了数据帧被分散的问题,实现无时间等待的连续性数据接收,对字节数随机的帧数据的接收;线程队列的工作方式也降低了系统自身对线程调度的时间消耗;采用数据在帧提取完毕后就立刻进行删除的设计,使得对内存的占用明显小于帧解析完毕后再删除数据的方法,降低了内存的压力;并通过对数据的提取和解析过程的分离,达到数据接收与处理之间无相关性,为应用的扩展提供良好的架构。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,所述描述的模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。
Claims (10)
1.一种基于链表结构的接收多字节数据帧的串口通讯方法,其特征在于,包括:
从串口缓冲区接收数据,存储于接收数据链表;
通过帧提取线程调用帧提取操作,识别接收数据链表中的完整帧,提取完整帧的数据,复制到帧数据链表进行存储;
在所述完整帧的数据从接收数据链表复制到帧数据链表后,删除接收数据链表中对应的数据;
通过帧解析线程调用帧解析操作,对帧数据链表中完整帧的数据进行解析。
2.根据权利要求1所述的方法,其特征在于,所述接收数据链表由若干个链表元素根据接收数据的先后顺序串接形成,每个链表元素只存储一个字节数组,每个字节数组包含一个用于存储字节数据的成员和一个标志位成员;其中字节数据为单次从串口缓冲区读取到的数据,标志位用于表示对应的字节数据是否进行过帧提取操作。
3.根据权利要求1所述的方法,其特征在于,所述帧数据链表由若干个链表元素根据提取帧数据的先后顺序串接形成,每个链表元素只存储一个帧数据对象,每个帧数据对象包含一个用于存储帧数据的成员和两个标志位的成员,其中帧数据为从接收数据链表中提取的帧数据,第一标志位用于表示帧数据是否被解析,第二标志位用于表示帧数据是否是完整帧。
4.根据权利要求1所述的方法,其特征在于,所述删除接收数据链表中对应的数据,包括:
从首项开始,对接收数据链表中的链表元素按照串接顺序逐个进行遍历,累加被遍历链表元素内数据的字节长度,当累加的字节长度等于待删除字节数时,停止遍历,记录被遍历的链表元素个数;其中待删除字节数为提取的所有完整帧的总字节数;
从接收数据链表中,删除被遍历的链表元素。
5.根据权利要求1所述的方法,其特征在于,所述删除接收数据链表中对应的数据,还包括:
从首项开始,对接收数据链表中的链表元素按照串接顺序逐个进行遍历,累加被遍历链表元素内数据的字节长度,当累加的字节长度大于待删除字节数时,停止遍历,记录被遍历的链表元素个数;
此时最后一个待删除字节落在最后一个被遍历链表元素内,则删除待删除的字节对应的数据,新建数组,并将该链表元素中的剩余数据复制到新数组中,用新数组替换原数组。
6.根据权利要求1、3、4、5任一项所述的方法,其特征在于,所述完整帧的数据包括:
上一帧的帧尾与下一帧帧头之间的数据;
本帧帧头与下一帧帧头之间的数据;
本帧帧头与本帧帧尾之间的数据。
7.根据权利要求1所述的方法,其特征在于,还包括从接收数据链表中提取非完整帧的数据,置于所述帧数据链表的末位置。
8.根据权利要求7所述的方法,其特征在于,所述非完整帧的数据为:
在未发现下一帧帧头及下一帧帧尾,且存在上一帧帧尾的情况下,上一帧帧尾至数据结尾之间的数据;
在未发现下一帧帧头及下一帧帧尾,且存在本帧帧头的情况下,本帧帧头至数据结尾之间的数据。
9.根据权利要求1所述的方法,其特征在于,还包括线程链表,用于存储帧提取线程和帧解析线程,通过添加线程操作和移除线程操作,使同一类型的可运行状态下的线程个数不超过1。
10.根据权利要求9所述的方法,其特征在于,所述添加线程操作为:
线程链表检测其表内的链表元素个数,如果不大于1,则创建线程,并将其加入线程链表;
再次检测线程链表内的链表元素个数,如果等于1,则启动运行该线程;否则将该线程置为等待状态;
所述移除线程操作为:
先从线程链表中移除第一个链表元素中的线程,再判断链表内元素数,元素数不为0时,启动链表中的第一个元素中的线程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911358381.XA CN111181819B (zh) | 2019-12-25 | 2019-12-25 | 一种基于链表结构的接收多字节数据帧的串口通讯方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911358381.XA CN111181819B (zh) | 2019-12-25 | 2019-12-25 | 一种基于链表结构的接收多字节数据帧的串口通讯方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111181819A true CN111181819A (zh) | 2020-05-19 |
CN111181819B CN111181819B (zh) | 2022-03-08 |
Family
ID=70657465
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911358381.XA Active CN111181819B (zh) | 2019-12-25 | 2019-12-25 | 一种基于链表结构的接收多字节数据帧的串口通讯方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111181819B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111932656A (zh) * | 2020-07-29 | 2020-11-13 | 交控科技股份有限公司 | 一种运行图信息索引方法、装置和设备 |
CN112100414A (zh) * | 2020-09-11 | 2020-12-18 | 深圳力维智联技术有限公司 | 数据处理方法、装置、系统与计算机可读存储介质 |
CN113886314A (zh) * | 2021-09-08 | 2022-01-04 | 江苏徐工工程机械研究院有限公司 | 一种串口gps报文数据的接收及解析方法、系统 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101692655A (zh) * | 2009-10-23 | 2010-04-07 | 烽火通信科技股份有限公司 | 一种数据帧存储管理装置 |
US20100115152A1 (en) * | 2008-10-31 | 2010-05-06 | Day Brian A | Sending large command descriptor block (CDB) Structures in serial attached SCSI(SAS) controller |
CN102510323A (zh) * | 2011-09-22 | 2012-06-20 | 航天科工惯性技术有限公司 | 一种串口数据的帧识别方法 |
CN104199966A (zh) * | 2014-09-22 | 2014-12-10 | 杭州电魂网络科技股份有限公司 | 一种桶式链表结构的实现方法 |
CN105681134A (zh) * | 2016-03-04 | 2016-06-15 | 西安航天动力技术研究所 | 一种通用型多种串口通信协议检测识别方法 |
CN105760134A (zh) * | 2016-02-03 | 2016-07-13 | 四川九洲电器集团有限责任公司 | 一种数据处理方法及电子设备 |
CN107196872A (zh) * | 2017-04-25 | 2017-09-22 | 北京计算机技术及应用研究所 | 一种用于交换机数据帧切分与重组装置的方法 |
CN107918612A (zh) * | 2016-10-08 | 2018-04-17 | 腾讯科技(深圳)有限公司 | 键值存储系统数据结构的实现方法和装置 |
-
2019
- 2019-12-25 CN CN201911358381.XA patent/CN111181819B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100115152A1 (en) * | 2008-10-31 | 2010-05-06 | Day Brian A | Sending large command descriptor block (CDB) Structures in serial attached SCSI(SAS) controller |
CN101692655A (zh) * | 2009-10-23 | 2010-04-07 | 烽火通信科技股份有限公司 | 一种数据帧存储管理装置 |
CN102510323A (zh) * | 2011-09-22 | 2012-06-20 | 航天科工惯性技术有限公司 | 一种串口数据的帧识别方法 |
CN104199966A (zh) * | 2014-09-22 | 2014-12-10 | 杭州电魂网络科技股份有限公司 | 一种桶式链表结构的实现方法 |
CN105760134A (zh) * | 2016-02-03 | 2016-07-13 | 四川九洲电器集团有限责任公司 | 一种数据处理方法及电子设备 |
CN105681134A (zh) * | 2016-03-04 | 2016-06-15 | 西安航天动力技术研究所 | 一种通用型多种串口通信协议检测识别方法 |
CN107918612A (zh) * | 2016-10-08 | 2018-04-17 | 腾讯科技(深圳)有限公司 | 键值存储系统数据结构的实现方法和装置 |
CN107196872A (zh) * | 2017-04-25 | 2017-09-22 | 北京计算机技术及应用研究所 | 一种用于交换机数据帧切分与重组装置的方法 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111932656A (zh) * | 2020-07-29 | 2020-11-13 | 交控科技股份有限公司 | 一种运行图信息索引方法、装置和设备 |
CN111932656B (zh) * | 2020-07-29 | 2024-09-10 | 交控科技股份有限公司 | 一种运行图信息索引方法、装置和设备 |
CN112100414A (zh) * | 2020-09-11 | 2020-12-18 | 深圳力维智联技术有限公司 | 数据处理方法、装置、系统与计算机可读存储介质 |
CN112100414B (zh) * | 2020-09-11 | 2024-02-23 | 深圳力维智联技术有限公司 | 数据处理方法、装置、系统与计算机可读存储介质 |
CN113886314A (zh) * | 2021-09-08 | 2022-01-04 | 江苏徐工工程机械研究院有限公司 | 一种串口gps报文数据的接收及解析方法、系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111181819B (zh) | 2022-03-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111181819B (zh) | 一种基于链表结构的接收多字节数据帧的串口通讯方法 | |
CN105989539B (zh) | 一种金融交易行情获取系统以及获取方法 | |
CN104270684B (zh) | 一种面向实时应用的视音频数据网络传输系统和方法 | |
CN107634915A (zh) | 数据传输方法、装置及储存介质 | |
US8774194B2 (en) | Method and apparatus for a high-speed frame tagger | |
CN109257143B (zh) | 用于有长度限制的网络传输协议中分片传输数据包的方法 | |
US20130067018A1 (en) | Methods and computer program products for monitoring the contents of network traffic in a network device | |
CN107395565B (zh) | 一种定长单字节格式报文协议下串口接收预处理方法 | |
WO2014135038A1 (zh) | 基于pcie总线的报文传输方法与装置 | |
CN102025636A (zh) | 报文特征处理方法、装置及网络设备 | |
CN114584560B (zh) | 一种分片帧重组方法及装置 | |
CN112165457A (zh) | 一种文件重排的方法、系统、设备及可读存储介质 | |
CN111147184A (zh) | 支持多业务抢占续传的以太网发送、接收设备及传输装置 | |
CN109951532B (zh) | 一种基于dpdk的流量模型自动变换装置 | |
CN116233018A (zh) | 报文处理方法、装置、电子设备及存储介质 | |
CN113595932B (zh) | 数据乱序报文的处理方法及专用集成电路 | |
US10673768B2 (en) | Managing data compression | |
CN113364862A (zh) | 一种拼包解码系统及方法 | |
CN117061072B (zh) | 报文传输方法、装置、设备及存储介质 | |
CN111414339B (zh) | 一种文件的处理方法、系统、装置、设备及介质 | |
EP0400500A2 (en) | A method and apparatus managing tasks | |
CN107615259A (zh) | 一种数据处理方法及系统 | |
JP5630033B2 (ja) | バッファ管理プログラム及び方法、並びにメッセージ分析装置 | |
CN112363835B (zh) | 一种基于网络大数据的智能资源调整方法及系统 | |
JPH0458646A (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 |