CN106776393A - 一种无中断的串口数据接收方法和装置 - Google Patents
一种无中断的串口数据接收方法和装置 Download PDFInfo
- Publication number
- CN106776393A CN106776393A CN201611218996.9A CN201611218996A CN106776393A CN 106776393 A CN106776393 A CN 106776393A CN 201611218996 A CN201611218996 A CN 201611218996A CN 106776393 A CN106776393 A CN 106776393A
- Authority
- CN
- China
- Prior art keywords
- buffering area
- byte
- data
- read
- reception
- 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/14—Handling requests for interconnection or transfer
- G06F13/16—Handling requests for interconnection or transfer for access to memory bus
- G06F13/1668—Details of memory controller
- G06F13/1673—Details of memory controller using buffers
-
- 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/28—DMA
- G06F2213/2806—Space or buffer allocation for DMA transfers
Abstract
本发明公开了一种无中断的串口数据接收方法和装置,该方法包括确定与直接存储器存取DMA关联的接收缓冲区中要写入数据的位置Wr与所述接收缓冲区中要读取数据的位置Rd;当判断出Rd与Wr在接收缓冲区中指示的位置不相同时,获取Rd与Wr之间所接收的字节数n;从Rd与Wr之间的n个字节中读出size个字节,其中size是所需要读取的数据字节数。通过本发明实施例方案,能够通过确定接收缓冲区内Wr与Rd来确定该接收缓冲区内是否已经存入数据字节,并根据Wr和Rd的具体指示位置获取存储的数据字节数,从而读取想要读取的数据字节,因此该方案可以不通过中断来接收数据。
Description
技术领域
本发明涉及数据存取技术,尤其涉及一种无中断的串口数据接收方法。
背景技术
对于嵌入式系统而言,串口(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的具体指示位置获取存储的数据字节数,从而读取想要读取的数据字节,因此该方案可以不通过中断来接收数据。
虽然本发明所揭露的实施方式如上,但所述的内容仅为便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属领域内的技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式及细节上进行任何的修改与变化,但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。
Claims (12)
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个字节。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611218996.9A CN106776393B (zh) | 2016-12-26 | 2016-12-26 | 一种无中断的串口数据接收方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611218996.9A CN106776393B (zh) | 2016-12-26 | 2016-12-26 | 一种无中断的串口数据接收方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106776393A true CN106776393A (zh) | 2017-05-31 |
CN106776393B CN106776393B (zh) | 2020-01-31 |
Family
ID=58926852
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611218996.9A Active CN106776393B (zh) | 2016-12-26 | 2016-12-26 | 一种无中断的串口数据接收方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106776393B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108804362A (zh) * | 2018-06-08 | 2018-11-13 | 北京无线电测量研究所 | 串口批量数据传输方法、装置及存储介质 |
CN110781104A (zh) * | 2019-10-30 | 2020-02-11 | 深圳市元征科技股份有限公司 | 一种数据处理系统、方法和装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101673253A (zh) * | 2009-08-21 | 2010-03-17 | 曙光信息产业(北京)有限公司 | 直接存储器访问的实现方法 |
CN101800867A (zh) * | 2010-01-19 | 2010-08-11 | 深圳市同洲电子股份有限公司 | 一种实现环形缓冲区的方法、装置及数字电视接收终端 |
CN103064679A (zh) * | 2012-12-25 | 2013-04-24 | 北京航天测控技术有限公司 | 长时间连续dma传输的缓冲区管理的软件实现方法 |
CN104375952A (zh) * | 2013-08-14 | 2015-02-25 | 南宁市跃龙科技有限公司 | 一种从环形缓冲区读取数据的方法 |
-
2016
- 2016-12-26 CN CN201611218996.9A patent/CN106776393B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101673253A (zh) * | 2009-08-21 | 2010-03-17 | 曙光信息产业(北京)有限公司 | 直接存储器访问的实现方法 |
CN101800867A (zh) * | 2010-01-19 | 2010-08-11 | 深圳市同洲电子股份有限公司 | 一种实现环形缓冲区的方法、装置及数字电视接收终端 |
CN103064679A (zh) * | 2012-12-25 | 2013-04-24 | 北京航天测控技术有限公司 | 长时间连续dma传输的缓冲区管理的软件实现方法 |
CN104375952A (zh) * | 2013-08-14 | 2015-02-25 | 南宁市跃龙科技有限公司 | 一种从环形缓冲区读取数据的方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108804362A (zh) * | 2018-06-08 | 2018-11-13 | 北京无线电测量研究所 | 串口批量数据传输方法、装置及存储介质 |
CN110781104A (zh) * | 2019-10-30 | 2020-02-11 | 深圳市元征科技股份有限公司 | 一种数据处理系统、方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106776393B (zh) | 2020-01-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3706005B1 (en) | Secure stream protocol for serial interconnect | |
EP3783517A1 (en) | Integrity and data encryption (ide) over computer buses | |
US20080209089A1 (en) | Packet-Based Parallel Interface Protocol For A Serial Buffer Having A Parallel Processor Port | |
EP4080839B1 (en) | Pcie-based data transmission method and apparatus | |
US9678891B2 (en) | Efficient search key controller with standard bus interface, external memory interface, and interlaken lookaside interface | |
TWI753063B (zh) | 資料傳送裝置及資料傳送方法 | |
CN105278918B (zh) | 寄存器的读取方法和采用该读取方法的寄存器 | |
CN110688333A (zh) | 一种基于pcie的dma数据传输系统及方法 | |
US20220368781A1 (en) | PCIe-Based Data Transmission Method and Apparatus | |
US20160011994A1 (en) | Multi-processor with efficient search key processing | |
EP4084422A1 (en) | Pcie-based data transmission method, apparatus, and system | |
CN106776393A (zh) | 一种无中断的串口数据接收方法和装置 | |
US7996206B2 (en) | Serial attached small computer system interface (SAS) connection emulation for direct attached serial advanced technology attachment (SATA) | |
WO2011136628A9 (en) | System and method of encoding and decoding control information in a medium access control protocol data unit | |
US9882737B2 (en) | Network system | |
US9594706B2 (en) | Island-based network flow processor with efficient search key processing | |
EP4086778A1 (en) | Pcie-based data transmission method, apparatus and system | |
US20110283068A1 (en) | Memory access apparatus and method | |
CN105117353A (zh) | 带有通用数据交互模块的fpga及采用该fpga的信息处理系统 | |
US9632959B2 (en) | Efficient search key processing method | |
JPH0458646A (ja) | バッファ管理方式 | |
US20230115125A1 (en) | Video and audio signal processing chip, video and audio signal processing device including the same, and video and audio signal processing method | |
US20090129355A1 (en) | Apparatus of transmitting packets of wireless local network and method for using the same | |
JPH1063617A (ja) | シリアル通信装置 | |
CN114443400B (zh) | 信号测试方法、装置、片上系统、电子设备及存储介质 |
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 |