CN106095716A - 一种基于首尾循环队列的串口通信方法 - Google Patents
一种基于首尾循环队列的串口通信方法 Download PDFInfo
- Publication number
- CN106095716A CN106095716A CN201610474485.7A CN201610474485A CN106095716A CN 106095716 A CN106095716 A CN 106095716A CN 201610474485 A CN201610474485 A CN 201610474485A CN 106095716 A CN106095716 A CN 106095716A
- Authority
- CN
- China
- Prior art keywords
- queue
- buffered data
- data queue
- tail
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/38—Information transfer, e.g. on bus
- G06F13/42—Bus transfer protocol, e.g. handshake; Synchronisation
- G06F13/4282—Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2213/00—Indexing scheme relating to interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F2213/24—Interrupt
Abstract
本发明涉及一种基于首尾循环缓冲队列的串口通信方法,采用硬件中断服务方式处理数据接收和发送任务,以一次只处理一个字节数据的方式将从串口硬件接收数据放入首尾循环的接收缓冲数据队列,以及将数据从首尾循环的发送缓冲数据队列取出从串口硬件发送出去;采用命令处理线程从所述接收缓冲数据队列接收到的数据中解析命令并执行该命令,以及将命令响应数据放入所述发送缓冲数据队列。本发明能够保证串口命令能够有最大限度的吞吐量和实时性;命令处理线程在没有数据收发的时候实施命令解析和相应数据准备,具有连续处理数据的能力且不影响数据的收发过程。
Description
技术领域
本发明涉及串口通信方法,特别涉及一种基于首尾循环队列的双线程串口通信方法,属于串行通信技术领域。
背景技术
串口通信是当前工业控制及消费产品领域使用最广泛的通信方式之一,随着系统功能的增加及实时控制要求的增加,串口的吞吐量急剧增加,对串口通信实时性的要求也越来越严格,例如在短暂的时间内要求响应大量条目的串口通信命令,或者要求以较短的时间间隔连续响应持续不断的串口命令。
传统基于MCU的嵌入式控制系统,对串口通信采用单线程接收-解析-响应的方式,当一次性到来多条串口命令的时候,单线程的设计必须处理完一条之后才能接收下一条命令,往往造成一条或多条命令没有接收到;在串口通信的时间间隔很短时,由于MCU处理能力的限制,在下一条命令到来之前无法及时处理上一条命令涉及的所有操作,同样造成命令响应的缺失。为了解决这样的问题,往往需要更改设计,使用工作频率更高的MCU,或者引入操作系统以实现并行处理的能力,这样必然带来成本的上升和设计复杂度的增加。
发明内容
本发明的目的在于不更改传统基于MCU嵌入式控制系统的设计,但能克服现有技术的不足,使用一种基于首尾循环缓冲队列的串口通信方法,以较低的成本和简单的设计提供串口通信较高的吞吐量和实时性能力。
本发明提供一种基于首尾循环缓冲队列的串口通信的方法,创建数据收发线程,其采用硬件中断服务方式处理数据接收和发送任务,以一次只处理一个字节数据的方式将从串口硬件接收数据放入首尾循环的接收缓冲数据队列,以及将数据从首尾循环的发送缓冲数据队列取出从串口硬件发送出去;创建命令处理线程,其从所述接收缓冲数据队列接收到的数据中解析命令并执行该命令,以及将命令响应数据放入所述发送缓冲数据队列。
在上述技术方案中,所述数据收发线程的具体步骤包括:
步骤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,完成本次串口硬件中断操作。
在上述技术方案中,所述命令处理线程的具体步骤包括:
步骤2.1,查看所述接收缓冲数据队列中是否有未处理的内容,如果“是”则进入步骤2.2;如果“否”则认为没有需要处理的内容,无需创建命令处理任务,进入步骤2.5;
步骤2.2,判断能否从所述接收缓冲数据队列中取出一条完整命令,如果“是”则进入步骤2.3;如果“否”则认为没有完整的命令处理任务,进入步骤2.5;
步骤2.3,从所述接收缓冲数据队列取出一条完整命令并解析,根据该命令准备响应的数据生成响应命令,并将响应命令推送到所述发送缓冲数据队列,产生发送中断;
步骤2.4,按照步骤2.3解析的命令,执行相应操作,然后再次转到步骤2.1;
步骤2.5,完成本次命令处理操作。
本发明取得了以下技术效果:可以解决串口短时间接收到大量数据,或者以较短间隔持续收到数据的问题,同时也能够及时解析命令并发送响应,保证设计具有较好的实时性。本发明能够克服当前普通串口通信的缺点,在不需要升级硬件配置或更改硬件设计的条件下,能够以简单的方法使串口通信的实时性和吞吐能力的得到显著的提高。
附图说明
图1是中断服务线程的流程图。
图2是命令处理线程的流程图。
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图及具体实施方式对本发明作进一步的详细描述。
本发明对现有串口通信的改进主要包括三个部分:将串口通信的任务分为数据的收发和命令处理两部分,分别由两个线程完成;串口数据的接收和发送采用中断服务线程且一次只处理一个字节;接收和发送的数据分别使用首尾循环的缓冲数据队列进行存放。
将串口通信的任务分为数据的收发和命令处理两部分,分别由两个线程完成,是在不需要升级硬件配置或更改硬件设计的条件下,在软件设计上将串口通信分成两个子任务,数据收发任务由数据收发线程处理,采用硬件中断响应的方式;命令解析和响应任务由命令处理线程承担,可以是主程序里面的一个子程序,或主进程里面的一个子线程形式等方式实现。数据收发线程作为中断服务线程,负责在有数据收发的时候及时实施,保证通信的实时性;命令处理线程,负责将串口接收数据的意义予以解析,并准备好命令响应的数据,提供给数据收发线程通过串口发送。这样的双线程设计使串口通信具有了一定的并行处理能力,有效解决数据收发和命令解析之间相互影响的问题。
串口数据的接收和发送采用中断服务线程且一次只处理一个字节,中断服务线程的流程如图1所示,其具体实施步骤如下:
步骤1.0,创建一个中断服务线程,用于处理串口收发相关事务;
步骤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,完成本次中断操作,退出中断服务线程。
接收和发送的数据放入首尾循环的缓冲队列,命令处理线程的流程如图2所示,包括以下步骤,
步骤2.0,创建一个命令处理线程,用于解析串口接收的命令,并准备命令响应的数据;
步骤2.1,查看接收队列中是否有未处理的内容,如果“是”则进入步骤2.2;如果“否”,认为没有需要处理的内容,无需创建命令处理任务,进入步骤2.5;
步骤2.2,判断能否从接收队列中取出一条完整命令,如果“是”则进入步骤2.3;如果“否”,认为没有完整的命令处理任务,进入步骤2.5;
步骤2.3,从接收队列取出一条完整命令并解析,根据命令准备响应的数据生成响应命令,并将响应命令推送到发送队列,产生发送中断;
步骤2.4,按照步骤2.3解析的命令,执行相应的算法或硬件操作等,然后再次转到步骤2.1;
步骤2.5,完成本次命令处理操作,退出命令处理线程。
这种命令处理的实现方式,可以解决串口在短时间内接收到大量数据或者以较短间隔持续接收到数据时难以及时接收和处理所有数据的问题,同时也能够及时解析命令并发送响应,保证具有较好的实时性。
需要强调的是,本发明所述的实施例是说明性的,而不是限定性的,因此本发明并不限于具体实施方式中所述的实施例,凡是由本领域技术人员这样根据本发明的技术方案得出的其他实施方式,同样属于本发明保护的范围。
Claims (3)
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,完成本次命令处理操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610474485.7A CN106095716B (zh) | 2016-06-24 | 2016-06-24 | 一种基于首尾循环队列的串口通信方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610474485.7A CN106095716B (zh) | 2016-06-24 | 2016-06-24 | 一种基于首尾循环队列的串口通信方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106095716A true CN106095716A (zh) | 2016-11-09 |
CN106095716B CN106095716B (zh) | 2020-06-02 |
Family
ID=57252910
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610474485.7A Active CN106095716B (zh) | 2016-06-24 | 2016-06-24 | 一种基于首尾循环队列的串口通信方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106095716B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107347178A (zh) * | 2017-06-29 | 2017-11-14 | 福州汇思博信息技术有限公司 | 串口复用方法及电子设备 |
CN107945430A (zh) * | 2017-11-24 | 2018-04-20 | 上海动联信息技术股份有限公司 | 一种用于智能pos机的基于串口的双向并发通讯方法 |
CN108052296A (zh) * | 2017-12-30 | 2018-05-18 | 惠龙易通国际物流股份有限公司 | 一种数据读取方法、设备及计算机存储介质 |
CN108076085A (zh) * | 2016-11-10 | 2018-05-25 | 北京国双科技有限公司 | 一种数据传输的方法及数据传输装置 |
CN108270692A (zh) * | 2017-12-07 | 2018-07-10 | 上海西默通信技术有限公司 | 一种智能家居中串口数据传输方法 |
WO2023142301A1 (zh) * | 2022-01-29 | 2023-08-03 | 南京沁恒微电子股份有限公司 | Usb虚拟串口实时上传数据的方法及系统、usb主机 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101516102A (zh) * | 2008-02-20 | 2009-08-26 | 中兴通讯股份有限公司 | 一种基于mcu的cdma2000 bsc boot异常下载方法及系统 |
CN101887379A (zh) * | 2010-06-18 | 2010-11-17 | 北京航空航天大学 | 一种基于虚拟网卡的无线信道仿真方法 |
CN103186608A (zh) * | 2011-12-30 | 2013-07-03 | 北京谊安医疗系统股份有限公司 | 一种队列序列化式处理数据的方法和装置 |
CN103353750A (zh) * | 2013-07-24 | 2013-10-16 | 昆明理工大学 | 一种基于多总线的微波冶金控制系统及方法 |
CN103365798A (zh) * | 2013-06-27 | 2013-10-23 | 华为技术有限公司 | 一种串口分时复用的方法及系统 |
US20160149801A1 (en) * | 2013-06-13 | 2016-05-26 | Tsx Inc. | Apparatus and method for failover of device interconnect using remote memory access with segmented queue |
-
2016
- 2016-06-24 CN CN201610474485.7A patent/CN106095716B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101516102A (zh) * | 2008-02-20 | 2009-08-26 | 中兴通讯股份有限公司 | 一种基于mcu的cdma2000 bsc boot异常下载方法及系统 |
CN101887379A (zh) * | 2010-06-18 | 2010-11-17 | 北京航空航天大学 | 一种基于虚拟网卡的无线信道仿真方法 |
CN103186608A (zh) * | 2011-12-30 | 2013-07-03 | 北京谊安医疗系统股份有限公司 | 一种队列序列化式处理数据的方法和装置 |
US20160149801A1 (en) * | 2013-06-13 | 2016-05-26 | Tsx Inc. | Apparatus and method for failover of device interconnect using remote memory access with segmented queue |
CN103365798A (zh) * | 2013-06-27 | 2013-10-23 | 华为技术有限公司 | 一种串口分时复用的方法及系统 |
CN103353750A (zh) * | 2013-07-24 | 2013-10-16 | 昆明理工大学 | 一种基于多总线的微波冶金控制系统及方法 |
Non-Patent Citations (1)
Title |
---|
马灵娟: "基于双缓冲队列的RS485串口/以太网转换器软件设计", 《计算机与现代化》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108076085A (zh) * | 2016-11-10 | 2018-05-25 | 北京国双科技有限公司 | 一种数据传输的方法及数据传输装置 |
CN107347178A (zh) * | 2017-06-29 | 2017-11-14 | 福州汇思博信息技术有限公司 | 串口复用方法及电子设备 |
CN107945430A (zh) * | 2017-11-24 | 2018-04-20 | 上海动联信息技术股份有限公司 | 一种用于智能pos机的基于串口的双向并发通讯方法 |
CN108270692A (zh) * | 2017-12-07 | 2018-07-10 | 上海西默通信技术有限公司 | 一种智能家居中串口数据传输方法 |
CN108052296A (zh) * | 2017-12-30 | 2018-05-18 | 惠龙易通国际物流股份有限公司 | 一种数据读取方法、设备及计算机存储介质 |
CN108052296B (zh) * | 2017-12-30 | 2021-02-19 | 惠龙易通国际物流股份有限公司 | 一种数据读取方法、设备及计算机存储介质 |
WO2023142301A1 (zh) * | 2022-01-29 | 2023-08-03 | 南京沁恒微电子股份有限公司 | Usb虚拟串口实时上传数据的方法及系统、usb主机 |
GB2618707A (en) * | 2022-01-29 | 2023-11-15 | Nanjing Qinheng Microelectronics Co Ltd | Method and system for real-time data uploading by USB virtual serial port, and USB host |
GB2618707B (en) * | 2022-01-29 | 2024-04-03 | Nanjing Qinheng Microelectronics Co Ltd | Method and system for real-time data uploading by USB virtual serial port and USB host |
Also Published As
Publication number | Publication date |
---|---|
CN106095716B (zh) | 2020-06-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106095716A (zh) | 一种基于首尾循环队列的串口通信方法 | |
US20170295112A1 (en) | Apparatus and method for buffering data in a switch | |
EP3229425B1 (en) | Packet forwarding method and device | |
WO2014118664A1 (en) | Virtual switching based flow control | |
US20160294709A1 (en) | Data Transmission Method, Core Forwarding Device, and Endpoint Forwarding Device | |
CN102523153B (zh) | 虚拟化环境下的负载均衡方法 | |
CN104008008B (zh) | 一种Linux系统中复用调试串口的方法 | |
CN102855156B (zh) | 一种中断控制器及中断控制方法 | |
CN103338157A (zh) | 一种多核系统核间数据报文缓存方法及设备 | |
CN104142901A (zh) | 一种具有传输优先级的串口复用器实现方法 | |
CN103441879B (zh) | 一种网络通道切换方法及装置 | |
US8775685B1 (en) | Parallel processing of network packets | |
CN108462654B (zh) | 增强型gjb289a总线通信管理和调度方法 | |
WO2016105419A1 (en) | Apparatus and method for routing data in a switch | |
CN105743951A (zh) | 一种数据发送、接收的方法及装置 | |
CN101841476A (zh) | 报文处理方法、装置和网络设备 | |
CN109710550A (zh) | 一种基于双缓存的帧长度不固定rs422数据通信系统 | |
CN104852865A (zh) | 一种基于sdn架构的流量控制方法及系统 | |
CN105763481A (zh) | 一种信息缓存方法及装置 | |
CN104023037A (zh) | 一种低系统开销的rapidio数据传输方法 | |
CN105808498B (zh) | 非对称多处理器通信方法及装置 | |
CN109257280B (zh) | 一种微引擎及其处理报文的方法 | |
CN101383819B (zh) | 异步串行数据线信息收发方法及异步串行收发器 | |
CN114979022A (zh) | 远程直接数据存取的实现方法、装置、适配器和存储介质 | |
KR101850749B1 (ko) | 멀티 코어 기반 nic에서 동적 패킷 버퍼 할당 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |