本发明单片机技术领域,特别涉及一种数据通信方法及系统。
背景技术:
spi(serialperipheralinterface,串行外设接口)通信多用于嵌入式开发中主单片机与外围芯片之间的通信,spi的通信速率一般在1-10mbps范围内,主要传输一些芯片状态信息和主机的控制指令。spi为主从通信模式,可以一主多从。大多数采用四线制,也可以采用三线制。如图1和图2所示,四线制里的四条信号线包括时钟信号、片选信号、主收从发和主发从收信号,三线制没有主收从发信号线。spi的通信速率取决于spi总线时钟,每一次可发送的数据为4~64位的位长。当spi通信开始时,片选信号由空闲变为有效,主机发送时钟信号作为通信的时钟信号,主机和从机同时开始发送数据,数据发送完成后时钟信号结束,片选信号变为空闲状态。
目前相关的技术方案中,一般情况下数据都是单个发送的,一次通信中,必须等待发送接收完成后才能开始下一次通信,否则会产生发送数据丢失或者接收数据溢出的错误。这是因为spi的数据寄存器空间是有限的,同一时间段内,如果向数据寄存器中发送了过多的数据,就会发生丢失或者覆盖的情况,造成接收不到数据或者得到错误的数据。为了避免产生这样的错误,需要在写数据时判断发送数据寄存器是否为空,如果非空则进行等待,为空时才进行发送,这样可以避免丢失发送数据。同时,为了避免接收数据错误,需要在发送完成后进行等待的动作,在接收完成后再从接收数据寄存器中取出接收数据。由于spi通信的速率是微秒级的,而一般的系统程序运行是纳秒级的,程序在执行的过程中等待spi通信完成,会占用较长的系统时间。如果是spi要处理大量的数据,这样的运行方式无疑是非常影响程序执行效率的。
技术实现要素:
有鉴于此,本发明旨在提出一种数据通信方法,该方法能够降低系统占用,减少程序执行时间,提升系统的执行效率,另外,该方法能够解决spi数据寄存器存储空间不足,难以实现队列化的spi通信的问题。
为达到上述目的,本发明的技术方案是这样实现的:
一种数据通信方法,包括以下步骤:获取一个或多个数据的地址,并根据所述一个或多个数据的地址将所述一个或多个数据构成一个或多个数据队列;将所述一个或多个数据队列按照先后顺序依次存入缓存区;判断是否满足数据发送和接收条件;如果满足所述数据发送和接收条件,则将所述缓存区中的一个或多个数据队列按照所述先后顺序依次进行发送;以及在所述一个或多个数据队列发送完毕后,按照存储顺序依次接收所述一个或多个数据队列的地址中的一个或多个数据,并按照所述存储顺序将所述一个或多个数据传递至相应数据单元中。
进一步地,在所述一个或多个数据接收完成后,还包括:调用返回函数对接收到的所述一个或多个数据进行相应处理。
进一步地,所述一个或多个数据以数据链表的形式构成在所述一个或多个数据队列。
进一步地,所述一个或多个数据队列的个数与所述缓存区的个数相同,所述一个或多个数据队列一一对应地存入一个或多个缓存区。
进一步地,还包括:设置当前目标存储计数器、当前目标发送计数器和当前目标接收计数器;在将所述一个或多个数据队列存入所述一个或多个缓存区时,首先判断所述当前目标存储计数器所指向的缓存区的是否为空,并在所述当前目标存储计数器所指向缓存区不为空时,将一个数据队列存入所述缓存区,并在存储完成后将所述当前目标存储计数器的值加1,并将所述当前目标存储计数器的指针指向下一个缓存区,按照上述存储方式将另一个数据队列存入所述下一个缓存区,直至所有的数据队列均被存入所述缓存区中,将所述当前目标存储计数器的值清零;在发送所述一个或多个数据队列时,首先判断所述当前目标发送计数器所指向的数据队列是否为空,并在所述当前目标发送计数器所指的数据队列不为空时,发送所述当前目标发送计数器所指向的数据队列,并在发送完成后将所述当前目标发送计数器的值加1,并将所述当前发送目标计数器的指针指向下一个数据队列以进行所述下一个数据队的发送,直至所有的数据队列都发送完成后将所述当前发送目标计数器的值清零;在接收所述一个或多个数据队列中的地址的一个或多个数据时,首先判断是否需要接收所述当前目标接收计数器所指向的数据队列的地址中的一个或多个数据,并在判定需要接收时,将所述当前目标接收计数器所指向的数据队列的地址中的一个或多个数据按照存储顺序依次进行接收,并在该数据队列的地址中所有数据都接收完成后,将所述当前目标接收计数器的值加1,并将所述当前目标接收计数器的指针指向下一个数据队列以对所述下一个数据队列的地址中的一个或多个数据进行接收,直至所有数据队列的地址中的数据均被接收完成后,将所述当前目标接收计数器的值清零。
相对于现有技术,本发明所述的数据标定方法具有以下优势:
本发明的数据通信方法,可以将数据构成的数据队列存储至缓存区,然后按数据队列存 储的先后顺序进行发送,无需执行发送后等待接收的动作,从而降低了系统占用,缩短了spi通信中的等待时间,减少了程序执行时间,提升了系统执行效率,而且队列化通信和链表存储的实现方式都具有较好的移植性和对其它通信方式来说非常实用的借鉴意义,且随着单片机系统时钟的提高,对于程序执行效率的提升会更加可观。
本发明的另一个目的在于提出一种数据通信系统,该系统能够降低系统占用,减少程序执行时间,提升系统的执行效率。
为达到上述目的,本发明的技术方案是这样实现的:
一种数据通信系统,包括:数据队列生成模块,所述数据队列生成模块用于获取一个或多个数据的地址,并根据所述一个或多个数据的地址将所述一个或多个数据构成一个或多个数据队列;缓存模块,所述缓存模块用于将所述一个或多个数据队列按照先后顺序依次存入缓存区;判断模块,所述判断模块用于判断是否满足发送和接收条件;数据发送模块,所述数据发送模块用于在满足所述数据发送和接收条件时,将所述缓存区中的一个或多个数据队列按照所述先后顺序依次进行发送;数据接收模块,所述数据接收模块用于在所述一个或多个数据队列发送完毕后,按照存储顺序依次接收所述一个或多个数据队列的地址中的一个或多个数据,并按照所述存储顺序将所述一个或多个数据传递至相应数据单元中。
进一步的,还包括:函数调用模块,所述函数调用模块用于在所述一个或多个数据接收完成后,用返回函数对接收到的所述一个或多个数据进行相应处理。
进一步的,所述一个或多个数据以数据链表的形式构成在所述一个或多个数据队列。
进一步地,所述一个或多个数据队列的个数与所述缓存区的个数相同,所述一个或多个数据队列一一对应地存入一个或多个缓存区。
进一步地,还包括:当前目标存储计数器、当前目标发送计数器和当前目标接收计数器,其中,在将所述一个或多个数据队列存入所述一个或多个缓存区时,首先判断所述当前目标存储计数器所指向的缓存区的是否为空,并在所述当前目标存储计数器所指向缓存区不为空时,将一个数据队列存入所述缓存区,并在存储完成后将所述当前目标存储计数器的值加1,并将所述当前目标存储计数器的指针指向下一个缓存区,按照上述存储方式将另一个数据队列存入所述下一个缓存区,直至所有的数据队列均被存入所述缓存区中,将所述当前目标存储计数器的值清零;在发送所述一个或多个数据队列时,首先判断所述当前目标发送计数器所指向的数据队列是否为空,并在所述当前目标发送计数器所指的数据队列不为空时,发送所述当前目标发送计数器所指向的数据队列,并在发送完成后将所述当前目标发送计数器的值加1,并将所述当前发送目标计数器的指针指向下一个数据队列以进行所述下一个数据队的发送,直至所有的数据队列都发送完成后将所述当前发送目标计数器的值清零;在接收所述一个或多个数据队列中的地址的一个或多个数据时,首先判断是否需要接收所述当前目标接收计数器所指向的数据队列的地址中的一个或多个数据,并在判定需要接收时,将所述当 前目标接收计数器所指向的数据队列的地址中的一个或多个数据按照存储顺序依次进行接收,并在该数据队列的地址中所有数据都接收完成后,将所述当前目标接收计数器的值加1,并将所述当前目标接收计数器的指针指向下一个数据队列以对所述下一个数据队列的地址中的一个或多个数据进行接收,直至所有数据队列的地址中的数据均被接收完成后,将所述当前目标接收计数器的值清零。
所述的数据通信系统与上述的数据通信方法相对于现有技术所具有的优势相同,在此不再赘述。
附图说明
构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为的现有spi的四线制通信模式示意图;
图2为现有spi的四线制通信模式中各信号的波形图;
图3为本发明实施例所述的数据通信方法的流程图;
图4为本发明另一个实施例的数据通信方法的软件流程示意图;
图5为本发明实施例的数据队列缓存原理示意图;以及
图6为本发明实施例的数据通信系统的结构框图。
附图标记说明:
100-数据通信系统、110-数据队列生成模块、120-缓存模块、130-判断模块、140-数据发送模块、150-数据接收模块。
具体实施方式
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
下面将参考附图并结合实施例来详细说明本发明。
图3是根据本发明一个实施例的数据通信方法的流程图。图4是根据本发明另一个实施例的数据通信方法的软件流程示意图。
如图3所示,并结合图4,根据本发明一个实施例的数据标定方法,包括以下步骤:
步骤s1:获取一个或多个数据的地址,并根据一个或多个数据的地址将一个或多个数据构成一个或多个数据队列。其中,一个或多个数据例如为spi数据。
其中,在本发明的一个实施例中,一个或多个数据例如以数据链表的形式构成在一个或多个数据队列。其中,一个或多个数据队列的长度可调。
具体地说,在具体实施例中,依据spi通信的特点,并结合程序设计的需要,本发明的实施例设计了spi数据的数据结构,以结构体的形式,此数据结构包含spi数据的多个属性, 具体为发送数据的地址、接收数据的地址、链表所需下一个数据的地址和接收完成后需调用的返回函数的地址。发送、接收数据的地址是用来存储发送和接收数据,发送数据由主机提供,接收数据来自于从机,需等待每次接收完成后将接收数据写入此数据结构中。下一个数据的地址,是为了将数据队列内的spi数据以链表的形式链接在一起,在spi通信中根据链表指针的前后顺序进行队列化的发送接收操作。
步骤s2:将一个或多个数据队列按照先后顺序依次存入缓存区。
步骤s3:判断是否满足数据发送和接收条件。
步骤s4:如果满足数据发送和接收条件,则将缓存区中的一个或多个数据队列按照先后顺序依次进行发送。
步骤s5:在一个或多个数据队列发送完毕后,按照存储顺序依次接收一个或多个数据队列的地址中的一个或多个数据,并按照存储顺序将一个或多个数据传递至相应数据单元中。
具体地说,本发明的主要目的即实现数据队列的发送和接收。上述过程中所实现了队列化通信,取代现有方案中在程序执行时每个数据需单独的占用一个发送接收循环的机制。本发明的实施例设置了缓存区,以对spi数据进行缓冲存储,按数据队列的存储顺序进行连续的发送接收。在数据队列发送的机制建立之后,可以将大量的发送数据存储在缓存区中,当中断发送的条件(即数据发送和接收条件)满足时,按顺序进行发送。其中,数据队列发送的含义是将数据链接成若干个数据队列,然后按数据队列在缓存区存储的先后顺序进行发送。数据队列的形成是通过数据结构中的下一个数据地址来实现的,通过数据链表可以将内存中放置在不同地址段的数据链接在一起。数据队列接收的机制与发送是类似的,当接收数据接收完成以后,会按照缓存区中的数据队列的存储顺序进行数据的传递,第一个接收数据放入第一个发送数据所在的数据单元中,以此类推。
其中,使用数据链表的方式可以很容易的实现大量数据的队列化存储,数据以数据队列的形式被放置在固定个数的缓存区中,每个数据队列中包含的数据可以是一个或者多个,个数没有限制,编程人员可根据自己的需要进行选择。
其中,数据队列的个数是取决于数据缓存区的长度。在本发明的一个实施例中,上述的一个或多个数据队列的个数与缓存区的个数相同,一个或多个数据队列一一对应地存入一个或多个缓存区。其中,缓存区的个数应该是固定的,即可以同时存放的数据队列的个数是有上限的,其上限就是缓存区的个数。这样的存储方式理论上可以容纳无限多个数据,只要设计合理,可以保证对大量数据的临时存储。存储数据时,仅需将队列的第一个数据的地址存储到缓存区的地址中,队列中的其他数据就会通过地址链接的方式链接到一起,不需进行其他的动作,例如图5所示。其中,固定的缓存区例如是以数组的形式定义的,缓存区实际上是内存中的一段连续的存储空间。
进一步地,数据队列的长度可以自由选择,但是需避免过长或者过短,数据队列过长可能会引起数据处理不及时,数据队列过短可能会导致缓冲区占满,在少量数据的情况下导致存储区溢出。
进一步地,本发明实施例的方法例如还包括:设置当前目标存储计数器、当前目标发送计数器和当前目标接收计数器;在将一个或多个数据队列存入一个或多个缓存区时,首先判断当前目标存储计数器所指向的缓存区的是否为空,并在当前目标存储计数器所指向缓存区不为空时,将一个数据队列存入缓存区,并在存储完成后将当前目标存储计数器的值加1,并将当前目标存储计数器的指针指向下一个缓存区,按照上述存储方式将另一个数据队列存入下一个缓存区,直至所有的数据队列均被存入缓存区中,将当前目标存储计数器的值清零;在发送一个或多个数据队列时,首先判断当前目标发送计数器所指向的数据队列是否为空,并在当前目标发送计数器所指的数据队列不为空时,发送当前目标发送计数器所指向的数据队列,并在发送完成后将当前目标发送计数器的值加1,并将当前发送目标计数器的指针指向下一个数据队列以进行下一个数据队的发送,直至所有的数据队列都发送完成后将当前发送目标计数器的值清零;在接收一个或多个数据队列中的地址的一个或多个数据时,首先判断是否需要接收当前目标接收计数器所指向的数据队列的地址中的一个或多个数据,并在判定需要接收时,将当前目标接收计数器所指向的数据队列的地址中的一个或多个数据按照存储顺序依次进行接收,并在该数据队列的地址中所有数据都接收完成后,将当前目标接收计数器的值加1,并将当前目标接收计数器的指针指向下一个数据队列以对下一个数据队列的地址中的一个或多个数据进行接收,直至所有数据队列的地址中的数据均被接收完成后,将当前目标接收计数器的值清零。
具体地说,在具体实施例中,为了保证数据队列按指定的顺序发送和接收,在程序中需设置一些类似计数器的变量,例如称之为计数器,那么本实施例中就包括当前目标存储的计数器、当前目标发送的计数器和当前目标接收的计数器,这些计数器的值指向目标操作的数据缓存区序号,而每一个序号都对应着一个数据队列。对于缓存区而言,发送的顺序是按照数据队列被存入缓存区的顺序来执行的,而数据队列存入缓存区是按照连续的顺序进行的,所以发送接收在缓存区级别也是按照连续的顺序进行的。而在数据队列的内部,数据发送的顺序也是连续的,按照从第一个数据到最后一个数据的顺序进行发送和接收,这样所有数据的发送接收顺序就全部确定了。因为数据存储、数据发送与数据接收是三个独立的互不影响的过程,所以用三个单独的计数器进行操作。结合图4所示,在数据存储时,首先判断当前目标存储计数器所指向的存储空间是否为空,只有为空的情况下才能写入数据,写入完成后此计数器值加1,指向下一个数据队列的存储空间,如果存储空间的最后一位也已经被放入了数据,则该计数器清零,指向缓存区的第一个存储空间。在发送数据时,如果当前目标发送计数器所指的队列非空时,则进行发送,发送完成后该计数器加1,指向下一个数据队列 的存储空间,当该计数器值达到最大时,表明数据发送完成,在数据发送完成后该计数器清零。在接收数据时,如果需要接收此数据,会将数据存入当前目标接收计数器所指向的数据队列中,当数据队列内的所有数据接收都完成时,会判断是否调用返回函数,同时该目标接收计数器值加1,达到最大值时接收完成后该计数器清零。
需要说明的是,在本发明上述实施例描述的方案中,可能引起溢出的地方有三处:一是在缓存区的数据填充过程中,缓存区所能容纳的数据队列个数是固定的,当实际的数据队列个数超过此固定值时,数据将无法写入,这需要编程人员优化代码,增加队列长度,减少队列的个数;第二是在中断使能之前,如果先使能发送中断,可能会造成发送不断执行,接收在中断未使能的情况下不会进行,从而导致接收数据溢出或者被覆盖,所以在中断使能时,要先使能接收中断,再使能发送中断;第三是在正常的发送接收过程中,有可能会产生发送中断不断的响应,接收中断无法执行的问题,为防止出现这样的情况,在发送中断时,会无条件调用接收中断一次,以避免接收中断因不能及时响应而造成的接收数据溢出或者被覆盖。
进一步地,当调用spi的接口函数进行数据存储完成后,先使能接收中断,再使能发送中断。在程序执行的过程中,如果当前尚有数据未完成接收或者发送,则接收或者发送中断就不会停止使能;而一旦目前中断处于空闲状态,就会终止中断使能,停止中断响应,一直到下一次调用spi接口函数后再次使能。
其中,在一些示例中,在数据发送和数据接收的过程中,分别设定了空闲、开始处理和正在进行这三种状态,spi通信处于不同的操作状态下时,所进行的任务不同。三种状态的转化关系是:空闲→开始处理→正在进行→空闲。在首次进行spi通信或者发送接收处理完成并关闭中断使能之后再次发送接收之前,spi通信将处于空闲的状态,此时spi会关闭中断使能,处于等待中断使能的状态,如果此时调用spi接口函数,中断将会使能;当spi的中断被使能之后,由空闲状态进入开始处理阶段,中断被使能后,在中断服务函数响应时,会根据现在的状态进行一次赋值行为,主要是将目标数据传递给发送或接收中断的内部变量,然后将状态切换到正在进行状态;在正在进行状态时,中断服务子函数会不断的进行发送或者接收,直到存储区内的所有数据都被处理完成,然后将状态切换为空闲,并关闭中断使能。
本发明的实施例中虽然并无专门的策略去保证接收数据的正确,即并没有采取措施专门去确认发送数据和接收数据是否真正对应,但是根据spi的通信特点可以看出,发送数据和接收数据的数目是相同的,因此如果所有的发送数据和接收数据都经过了处理,而且程序可以保证不会发生发送数据和接收数据的溢出或者错误,那么接收数据就不会出现由本发明的实施例引起的错误。
进一步地,在一个或多个数据接收完成后,该方法还包括:调用返回函数对接收到的一 个或多个数据进行相应处理。具体地说,返回函数的作用是为了在中断方式的spi通信中进行接收数据的响应处理,当数据接收完成后,可通过调用返回函数进行数据处理。具体地说,当数据接收完成后,当需要对接收数据进行处理时,可以通过在接收数据完成后调用返回函数来实现。调用返回函数置于接收数据完成之后,这样可以保证数据的正确性。一般情况下,返回函数会被放置于一个队列的最末一位数据上,队列的其他成员数据上不添加返回函数,这样可以保证数据的准确性和数据处理的及时性,在实际的工程应用中可以根据需要灵活配置。
综上,根据本发明实施例的数据通信方法,可以将数据构成的数据队列存储至缓存区,然后按数据队列存储的先后顺序进行发送,无需执行发送后等待接收的动作,从而降低了系统占用,缩短了spi通信中的等待时间,减少了程序执行时间,提升了系统执行效率,而且队列化通信和链表存储的实现方式都具有较好的移植性和对其它通信方式来说非常实用的借鉴意义,且随着单片机系统时钟的提高,对于程序执行效率的提升会更加可观。
进一步地,如图6所示,本发明的实施例公开了一种数据通信系统100,包括:数据队列生成模块110、缓存模块120、判断模块130、数据发送模块140和数据接收模块150。
其中,数据队列生成模块110用于获取一个或多个数据的地址,并根据一个或多个数据的地址将一个或多个数据构成一个或多个数据队列。
其中,在本发明的一个实施例中,一个或多个数据例如以数据链表的形式构成在一个或多个数据队列。其中,一个或多个数据队列的长度可调。
具体地说,在具体实施例中,依据spi通信的特点,并结合程序设计的需要,本发明的实施例设计了spi数据的数据结构,以结构体的形式,此数据结构包含spi数据的多个属性,具体为发送数据的地址、接收数据的地址、链表所需下一个数据的地址和接收完成后需调用的返回函数的地址。发送、接收数据的地址是用来存储发送和接收数据,发送数据由主机提供,接收数据来自于从机,需等待每次接收完成后将接收数据写入此数据结构中。下一个数据的地址,是为了将数据队列内的spi数据以链表的形式链接在一起,在spi通信中根据链表指针的前后顺序进行队列化的发送接收操作。
缓存模块120用于将一个或多个数据队列按照先后顺序依次存入缓存区。
判断模块130用于判断是否满足发送和接收条件。
数据发送模块140用于在满足数据发送和接收条件时,将缓存区中的一个或多个数据队列按照先后顺序依次进行发送。
数据接收模块150用于在一个或多个数据队列发送完毕后,按照存储顺序依次接收一个或多个数据队列的地址中的一个或多个数据,并按照存储顺序将一个或多个数据传递至相应数据单元中。
具体地说,本发明的主要目的即实现数据队列的发送和接收。上述过程中所实现了队列 化通信,取代现有方案中在程序执行时每个数据需单独的占用一个发送接收循环的机制。本发明的实施例设置了缓存区,以对spi数据进行缓冲存储,按数据队列的存储顺序进行连续的发送接收。在数据队列发送的机制建立之后,可以将大量的发送数据存储在缓存区中,当中断发送的条件(即数据发送和接收条件)满足时,按顺序进行发送。其中,数据队列发送的含义是将数据链接成若干个数据队列,然后按数据队列在缓存区存储的先后顺序进行发送。数据队列的形成是通过数据结构中的下一个数据地址来实现的,通过数据链表可以将内存中放置在不同地址段的数据链接在一起。数据队列接收的机制与发送是类似的,当接收数据接收完成以后,会按照缓存区中的数据队列的存储顺序进行数据的传递,第一个接收数据放入第一个发送数据所在的数据单元中,以此类推。
其中,使用数据链表的方式可以很容易的实现大量数据的队列化存储,数据以数据队列的形式被放置在固定个数的缓存区中,每个数据队列中包含的数据可以是一个或者多个,个数没有限制,编程人员可根据自己的需要进行选择。
其中,数据队列的个数是取决于数据缓存区的长度。在本发明的一个实施例中,上述的一个或多个数据队列的个数与缓存区的个数相同,一个或多个数据队列一一对应地存入一个或多个缓存区。其中,缓存区的个数应该是固定的,即可以同时存放的数据队列的个数是有上限的,其上限就是缓存区的个数。这样的存储方式理论上可以容纳无限多个数据,只要设计合理,可以保证对大量数据的临时存储。存储数据时,仅需将队列的第一个数据的地址存储到缓存区的地址中,队列中的其他数据就会通过地址链接的方式链接到一起,不需进行其他的动作,例如图5所示。其中,固定的缓存区例如是以数组的形式定义的,缓存区实际上是内存中的一段连续的存储空间。
进一步地,数据队列的长度可以自由选择,但是需避免过长或者过短,数据队列过长可能会引起数据处理不及时,数据队列过短可能会导致缓冲区占满,在少量数据的情况下导致存储区溢出。
进一步地,本发明实施例的数据通信系统100例如还包括:当前目标存储计数器、当前目标发送计数器和当前目标接收计数器,其中,在将一个或多个数据队列存入一个或多个缓存区时,首先判断当前目标存储计数器所指向的缓存区的是否为空,并在当前目标存储计数器所指向缓存区不为空时,将一个数据队列存入缓存区,并在存储完成后将当前目标存储计数器的值加1,并将当前目标存储计数器的指针指向下一个缓存区,按照上述存储方式将另一个数据队列存入下一个缓存区,直至所有的数据队列均被存入缓存区中,将当前目标存储计数器的值清零;在发送一个或多个数据队列时,首先判断当前目标发送计数器所指向的数据队列是否为空,并在当前目标发送计数器所指的数据队列不为空时,发送当前目标发送计数器所指向的数据队列,并在发送完成后将当前目标发送计数器的值加1,并将当前发送目标计数器的指针指向下一个数据队列以进行下一个数据队的发送,直至所有的数据队列都发 送完成后将当前发送目标计数器的值清零;在接收一个或多个数据队列中的地址的一个或多个数据时,首先判断是否需要接收当前目标接收计数器所指向的数据队列的地址中的一个或多个数据,并在判定需要接收时,将当前目标接收计数器所指向的数据队列的地址中的一个或多个数据按照存储顺序依次进行接收,并在该数据队列的地址中所有数据都接收完成后,将当前目标接收计数器的值加1,并将当前目标接收计数器的指针指向下一个数据队列以对下一个数据队列的地址中的一个或多个数据进行接收,直至所有数据队列的地址中的数据均被接收完成后,将当前目标接收计数器的值清零。
具体地说,在具体实施例中,为了保证数据队列按指定的顺序发送和接收,在程序中需设置一些类似计数器的变量,例如称之为计数器,那么本实施例中就包括当前目标存储的计数器、当前目标发送的计数器和当前目标接收的计数器,这些计数器的值指向目标操作的数据缓存区序号,而每一个序号都对应着一个数据队列。对于缓存区而言,发送的顺序是按照数据队列被存入缓存区的顺序来执行的,而数据队列存入缓存区是按照连续的顺序进行的,所以发送接收在缓存区级别也是按照连续的顺序进行的。而在数据队列的内部,数据发送的顺序也是连续的,按照从第一个数据到最后一个数据的顺序进行发送和接收,这样所有数据的发送接收顺序就全部确定了。因为数据存储、数据发送与数据接收是三个独立的互不影响的过程,所以用三个单独的计数器进行操作。结合图4所示,在数据存储时,首先判断当前目标存储计数器所指向的存储空间是否为空,只有为空的情况下才能写入数据,写入完成后此计数器值加1,指向下一个数据队列的存储空间,如果存储空间的最后一位也已经被放入了数据,则该计数器清零,指向缓存区的第一个存储空间。在发送数据时,如果当前目标发送计数器所指的队列非空时,则进行发送,发送完成后该计数器加1,指向下一个数据队列的存储空间,当该计数器值达到最大时,表明数据发送完成,在数据发送完成后该计数器清零。在接收数据时,如果需要接收此数据,会将数据存入当前目标接收计数器所指向的数据队列中,当数据队列内的所有数据接收都完成时,会判断是否调用返回函数,同时该目标接收计数器值加1,达到最大值时接收完成后该计数器清零。
需要说明的是,在本发明上述实施例描述的方案中,可能引起溢出的地方有三处:一是在缓存区的数据填充过程中,缓存区所能容纳的数据队列个数是固定的,当实际的数据队列个数超过此固定值时,数据将无法写入,这需要编程人员优化代码,增加队列长度,减少队列的个数;第二是在中断使能之前,如果先使能发送中断,可能会造成发送不断执行,接收在中断未使能的情况下不会进行,从而导致接收数据溢出或者被覆盖,所以在中断使能时,要先使能接收中断,再使能发送中断;第三是在正常的发送接收过程中,有可能会产生发送中断不断的响应,接收中断无法执行的问题,为防止出现这样的情况,在发送中断时,会无条件调用接收中断一次,以避免接收中断因不能及时响应而造成的接收数据溢出或者被覆盖。
进一步地,当调用spi的接口函数进行数据存储完成后,先使能接收中断,再使能发送中断。在程序执行的过程中,如果当前尚有数据未完成接收或者发送,则接收或者发送中断就不会停止使能;而一旦目前中断处于空闲状态,就会终止中断使能,停止中断响应,一直到下一次调用spi接口函数后再次使能。
其中,在一些示例中,在数据发送和数据接收的过程中,分别设定了空闲、开始处理和正在进行这三种状态,spi通信处于不同的操作状态下时,所进行的任务不同。三种状态的转化关系是:空闲→开始处理→正在进行→空闲。在首次进行spi通信或者发送接收处理完成并关闭中断使能之后再次发送接收之前,spi通信将处于空闲的状态,此时spi会关闭中断使能,处于等待中断使能的状态,如果此时调用spi接口函数,中断将会使能;当spi的中断被使能之后,由空闲状态进入开始处理阶段,中断被使能后,在中断服务函数响应时,会根据现在的状态进行一次赋值行为,主要是将目标数据传递给发送或接收中断的内部变量,然后将状态切换到正在进行状态;在正在进行状态时,中断服务子函数会不断的进行发送或者接收,直到存储区内的所有数据都被处理完成,然后将状态切换为空闲,并关闭中断使能。
本发明的实施例中虽然并无专门的策略去保证接收数据的正确,即并没有采取措施专门去确认发送数据和接收数据是否真正对应,但是根据spi的通信特点可以看出,发送数据和接收数据的数目是相同的,因此如果所有的发送数据和接收数据都经过了处理,而且程序可以保证不会发生发送数据和接收数据的溢出或者错误,那么接收数据就不会出现由本发明的实施例引起的错误。
进一步地,本发明实施例的数据通信系统100例如还包括调用模块160(图中未示出)。函数调用模块160用于在一个或多个数据接收完成后,用返回函数对接收到的一个或多个数据进行相应处理。具体地说,返回函数的作用是为了在中断方式的spi通信中进行接收数据的响应处理,当数据接收完成后,可通过调用返回函数进行数据处理。具体地说,当数据接收完成后,当需要对接收数据进行处理时,可以通过在接收数据完成后调用返回函数来实现。调用返回函数置于接收数据完成之后,这样可以保证数据的正确性。一般情况下,返回函数会被放置于一个队列的最末一位数据上,队列的其他成员数据上不添加返回函数,这样可以保证数据的准确性和数据处理的及时性,在实际的工程应用中可以根据需要灵活配置。
综上,根据本发明实施例的数据通信系统,可以将数据构成的数据队列存储至缓存区,然后按数据队列存储的先后顺序进行发送,无需执行发送后等待接收的动作,从而降低了系统占用,缩短了spi通信中的等待时间,减少了程序执行时间,提升了系统执行效率,而且队列化通信和链表存储的实现方式都具有较好的移植性和对其它通信方式来说非常实用的借鉴意义,且随着单片机系统时钟的提高,对于程序执行效率的提升会更加可观。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原 则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。