太阳城集团

  • / 16
  • 下载费用:30 金币  

一种无中断的串口数据接收方法和装置.pdf

摘要
申请专利号:

太阳城集团CN201611218996.9

申请日:

2016.12.26

公开号:

CN106776393A

公开日:

2017.05.31

当前法律状态:

实审

有效性:

审中

法律详情: 实质审查的生效IPC(主分类):G06F 13/16申请日:20161226|||公开
IPC分类号: G06F13/16 主分类号: G06F13/16
申请人: 北京旋极太阳城集团技术股份有限公司
发明人: 刘爱斌
地址: 100094 北京市海淀区丰秀中路3号院12号楼
优先权:
专利代理机构: 北京安信方达知识产权代理有限公司 11262 代理人: 李红爽;栗若木
PDF完整版下载: PDF下载
法律状态
申请(专利)号:

CN201611218996.9

授权太阳城集团号:

|||

法律状态太阳城集团日:

2017.06.23|||2017.05.31

法律状态类型:

实质审查的生效|||公开

摘要

本发明公开了一种无中断的串口数据接收方法和装置,该方法包括确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的位置Wr与所述接收缓冲区中要读取数据的位置Rd;当判断出Rd与Wr在接收缓冲区中指示的位置不相同时,获取Rd与Wr之间所接收的字节数n;从Rd与Wr之间的n个字节中读出size个字节,其中size是所需要读取的数据字节数。通过本发明实施例方案,能够通过确定接收缓冲区内Wr与Rd来确定该接收缓冲区内是否已经存入数据字节,并根据Wr和Rd的具体指示位置获取存储的数据字节数,从而读取想要读取的数据字节,因此该方案可以不通过中断来接收数据。

权利要求书

1.一种无中断的串口数据接收方法,其特征在于,所述方法包括:
确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的位置Wr与所述接收缓冲
区中要读取数据的位置Rd;
当判断出所述Rd与所述Wr在所述接收缓冲区中指示的位置不相同时,获取所述Rd与所
述Wr之间所接收的字节数n;
从所述Rd与所述Wr之间的n个字节中读出size个字节,其中所述size是所需要读取数
据的字节数。
2.根据权利要求1所述的无中断的串口数据接收方法,其特征在于,所述方法还包括:
在确定所述DMA中预设的所述Wr与所述Rd之前,预先设置所述Wr与所述Rd的位置指示
规则;
在所述DMA进行数据存取过程中记录所述Wr与所述Rd在所述接收缓冲区中指示的位
置;
其中,所述Wr与所述Rd的位置指示规则包括:
初始化时,将所述接收缓冲区中要写入数据的位置Wr与所述接收缓冲区中要读取数据
的位置Rd均指示到所述接收缓冲区的初始位置S1;
当从所述接收缓冲区的初始位置S1开始,在所述接收缓冲区中存入x个字节时,将所述
要读取数据的位置Rd指示到所述接收缓冲区的初始位置S1,将所述要写入数据的位置Wr指
示到存入所述x个字节后的下一个字节S2位置处;当在所述接收缓冲区中读取x个字节后,
将所述要读取数据的位置Rd指示到所述接收缓冲区的S2位置;
当从所述接收缓冲区的S2位置开始,在所述接收缓冲区中存入y个字节时,将所述要读
取数据的位置Rd指示到所述接收缓冲区的S2位置;将所述要写入数据的位置Wr指示到存入
所述y个字节后的下一个字节S3位置处;当在所述接收缓冲区中读取y个字节后,将所述要
读取数据的位置Rd指示到所述接收缓冲区的S3位置;
其中,n包含所述x和y;所述接收缓冲区的长度为N,x和y均小于或等于N,x、y和N均为0
或正整数。
3.根据权利要求1或2所述的无中断的串口数据接收方法,其特征在于,所述确定接收
缓冲区中要写入数据的位置Wr还包括:
读取预设的DMA的计数器的计数值CNDTR;其中,所述DMA处于循环模式下;
根据所读取的计数值CNDTR和第二关系式计算所述要写入数据的位置Wr;其中所述第
二关系式包括:Wr=N-CNDTR。
4.根据权利要求1或2所述的无中断的串口数据接收方法,其特征在于,所述获取所述
接收缓冲区中所接收的字节数n包括:根据预设的第一关系式计算所述接收缓冲区中所接
收的字节数n;
所述第一关系式包括:
n=Wr-Rd(Wr≥Rd);n=N+Wr-Rd(Wr<Rd)。
5.根据权利要求1所述的无中断的串口数据接收方法,其特征在于,所述方法还包括:
预先根据串口速率和应用层的最大轮询间隔太阳城集团设置所述接收缓冲区的长度N。
6.根据权利要求1所述的无中断的串口数据接收方法,其特征在于,所述从所述Rd与所
述Wr之间的n个字节中读出size个字节包括:
当所述size大于或等于所述Rd与所述Wr之间存取的字节数n时,从所述Rd指示的位置
开始,直接读取所述Rd与所述Wr之间存取的n个字节;
当所述size小于所述Rd与所述Wr之间存取的字节数n时,从所述Rd指示的位置开始,依
次读取所述Rd与所述Wr之间存取的size个字节。
7.一种无中断的串口数据接收装置,其特征在于,所述装置包括:确定模块、获取模块
和读取模块;
所述确定模块,用于确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的位
置Wr与所述接收缓冲区中要读取数据的位置Rd;
所述获取模块,用于当所述确定模块判断出所述Rd与所述Wr在所述接收缓冲区中指示
的位置不相同时,获取所述Rd与所述Wr之间所接收的字节数n;
所述读取模块,用于从所述Rd与所述Wr之间的n个字节中读取出size个字节;其中所述
size是所需要读取数据的字节数。
8.根据权利要求7所述的无中断的串口数据接收装置,其特征在于,所述装置还包括:
设置模块和记录模块;
所述设置模块,用于在确定所述DMA中预设的所述Wr与所述Rd之前,预先设置所述Wr与
所述Rd的位置指示规则;
所述记录模块,用于在所述DMA进行数据存取过程中记录所述Wr与所述Rd在所述接收
缓冲区中指示的位置;
其中,所述Wr与所述Rd的位置指示规则包括:
初始化时,将所述接收缓冲区中要写入数据的位置Wr与所述接收缓冲区中要读取数据
的位置Rd均指示到所述接收缓冲区的初始位置S1;
当从所述接收缓冲区的初始位置S1开始,在所述接收缓冲区中存入x个字节时,将所述
要读取数据的位置Rd指示到所述接收缓冲区的初始位置S1,将所述要写入数据的位置Wr指
示到存入所述x个字节后的下一个字节S2位置处;当在所述接收缓冲区中读取x个字节后,
将所述要读取数据的位置Rd指示到所述接收缓冲区的S2位置;
当从所述接收缓冲区的S2位置开始,在所述接收缓冲区中存入y个字节时,将所述要读
取数据的位置Rd指示到所述接收缓冲区的S2位置;将所述要写入数据的位置Wr指示到存入
所述y个字节后的下一个字节S3位置处;当在所述接收缓冲区中读取y个字节后,将所述要
读取数据的位置Rd指示到所述接收缓冲区的S3位置;
其中,n包含所述x和y;所述接收缓冲区的长度为N,x和y均小于或等于N,x、y和N均为0
或正整数。
9.根据权利要求7或8所述的无中断的串口数据接收装置,其特征在于,所述确定模块
确定接收缓冲区中要写入数据的位置Wr还包括:
读取预设的DMA的计数器的计数值CNDTR;其中,所述DMA处于循环模式下;
根据所读取的计数值CNDTR和第二关系式计算所述要写入数据的位置Wr;其中所述第
二关系式包括:Wr=N-CNDTR。
10.根据权利要求7或8所述的无中断的串口数据接收装置,其特征在于,所述获取模块
获取所述接收缓冲区中所接收的字节数n包括:根据预设的第一关系式计算所述接收缓冲
区中所接收的字节数n;
所述第一关系式包括:
n=Wr-Rd(Wr≥Rd);n=N+Wr-Rd(Wr<Rd)。
11.根据权利要求8所述的无中断的串口数据接收装置,其特征在于,所述设置模块还
用于:预先根据串口速率和应用层的最大轮询间隔太阳城集团设置所述接收缓冲区的长度N。
12.根据权利要求1所述的不中断的串口数据接收装置,其特征在于,所述读取模块从
所述Rd与所述Wr之间的n个字节中读出size个字节包括:
当所述size大于或等于所述Rd与所述Wr之间存取的字节数n时,从所述Rd指示的位置
开始,直接读取所述Rd与所述Wr之间存取的n个字节;
当所述size小于所述Rd与所述Wr之间存取的字节数n时,从所述Rd指示的位置开始,依
次读取所述Rd与所述Wr之间存取的size个字节。

说明书

一种无中断的串口数据接收方法和装置

技术领域

本发明涉及数据存取技术,尤其涉及一种无中断的串口数据接收方法。

背景技术

对于嵌入式系统而言,串口(USART)是一种常见的接口,驱动层负责将串口所收到
的数据写入接收缓冲区,应用层通过轮询的方法从接收缓冲区读取数据。

串口驱动一般有两种实现方法:

一种是串口中断方式,串口每收到一个字节产生一个中断,然后在中断服务程序
中将收到的数据存入接收缓冲区。

另一种是DMA(Direct Memory Access直接存储器存取)中断方式,将串口和接收
缓冲区与DMA关联,由DMA自动从串口接收数据并存入接收缓冲区,收到指定长度的数据后
产生DMA中断,然后在中断服务程序中设置收到数据包标志为真,应用层一旦查询到该标志
为真则从接收缓冲区读取数据并将该标志设置为假

在串口中断方式中,若串口速率高则中断过于频繁,而且在串口中断处理过程中
若出现更高级的中断则可能导致收到的数据丢失。

DMA中断方式一般适用于定长数据包的接收,若要适用于变长数据包,则所有短的
数据包在发送前需通过填充无用数据以扩展到与最长数据包一样的长度,从而确保DMA收
到数据包后能产生中断,但这些无用数据降低了传输效率。若在串口传输中偶尔出现错误
使DMA少收一个字节将导致DMA中断延迟,通常情况下认为包头从接收缓冲区的第一个位置
开始,因此丢失一个字节的数据将导致后续数据包解析错误,串口通信出现异常,难以恢
复,除非有串口异常处理。

这两种方式都用到了中断,对于嵌入式系统而言,在不影响系统功能和性能的前
提下,应尽可能减少中断的使用。

发明内容

为了解决上述技术问题,本发明提供了一种无中断的串口数据接收方法和装置,
能够不通过中断来接收数据。

为了达到本发明目的,本发明提供了一种无中断的串口数据接收方法,该方法包
括:

确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的位置Wr与所述接收
缓冲区中要读取数据的位置Rd;

当判断出Rd与Wr在接收缓冲区中指示的位置不相同时,获取Rd与Wr之间所接收的
字节数n;

从Rd与Wr之间的n个字节中读取出size个字节,其中size是所需要读取数据的字
节数。

可选地,该方法还包括:

在确定DMA中预设的Wr与Rd之前,预先设置Wr与Rd的位置指示规则;

在DMA进行数据存取过程中记录Wr与Rd在接收缓冲区中指示的位置。

其中,Wr与Rd的位置指示规则包括:

初始化时,将接收缓冲区中要写入数据的位置Wr与接收缓冲区中要读取数据的位
置Rd均指示到接收缓冲区的初始位置S1;

当从接收缓冲区的初始位置S1开始,在接收缓冲区中存入x个字节时,将要读取数
据的位置Rd指示到接收缓冲区的初始位置S1,将要写入数据的位置Wr指示到存入x个字节
后的下一个字节S2位置处;当在接收缓冲区中读取x个字节后,将要读取数据的位置Rd指示
到接收缓冲区的S2位置;

