一种基于首尾循环队列的串口通信方法

文档序号:10724846阅读:518来源:国知局
一种基于首尾循环队列的串口通信方法
【专利摘要】本发明涉及一种基于首尾循环缓冲队列的串口通信方法,采用硬件中断服务方式处理数据接收和发送任务,以一次只处理一个字节数据的方式将从串口硬件接收数据放入首尾循环的接收缓冲数据队列,以及将数据从首尾循环的发送缓冲数据队列取出从串口硬件发送出去;采用命令处理线程从所述接收缓冲数据队列接收到的数据中解析命令并执行该命令,以及将命令响应数据放入所述发送缓冲数据队列。本发明能够保证串口命令能够有最大限度的吞吐量和实时性;命令处理线程在没有数据收发的时候实施命令解析和相应数据准备,具有连续处理数据的能力且不影响数据的收发过程。
【专利说明】
一种基于首尾循环队列的串口通信方法
技术领域
[0001]本发明涉及串口通信方法,特别涉及一种基于首尾循环队列的双线程串口通信方法,属于串行通信技术领域。
【背景技术】
[0002]串口通信是当前工业控制及消费产品领域使用最广泛的通信方式之一,随着系统功能的增加及实时控制要求的增加,串口的吞吐量急剧增加,对串口通信实时性的要求也越来越严格,例如在短暂的时间内要求响应大量条目的串口通信命令,或者要求以较短的时间间隔连续响应持续不断的串口命令。
[0003]传统基于MCU的嵌入式控制系统,对串口通信采用单线程接收-解析-响应的方式,当一次性到来多条串口命令的时候,单线程的设计必须处理完一条之后才能接收下一条命令,往往造成一条或多条命令没有接收到;在串口通信的时间间隔很短时,由于MCU处理能力的限制,在下一条命令到来之前无法及时处理上一条命令涉及的所有操作,同样造成命令响应的缺失。为了解决这样的问题,往往需要更改设计,使用工作频率更高的MCU,或者引入操作系统以实现并行处理的能力,这样必然带来成本的上升和设计复杂度的增加。

【发明内容】