当从接收缓冲区的S2位置开始,在接收缓冲区中存入y个字节时,将要读取数据的
位置Rd指示到接收缓冲区的S2位置;将要写入数据的位置Wr指示到存入y个字节后的下一
个字节S3位置处;当在接收缓冲区中读取y个字节后,将要读取数据的位置Rd指示到接收缓
冲区的S3位置;

其中,n包含x和y;接收缓冲区的长度为N,x和y均小于或等于N,x、y和N均为0或正
整数。

可选地,确定接收缓冲区中要写入数据的位置Wr还包括:

读取预设的DMA的计数器的计数值CNDTR;其中,DMA处于循环模式下;

根据所读取的计数值CNDTR和第二关系式计算要写入数据的位置Wr;其中第二关
系式包括:Wr=N-CNDTR。

可选地,获取接收缓冲区中所接收的字节数n包括:根据预设的第一关系式计算接
收缓冲区中所接收的字节数n;

第一关系式包括:

n=Wr-Rd(Wr≥Rd);n=N+Wr-Rd(Wr<Rd)。

可选地,该方法还包括:预先根据串口速率和应用层的最大轮询间隔太阳城集团设置接
收缓冲区的长度N。

可选地,从Rd与Wr之间的n个字节中读取出size个字节包括:

当size大于或等于Rd与Wr之间存取的字节数n时,从Rd指示的位置开始,直接读取
Rd与Wr之间存取的n个字节;

当size小于Rd与Wr之间存取的字节数n时,从Rd指示的位置开始,依次读取Rd与Wr
之间存取的size个字节。

为了达到本发明目的,本发明还提供了一种无中断的串口数据接收装置,该装置
包括:确定模块、获取模块和读取模块。

确定模块,用于确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的位
置Wr与接收缓冲区中要读取数据的位置Rd。

获取模块,用于当确定模块判断出Rd与Wr在接收缓冲区中指示的位置不相同时,
获取Rd与Wr之间所接收的字节数n。

读取模块,用于从Rd与Wr之间的n个字节中读取出size个字节;其中size是所需要
读取数据的字节数。

可选地,该装置还包括:设置模块和记录模块。

设置模块,用于在确定DMA中预设的Wr与Rd之前,预先设置Wr与Rd的位置指示规
则。

记录模块,用于在DMA进行数据存取过程中记录Wr与Rd在接收缓冲区中指示的位
置。

其中,Wr与Rd的位置指示规则包括:

初始化时,将接收缓冲区中要写入数据的位置Wr与接收缓冲区中要读取数据的位
置Rd均指示到接收缓冲区的初始位置S1;

当从接收缓冲区的初始位置S1开始,在接收缓冲区中存入x个字节时,将要读取数
据的位置Rd指示到接收缓冲区的初始位置S1,将要写入数据的位置Wr指示到存入x个字节
后的下一个字节S2位置处;当在接收缓冲区中读取x个字节后,将要读取数据的位置Rd指示
到接收缓冲区的S2位置;

当从接收缓冲区的S2位置开始,在接收缓冲区中存入y个字节时,将要读取数据的
位置Rd指示到接收缓冲区的S2位置;将要写入数据的位置Wr指示到存入y个字节后的下一
个字节S3位置处;当在接收缓冲区中读取y个字节后,将要读取数据的位置Rd指示到接收缓
冲区的S3位置;

其中,n包含x和y;接收缓冲区的长度为N,x和y均小于或等于N,x、y和N均为0或正
整数。

可选地,确定模块确定接收缓冲区中要写入数据的位置Wr还包括:

读取预设的DMA的计数器的计数值CNDTR;其中,DMA处于循环模式下;

根据所读取的计数值CNDTR和第二关系式计算所述要写入数据的位置Wr;其中第
二关系式包括:Wr=N-CNDTR。

可选地,获取模块获取接收缓冲区中所接收的字节数n包括:根据预设的第一关系
式计算接收缓冲区中所接收的字节数n;

第一关系式包括:

n=Wr-Rd(Wr≥Rd);n=N+Wr-Rd(Wr<Rd)。

可选地,设置模块还用于:预先根据串口速率和应用层的最大轮询间隔太阳城集团设置
接收缓冲区的长度N。

可选地,读取模块从Rd与Wr之间的n个字节中读出size个字节包括:

当size大于或等于Rd与Wr之间存取的字节数n时,从Rd指示的位置开始,直接读取
Rd与Wr之间存取的n个字节;

当size小于Rd与Wr之间存取的字节数n时,从Rd指示的位置开始,依次读取Rd与Wr
之间存取的size个字节。

与现有技术相比,本发明包括一种不中断的串口数据接收方法和装置,该方法包
括确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的位置Wr与所述接收缓冲区
中要读取数据的位置Rd;当判断出Rd与Wr在接收缓冲区中指示的位置不相同时,获取Rd与
Wr之间所接收的字节数n;从Rd与Wr之间的n个字节中读取出size个字节,其中size是所需
要读取数据的字节数。通过本发明实施例方案,能够通过确定DMA中接收缓冲区内要写入数
据的位置Wr与接收缓冲区内要读取数据的位置Rd来确定该接收缓冲区内是否已经存入数
据字节,并根据Wr和Rd的具体指示位置获取存储的数据字节数,从而读取想要读取的数据
字节,因此该方案可以不通过中断来接收数据。

本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变
得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利
要求书以及附图中所特别指出的结构来实现和获得。

附图说明

附图用来提供对本发明技术方案的进一步理解,并且构成说明书的一部分,与本
申请的实施例一起用于解释本发明的技术方案,并不构成对本发明技术方案的限制。

图1为本发明实施例的无中断的串口数据接收方法流程图;

图2为本发明实施例的初始化后的接收缓冲区示意图;

图3为本发明实施例的存入6个字节后的接收缓冲区示意图;

图4为本发明实施例的读取6个字节后的接收缓冲区示意图;

图5为本发明实施例的存入9个字节后的接收缓冲区示意图;

图6为本发明实施例的无中断的串口数据接收方法实现示意图;

图7为本发明实施例的无中断的串口数据接收装置组成框图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明白,下文中将结合附图对本发明
的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中
的特征可以相互任意组合。

在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中
执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺
序执行所示出或描述的步骤。

为了达到本发明目的,本发明提供了一种无中断的串口数据接收方法,如图1所
示,该方法包括S101-S103:

S101、确定与直接存储器存取DMA中关联的接收缓冲区中要写入数据的位置Wr与
接收缓冲区中要读取数据的位置Rd。

在本发明实施例中,为了实现不通过中断来接收或读取DMA的接收缓冲区中的数
据字节,本发明实施例提出了一种基于接收缓冲区中要写入数据的位置Wr与接收缓冲区中
要读取数据的位置Rd来读取接收缓冲区中的数据字节的方案。

在本发明实施例中,DMA方式即直接存储器存取(Direct Memory Access)方式。一
个设备接口试图通过总线直接向另一个设备发送数据(一般是大批量的数据),它会先向
CPU发送DMA请求信号。外设通过DMA的一种专门接口电路――DMA控制器(DMAC),向CPU提出
接管总线控制权的总线请求,CPU收到该信号后,在当前的总线周期结束后,会按DMA信号的
优先级和提出DMA请求的先后顺序响应DMA信号。CPU对某个设备接口响应DMA请求时,会让
出总线控制权。于是在DMA控制器的管理下,外设和存储器直接进行数据交换,而不需CPU干
预。数据传送完毕后,设备接口会向CPU发送DMA结束信号,交还总线控制权。