[0004]本发明的目的在于不更改传统基于MCU嵌入式控制系统的设计,但能克服现有技术的不足,使用一种基于首尾循环缓冲队列的串口通信方法,以较低的成本和简单的设计提供串口通信较高的吞吐量和实时性能力。
[0005]本发明提供一种基于首尾循环缓冲队列的串口通信的方法,创建数据收发线程,其采用硬件中断服务方式处理数据接收和发送任务,以一次只处理一个字节数据的方式将从串口硬件接收数据放入首尾循环的接收缓冲数据队列,以及将数据从首尾循环的发送缓冲数据队列取出从串口硬件发送出去;创建命令处理线程,其从所述接收缓冲数据队列接收到的数据中解析命令并执行该命令,以及将命令响应数据放入所述发送缓冲数据队列。
[0006]在上述技术方案中,所述数据收发线程的具体步骤包括:
[0007]步骤1.1,触发串口硬件中断时,查看是不是接收中断,如果“是”则进入步骤1.2;如果“否”则表明是发送中断,进入步骤1.4;
[0008]步骤1.2,从串口硬件接收一个字节,存放在所述接收缓冲数据队列的队尾,并查看所述接收缓冲数据队列的队尾位置是否已经到达所述接收缓冲数据队列的最后一个字节,如果“是”则进入步骤1.3;如果“否”则将所述接收缓冲数据队列的队尾指向所述接收缓冲数据队列中的下一个字节,进入步骤I.6;
[0009]步骤1.3,将所述接收缓冲数据队列的队尾指向所述接收缓冲数据队列中的第一个字节,并给出接收缓冲数据队列溢出的标识,进入步骤1.6;
[0010]步骤1.4,从所述发送缓冲数据队列的队首取出一个字节,通过串口硬件发送出去,并查看所述发送缓冲数据队列的队首位置是否已经到达所述发送缓冲数据队列的最后一个字节,如果“是”则进入步骤1.5;如果“否”则将所述发送缓冲数据队列的队尾指向所述发送缓冲数据队列中的下一个字节,进入步骤1.6;
[0011]步骤1.5,将所述发送缓冲数据队列的队尾指向所述发送缓冲数据队列中的第一个字节,并给出发送缓冲数据队列溢出的标识;
[0012]步骤1.6,完成本次串口硬件中断操作。
[0013]在上述技术方案中,所述命令处理线程的具体步骤包括:
[0014]步骤2.1,查看所述接收缓冲数据队列中是否有未处理的内容,如果“是”则进入步骤2.2;如果“否”则认为没有需要处理的内容,无需创建命令处理任务,进入步骤2.5;
[0015]步骤2.2,判断能否从所述接收缓冲数据队列中取出一条完整命令,如果“是”则进入步骤2.3;如果“否”则认为没有完整的命令处理任务,进入步骤2.5;
[0016]步骤2.3,从所述接收缓冲数据队列取出一条完整命令并解析,根据该命令准备响应的数据生成响应命令,并将响应命令推送到所述发送缓冲数据队列,产生发送中断;
[0017]步骤2.4,按照步骤2.3解析的命令,执行相应操作,然后再次转到步骤2.1;
[0018]步骤2.5,完成本次命令处理操作。
[0019]本发明取得了以下技术效果:可以解决串口短时间接收到大量数据,或者以较短间隔持续收到数据的问题,同时也能够及时解析命令并发送响应,保证设计具有较好的实时性。本发明能够克服当前普通串口通信的缺点,在不需要升级硬件配置或更改硬件设计的条件下,能够以简单的方法使串口通信的实时性和吞吐能力的得到显著的提高。
【附图说明】
[0020]图1是中断服务线程的流程图。
[0021 ]图2是命令处理线程的流程图。
【具体实施方式】
[0022]为了便于本领域普通技术人员理解和实施本发明,下面结合附图及【具体实施方式】对本发明作进一步的详细描述。
[0023]本发明对现有串口通信的改进主要包括三个部分:将串口通信的任务分为数据的收发和命令处理两部分,分别由两个线程完成;串口数据的接收和发送采用中断服务线程且一次只处理一个字节;接收和发送的数据分别使用首尾循环的缓冲数据队列进行存放。
[0024]将串口通信的任务分为数据的收发和命令处理两部分,分别由两个线程完成,是在不需要升级硬件配置或更改硬件设计的条件下,在软件设计上将串口通信分成两个子任务,数据收发任务由数据收发线程处理,采用硬件中断响应的方式;命令解析和响应任务由命令处理线程承担,可以是主程序里面的一个子程序,或主进程里面的一个子线程形式等方式实现。数据收发线程作为中断服务线程,负责在有数据收发的时候及时实施,保证通信的实时性;命令处理线程,负责将串口接收数据的意义予以解析,并准备好命令响应的数据,提供给数据收发线程通过串口发送。这样的双线程设计使串口通信具有了一定的并行处理能力,有效解决数据收发和命令解析之间相互影响的问题。
[0025]串口数据的接收和发送采用中断服务线程且一次只处理一个字节,中断服务线程的流程如图1所示,其具体实施步骤如下:
[0026]步骤1.0,创建一个中断服务线程,用于处理串口收发相关事务;
[0027]步骤1.1,发生串口硬件中断时,查看是不是接收中断,如果“是”则进入步骤1.2;如果“否”表明是发送中断,进入步骤1.4;
[0028]步骤1.2,从串口硬件接收一个字节,存放在接收队列的队尾,并查看接收队尾位置是否已经到达接收队列的最后一个字节,如果“是”则进入步骤1.3;如果“否”,则将接收队尾指向接收队列中的下一个字节,进入步骤I.6;
[0029]步骤1.3,将接收队尾指向接收队列中的第一个字节,并给出接收队列溢出的标识,进入步骤1.6;
[0030]步骤1.4,从发送队列的队首取出一个字节,通过硬件发送,并查看发送队首位置是否已经到达发送队列的最后一个字节,如果“是”则进入步骤1.5;如果“否”,则将发送队尾指向发送队列中的下一个字节,进入步骤1.6;
[0031]步骤1.5,将发送队尾指向发送队列中的第一个字节,并给出发送队列溢出的标识;
[0032]步骤1.6,完成本次中断操作,退出中断服务线程。
[0033]接收和发送的数据放入首尾循环的缓冲队列,命令处理线程的流程如图2所示,包括以下步骤,
[0034]步骤2.0,创建一个命令处理线程,用于解析串口接收的命令,并准备命令响应的数据;
[0035]步骤2.1,查看接收队列中是否有未处理的内容,如果“是”则进入步骤2.2;如果“否”,认为没有需要处理的内容,无需创建命令处理任务,进入步骤2.5;
[0036]步骤2.2,判断能否从接收队列中取出一条完整命令,如果“是”则进入步骤2.3;如果“否”,认为没有完整的命令处理任务,进入步骤2.5;
[0037]步骤2.3,从接收队列取出一条完整命令并解析,根据命令准备响应的数据生成响应命令,并将响应命令推送到发送队列,产生发送中断;
[0038]步骤2.4,按照步骤2.3解析的命令,执行相应的算法或硬件操作等,然后再次转到步骤2.1;
[0039]步骤2.5,完成本次命令处理操作,退出命令处理线程。
[0040]这种命令处理的实现方式,可以解决串口在短时间内接收到大量数据或者以较短间隔持续接收到数据时难以及时接收和处理所有数据的问题,同时也能够及时解析命令并发送响应,保证具有较好的实时性。
[0041]需要强调的是,本发明所述的实施例是说明性的,而不是限定性的,因此本发明并不限于【具体实施方式】中所述的实施例,凡是由本领域技术人员这样根据本发明的技术方案得出的其他实施方式,同样属于本发明保护的范围。
【主权项】
1.一种基于首尾循环缓冲队列的串口通信的方法,其特征在于: 创建数据收发线程,其采用硬件中断服务方式处理数据接收和发送任务,以一次只处理一个字节数据的方式将从串口硬件接收数据放入首尾循环的接收缓冲数据队列,以及将数据从首尾循环的发送缓冲数据队列取出从串口硬件发送出去; 创建命令处理线程,其从所述接收缓冲数据队列接收到的数据中解析命令并执行该命令,以及将命令响应数据放入所述发送缓冲数据队列。2.根据权利要求1所述的基于首尾循环缓冲队列的串口通信的方法,其特征在于:所述数据收发线程的具体步骤包括: 步骤1.1,触发串口硬件中断时,查看是不是接收中断,如果“是”则进入步骤1.2;如果“否”则表明是发送中断,进入步骤1.4; 步骤1.2,从串口硬件接收一个字节,存放在所述接收缓冲数据队列的队尾,并查看所述接收缓冲数据队列的队尾位置是否已经到达所述接收缓冲数据队列的最后一个字节,如果“是”则进入步骤1.3;如果“否”则将所述接收缓冲数据队列的队尾指向所述接收缓冲数据队列中的下一个字节,进入步骤1.6; 步骤1.3,将所述接收缓冲数据队列的队尾指向所述接收缓冲数据队列中的第一个字节,并给出接收缓冲数据队列溢出的标识,进入步骤1.6; 步骤1.4,从所述发送缓冲数据队列的队首取出一个字节,通过串口硬件发送出去,并查看所述发送缓冲数据队列的队首位置是否已经到达所述发送缓冲数据队列的最后一个字节,如果“是”则进入步骤1.5;如果“否”则将所述发送缓冲数据队列的队尾指向所述发送缓冲数据队列中的下一个字节,进入步骤1.6; 步骤1.5,将所述发送缓冲数据队列的队尾指向所述发送缓冲数据队列中的第一个字节,并给出发送缓冲数据队列溢出的标识; 步骤1.6,完成本次串口硬件中断操作。3.根据权利要求1所述的基于首尾循环缓冲队列的串口通信的方法,其特征在于:所述命令处理线程的具体步骤包括: 步骤2.1,查看所述接收缓冲数据队列中是否有未处理的内容,如果“是”则进入步骤.2.2;如果“否”则认为没有需要处理的内容,无需创建命令处理任务,进入步骤2.5; 步骤2.2,判断能否从所述接收缓冲数据队列中取出一条完整命令,如果“是”则进入步骤2.3;如果“否”则认为没有完整的命令处理任务,进入步骤2.5; 步骤2.3,从所述接收缓冲数据队列取出一条完整命令并解析,根据该命令准备响应的数据生成响应命令,并将响应命令推送到所述发送缓冲数据队列,产生发送中断; 步骤2.4,按照步骤2.3解析的命令,执行相应操作,然后再次转到步骤2.1; 步骤2.5,完成本次命令处理操作。
【文档编号】G06F13/42GK106095716SQ201610474485
【公开日】2016年11月9日
【申请日】2016年6月24日
【发明人】杨智
【申请人】武汉光迅科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1