在本发明实施例中,在根据本发明实施例方案通过DMA进行数据存取之前,需要预
先对DMA参数进行设置。将串口和DMA及接收缓冲区相关联,设置接收缓冲区的长度为N,DMA
模式为Circular mode(循环模式),当DMA启动后,它的计数器的计数值CNDTR自动设置为N,
每接收一个字节CNDTR自动减一,当CNDTR一旦为0则自动设置为N,如此循环。显然,接收缓
冲区中不断有数据写入,应用层随时可从收缓冲区中读取数据,可不用DMA中断来指示收到
指定长度的数据。

在本发明实施例中,基于上述的计数器,我们可以通过以下方案确定直接存储器
存取DMA中预设的接收缓冲区中要写入数据的位置Wr。

可选地,确定接收缓冲区中要写入数据的位置Wr包括S201-S202:

S201、读取预设的DMA的计数器的计数值CNDTR;其中,DMA处于循环模式下。

S202、根据所读取的计数值CNDTR和第二关系式计算要写入数据的位置Wr;其中第
二关系式包括:Wr=N-CNDTR。

在本发明实施例中,在根据本发明实施例方案通过DMA进行数据存取之前,还需要
预先对接收缓冲区进行定义。

在本发明实施例中,首先需要定义接收缓冲区的长度N。可选地,该方法还包括:预
先根据串口速率和应用层的最大轮询间隔太阳城集团设置接收缓冲区的长度N。在本发明实施例
中,为了避免接收缓冲区中出现未读取的数据被新写入的数据覆盖而造成数据丢失,需要
根据串口速率和应用层的最大轮询间隔太阳城集团设置接收缓冲区的长度N。可选地,此处N的取
值可以为13。

在本发明实施例中,其次需要分别定义预设的接收缓冲区中要写入数据的位置和
接收缓冲区中要读取数据的位置,可以分别用Wr和Rd来表示。即,Wr和Rd用于分别指示和存
储接收缓冲区中要写入数据的位置和接收缓冲区中要读取数据的位置。需要说明的是,该
Wr和Rd不是为以固定的,可以采用任何数字、字符、编码等来表示。

可选地,该方法还包括:在确定Wr与Rd之前,预先设置Wr与Rd的位置指示规则;在
DMA进行数据存取过程中记录Wr与Rd在接收缓冲区中指示的位置。

在本发明实施例中,通过前述方案定义了Wr和Rd之后,还需要进一步对Wr和Rd的
位置指示规则进行定义。

其中,Wr与Rd的位置指示规则包括:

初始化时,将接收缓冲区中要写入数据的位置Wr与接收缓冲区中要读取数据的位
置Rd均指示到接收缓冲区的初始位置S1;

当从接收缓冲区的初始位置S1开始,在接收缓冲区中存入x个字节时,将要读取数
据的位置Rd指示到接收缓冲区的初始位置S1,将要写入数据的位置Wr指示到存入x个字节
后的下一个字节位置S2处;当在接收缓冲区中读取x个字节后,将要读取数据的位置Rd指示
到接收缓冲区的S2位置;

当从接收缓冲区的S2位置开始,在接收缓冲区中存入y个字节时,将要读取数据的
位置Rd指示到接收缓冲区的S2位置;将要写入数据的位置Wr指示到存入y个字节后的下一
个字节位置S3处;当在接收缓冲区中读取y个字节后,将要读取数据的位置Rd指示到接收缓
冲区的S3位置;

其中,n包含x和y;接收缓冲区的长度为N,x和y均小于或等于N,x、y和N均为0或正
整数。

在本发明实施例中,可以通过具体实施例对上述方案进行说明,这里接收缓冲区
的长度N以13为例进行说明。

如图2所示,初始化时,将Wr和Rd清0,即Wr和Rd同时指示在接收缓冲区中0的位置,
该0的位置及上述方案的S1位置,说明当前无数据存入。

如图3所示,当接收缓冲区中存入6个字节(x个字节)以后,要读取数据的位置Rd仍
指示在接收缓冲区的初始位置0处,即S1处,此时要写入数据的位置Wr指示到了存入6个字
节后的下一个字节位置6处,即本发明实施例方案的S2处,这时,Wr和Rd指示的位置不相同,
说明接收缓冲区中已经存入数据。

如图4所示,当在接收缓冲区中读取6个字节(x个字节)后,要读取数据的位置Rd指
示到了接收缓冲区的6位置处,即本发明实施例方案的S2处,此时,Wr和Rd指示的位置相同,
说明接收缓冲区中已经没有数据。

如图5所示,当从接收缓冲区的6位置处(S2位置)开始,在接收缓冲区中存入9个字
节(y个字节)后,要读取数据的位置Rd仍指示在接收缓冲区的6位置处,即S2处,基于DMA的
循环模式,此时要写入数据的位置Wr指示到了存入9个字节后的下一个字节位置2处,即本
发明实施例方案的S3处,这时,Wr和Rd指示的位置不相同,说明接收缓冲区中已经存入数
据。

在本发明实施例中,当后续还需要继续读取和存储数据时,依据上述方案类推,来
设置并保存Wr和Rd的指示位置,在此不再一一赘述。

S102、当确定Rd与Wr在接收缓冲区中指示的位置不相同时,获取Rd与Wr之间存取
的字节数n。

在本发明实施例中,有上述方案可知,当确定Rd与Wr在接收缓冲区中指示的位置
相同时,说明当前接收缓冲区中不存在缓存数据,因此不用读取数据。反之,当确定Rd与Wr
在接收缓冲区中指示的位置不相同时,说明当前接收缓冲区中存在缓存数据,因此可以进
一步获取Rd与Wr之间存取的字节数n,以确定能够读取的字节数。

可选地,获取接收缓冲区中所接收的字节数n包括:根据预设的第一关系式计算接
收缓冲区中所接收的字节数n;

第一关系式包括:

n=Wr-Rd(Wr≥Rd);n=N+Wr-Rd(Wr<Rd)。

在本发明实施例中,n=Wr-Rd(Wr≥Rd)是针对图3实施例的情况进行的计算,n=N
+Wr-Rd(Wr<Rd)是针对图5实施例的情况进行的计算。

S103、从Rd与Wr之间的n个字节中读出size个字节,其中size是所需要读取数据的
字节数。

在本发明实施例中,通过上述方案确定出Rd与Wr之间存取的字节数n以后,便可以
根据所需要读取的数据字节数size确定出具体应该读取n个字节中的哪些部分。

可选地,从Rd与Wr之间的n个字节中读出size个字节包括:

当size大于或等于Rd与Wr之间存取的字节数n时,从Rd指示的位置开始,直接读取
Rd与Wr之间存取的n个字节;

当size小于Rd与Wr之间存取的字节数n时,从Rd指示的位置开始,依次读取Rd与Wr
之间存取的size个字节。

在本发明实施例中,当接收缓冲区中存取了9个字节,而所需要读取的数据字节数
为10时,这是只需要直接读取全部9个字节即可。当接收缓冲区中存取了9个字节,而所需要
读取的数据字节数为7时,这是只需要直接读取前面7个字节即可。

在本发明实施例中,上述的步骤S101至S103之间的全部实现方案可以通过C语言
来实现,具体如图6所示的接收数据流程图。其中,可以预定义一个接口函数int usartRead
(unsigned char*buf,int size),其功能为:应用层读取串口收到的数据;其参数:Buf为接
收数据缓冲区的首地址;size为所需要读取的数据字节数;其返回值:返回所读取数据的字
节数。

为了达到本发明目的,本发明还提供了一种不中断的串口数据接收装置1,如图7
所示,该装置包括:确定模块11、获取模块12和读取模块13。

确定模块11,用于确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的
位置Wr与接收缓冲区中要读取数据的位置Rd。

获取模块12,用于当确定模块判断出Rd与Wr在接收缓冲区中指示的位置不相同
时,获取Rd与Wr之间所接收的字节数n。

读取模块13,用于从Rd与Wr之间的n个字节中读取出size个字节;其中size是所需
要读取数据的字节数。

可选地,该装置还包括:设置模块14和记录模块15。

设置模块14,用于在确定DMA中预设的Wr与Rd之前,预先设置Wr与Rd的位置指示规
则。

记录模块15,用于在DMA进行数据存取过程中记录Wr与Rd在接收缓冲区中指示的
位置。

其中,Wr与Rd的位置指示规则包括:

初始化时,将接收缓冲区中要写入数据的位置Wr与接收缓冲区中要读取数据的位
置Rd均指示到接收缓冲区的初始位置S1;

当从接收缓冲区的初始位置S1开始,在接收缓冲区中存入x个字节时,将要读取数
据的位置Rd指示到接收缓冲区的初始位置S1,将要写入数据的位置Wr指示到存入x个字节
后的下一个字节S2位置处;当在接收缓冲区中读取x个字节后,将要读取数据的位置Rd指示
到接收缓冲区的S2位置;

当从接收缓冲区的S2位置开始,在接收缓冲区中存入y个字节时,将要读取数据的
位置Rd指示到接收缓冲区的S2位置;将要写入数据的位置Wr指示到存入y个字节后的下一
个字节S3位置处;当在接收缓冲区中读取y个字节后,将要读取数据的位置Rd指示到接收缓
冲区的S3位置;

其中,n包含x和y;接收缓冲区的长度为N,x和y均小于或等于N,x、y和N均为0或正
整数。

可选地,确定模块11确定接收缓冲区中要写入数据的位置Wr还包括:

读取预设的DMA的计数器的计数值CNDTR;其中,DMA处于循环模式下;

根据所读取的计数值CNDTR和第二关系式计算所述要写入数据的位置Wr;其中第
二关系式包括:Wr=N-CNDTR。

可选地,获取模块12获取接收缓冲区中所接收的字节数n包括:根据预设的第一关
系式计算接收缓冲区中所接收的字节数n;

第一关系式包括:

n=Wr-Rd(Wr≥Rd);n=N+Wr-Rd(Wr<Rd)。

可选地,设置模块14还用于:预先根据串口速率和应用层的最大轮询间隔太阳城集团设
置接收缓冲区的长度N。

可选地,读取模块13从Rd与Wr之间的n个字节中读出size个字节包括:

当size大于或等于Rd与Wr之间存取的字节数n时,从Rd指示的位置开始,直接读取
Rd与Wr之间存取的n个字节;

当size小于Rd与Wr之间存取的字节数n时,从Rd指示的位置开始,依次读取Rd与Wr
之间存取的size个字节。

与现有技术相比,本发明包括一种不中断的串口数据接收方法和装置,该方法包
括确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的位置Wr与所述接收缓冲区
中要读取数据的位置Rd;当判断出Rd与Wr在接收缓冲区中指示的位置不相同时,获取Rd与
Wr之间所接收的字节数n;从Rd与Wr之间的n个字节中读取出size个字节,其中size是所需
要读取数据的字节数。通过本发明实施例方案,能够通过确定DMA中接收缓冲区内要写入数
据的位置Wr与接收缓冲区内要读取数据的位置Rd来确定该接收缓冲区内是否已经存入数
据字节,并根据Wr和Rd的具体指示位置获取存储的数据字节数,从而读取想要读取的数据
字节,因此该方案可以不通过中断来接收数据。

虽然本发明所揭露的实施方式如上,但所述的内容仅为便于理解本发明而采用的
实施方式,并非用以限定本发明。任何本发明所属领域内的技术人员,在不脱离本发明所揭
露的精神和范围的前提下,可以在实施的形式及细节上进行任何的修改与变化,但本发明
的专利保护范围,仍须以所附的权利要求书所界定的范围为准。

关 键 词:
一种 中断 串口 数据 接收 方法 装置
  专利查询网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
太阳城集团本文
本文标题:一种无中断的串口数据接收方法和装置.pdf
链接地址:http://zh228.com/p-6019868.html
太阳城集团我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服客服 - 联系我们

copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备17046363号-1 
 


收起
展开
葡京赌场|welcome document.write ('');