提高单片机通讯容错率的系统及其方法与流程

文档序号:12271104阅读:866来源:国知局
提高单片机通讯容错率的系统及其方法与流程

本发明涉及单片机,特别涉及单片机之间的通讯。



背景技术:

现有的常规单片机通讯接收数据方式如,两单片机之间通过UART串口进行通讯,单片机A向单片机B发送一串数据(n个字节),单片机B接收来自单片机A的数据。单片机B接收完一个字节数据后产生一个中断信号,并在中断函数中将接收到的该字节数据保存到接收缓存数组RxBuffer[n]当中,这样单片机B接收完一个字节数据保存一个,接收到的第一个字节数据保存在下标为0的数组元素RxBuffer[0]中,接收到的第二个字节数据保存在下标为1的数组元素RxBuffer[1]中,…,接收到的第n个字节数据保存在下标为n-1的数组元素RxBuffer[n-1]中,直到接收n个字节数据后,当接收到第n+1个字节数据时,将其保存到下标为0的数组元素RxBuffer[0]中,即将接收到的字节数据循环的保存在接收缓存数组RxBuffer[n]当中。

在实际应用当中,由于单片机A和单片机B开始通电时间不一致或其它原因,造成单片机A发送数据的时间比单片机B接收的时间早,即单片机A已经在发送数据,但单片机B还没开始接收。这样,当单片机B开始接收时,就会出现以下三种情况:①单片机B从单片机A发送的第一个字节的第一位开始接收;②单片机B从单片机A发送的第X(2到n的数)个字节的第一位开始接收;③单片机B从单片机A发送的第Y(1到n的数)个字节的非第一位开始接收。前三种情况,情况①单片机B接收并保存到接收缓存数组RxBuffer[n]中的数据和单片机A发送的数据一致,通讯正常;情况②和③单片机B接收并保存到接收缓存数组RxBuffer[n]中的数据和单片机A发送的数据不一致,通讯错误,造成整个系统不能正常工作。通过采用本发明中的通讯方法,将有效消除情况②和③带来的错误影响,保证整个系统正常工作。



技术实现要素:

本发明所要解决的技术问题,就是提供一种提高单片机通讯容错率的系统及其方法以实现解决由于各单片机之间通电时间不一致或其它原因,造成单片机通讯接收数据错误的问题。

本发明解决所述技术问题,采用的技术方案是,提高单片机通讯容错率的系统,包括待通讯的单片机,待通讯的单片机之间建立UART串口通讯,其特征在于,所述待通讯的单片机各自内部设置有间隔定时器;

所述间隔定时器,用于产生定时中断并计数,当产生一个定时中断,则计数变量g_cnt1ms值增加1,当计数变量g_cnt1ms到达预设值T1时,即使再产生定时中断,计数变量g_cnt1ms值也不用再增加;

当系统检测到串口接收中断信号产生时,判断计数变量g_cnt1ms值是否大于T2,其中,T2<T1;当计数变量g_cnt1ms值大于T2时,系统将接收缓存数组RxBuffer[i]的下标i置0后,将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData;如果计数变量g_cnt1ms值不大于T2,则判断接收缓存数组的下标i是否大于或等于接收缓存数组元素个数n,如果i>=n,则将接收缓存数组的下标i置0,再将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData;再将接收缓存数组下标i值增加1,即i++,并将计数变量g_cnt1ms值清零后,重复检测串口接收终端信号的产生。

具体的,所述待通讯的单片机至少为两个。

进一步的,所述待通讯的单片机之间建立UART串口通讯包括:待通讯的单片机一的UART0串口管脚TXD0与待通讯的单片机二的UART0串口管脚RXD0相连接,待通讯的单片机一的UART0串口管脚RXD0与待通讯的单片机二的UART0串口管脚TXD0相连接。

提高单片机通讯容错率的方法,包括以下步骤:

步骤1,单片机上电后系统对接收缓存数组RxBuffer[i]、数组下标i、计数变量g_cnt1ms、UART0串口和间隔定时器进行初始化,并启动UART0串口和间隔定时器,其中i≦n,n为缓存数组元素个数;

步骤2,系统监测是否有中断信号产生,是则进入步骤3;否则,重复步骤2;

步骤3,系统检测中断信号,若中断信号为串口接收中断信号,则进入步骤4;若中断信号为间隔定时中断信号,系统检测计数变量g_cnt1ms值是否小于预设值T1,如果计数变量g_cnt1ms值小于T1,则计数变量g_cnt1ms值增加1,即g_cnt1ms++,重复步骤3;如果计数变量g_cnt1ms值大于或等于T1,则重复步骤2;

步骤4,系统判断计数变量g_cnt1ms值是否大于T2,是则系统将接收缓存数组的下标i置0,进入步骤5;否则系统判断接收缓存数组RxBuffer[i]的下标i是否大于或等于数组元素个数n,如果i>=n,则将接收缓存数组的下标i置0,再进入步骤5;

步骤5,系统将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData;然后,将接收缓存数组下标i值增加1,即i++,并将计数变量g_cnt1ms值清零后重复步骤2。

本发明的有益效果是:单片机之间通讯采用间隔定时器中断计数和UART串口通讯相结合的通讯方式进行通讯,处于接收方的单片机无论是在待接收的通讯数据串(第一串数据)的起始数据、中间数据还是末尾数据,及待接收的通讯数据串(第一串数据)的任意时刻开始接收,都能够保证在接收到以后通讯数据串(第二及以后数据串),使接收并保存到接收缓存数组中的数据和待接收的通讯数据串(第二及以后数据串)保持一致。从而提高了单片机通讯容错率,提高了单片机通讯的可靠性。

附图说明

图1为本发明实施例中单片机A与单片机B通讯连接电路原理图。

图2为本发明实施例中常规单片机通讯接收数据流程图。

图3为本发明实施例中本发明单片机通讯接收数据流程图。

图4为本发明实施例中通讯数据波形图。

以下结合实施例的具体实施方式,对本发明的上述内容再作进一步的详细说明。但不应将此理解为本发明上述主题的范围仅限于以下的实例。在不脱离本发明上述技术思想情况下,根据本领域普通技术知识和惯用手段做出的各种替换或变更,均应包括在本发明的范围内。

具体实施方式

下面结合附图及实施例详细描述本发明的技术方案:

本发明针对现有技术中由于各单片机之间通电时间不一致或其它原因,造成单片机通讯接收数据错误的问题,提供一种提高单片机通讯容错率的系统,包括待通讯的单片机,待通讯的单片机之间建立UART串口通讯,所述待通讯的单片机各自内部设置有间隔定时器;所述间隔定时器,用于产生定时中断并计数,当产生一个定时中断,则计数变量g_cnt1ms值增加1,当计数变量g_cnt1ms到达预设值T1时,即使再产生定时中断,计数变量g_cnt1ms值也不用再增加;当系统检测到串口接收中断信号产生时,判断计数变量g_cnt1ms值是否大于T2,其中,T2<T1;当计数变量g_cnt1ms值大于T2时,系统将接收缓存数组RxBuffer[i]的下标i置0后,将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData;如果计数变量g_cnt1ms值不大于T2,则判断接收缓存数组的下标i是否大于或等于接收缓存数组元素个数n,如果i>=n,则将接收缓存数组的下标i置0,再将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData;再将接收缓存数组下标i值增加1,即i++,并将计数变量g_cnt1ms值清零后,重复检测串口接收终端信号的产生。提高单片机通讯容错率的方法,首先,单片机上电后系统对接收缓存数组RxBuffer[i]、数组下标i、计数变量g_cnt1ms、UART0串口和间隔定时器进行初始化,并启动UART0串口和间隔定时器,其中i≦n,n为缓存数组元素个数;其次,系统监测是否有中断信号产生,是则系统检测中断信号,否则,重复监测是否有中断信号产生;若中断信号为串口接收中断信号,系统判断计数变量g_cnt1ms值是否大于T2,是则系统将接收缓存数组的下标i置0,将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData;然后,将接收缓存数组下标i值增加1,即i++,并将计数变量g_cnt1ms值清零后重复监测是否有中断信号产生;否则系统判断接收缓存数组RxBuffer[i]的下标i是否大于或等于数组元素个数n,如果i>=n,则将接收缓存数组的下标i置0,再将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData;然后,将接收缓存数组下标i值增加1,即i++,并将计数变量g_cnt1ms值清零后重复监测是否有中断信号产生;若中断信号为间隔定时中断信号,系统检测计数变量g_cnt1ms值是否小于预设值T1,如果计数变量g_cnt1ms值小于T1,则计数变量g_cnt1ms值增加1,即g_cnt1ms++,重复步骤3;如果计数变量g_cnt1ms值大于或等于T1,则重复监测是否有中断信号产生。单片机之间通讯采用间隔定时器中断计数和UART串口通讯相结合的通讯方式进行通讯,处于接收方的单片机无论是在待接收的通讯数据串(第一串数据)的起始数据、中间数据还是末尾数据,及待接收的通讯数据串(第一串数据)的任意时刻开始接收,都能够保证在接收到以后通讯数据串(第二及以后数据串),使接收并保存到接收缓存数组中的数据和待接收的通讯数据串(第二及以后数据串)保持一致。从而提高了单片机通讯容错率,提高了单片机通讯的可靠性。

实施例1

本例结合附图1及附图2详细阐述本发明提高单片机通讯容错率的系统及其工作方法。

本例以两个单片机为例,即单片机A和单片机B,分别通过各自的UART串口相连接。如图1所示,单片机A的UART0串口管脚TXD0与单片机B的UART0串口管脚RXD0相连接,单片机A的UART0串口管脚RXD0与单片机B的UART0串口管脚TXD0相连接,组成通讯电路。当单片机A向单片机B发送数据时,单片机A通过UART0串口管脚TXD0发送数据给单片机B,单片机B通过UART0串口管脚RXD0接受来自单片机A的数据。同理,当单片机B向单片机A发送数据时,单片机B通过UART0串口管脚TXD0发送数据给单片机A,单片机A通过UART0串口管脚RXD0接受来自单片机B的数据。如果单独采用这种通讯方式,当单片机A向单片机B发送数据时,由于单片机A和单片机B开始通电时间不一致或其它原因,单片机A已经在发送数据,但单片机B还没开始接收,造成单片机B接收并保存到接收缓存数组RxBuffer[n]中的数据和单片机A发送的数据不一致的情况。

为了解决上述问题,本例在单片机内部开通一个间隔定时器,用于计数。单片机内部开通一个间隔定时器,定时时间为t,当累计时间到达t时,单片机产生一个定时中断,响应定时中断程序用于计数,当产生一个定时中断,则计数变量g_cnt1ms值增加1,当计数变量g_cnt1ms到达指定值T1时,即使再产生定时中断,计数变量g_cnt1ms值也不用再增加。也就是说T1是由用户根据自身需求设置的一个最大值。

所述UART串口通讯具体是指,单片机发送数据时,将数据存入TXD0寄存器中后,单片机自动将数据通过TXD0管脚发送出去,发送完一个字节后,产生一个发送中断信号。单片机接收数据时,单片机从RXD0管脚接收数据,并将数据存入RXD0寄存器中,接收完一个字节后产生一个接收中断信号。

所述间隔定时器中断技术与UART串口通讯接收中断相结合进行通讯。如图3所示,RxBuffer[n]是一个接收缓存数组,用于存放接收到的通讯数据。n是接收缓存数组元素个数。i是接收缓存数组下标,值为0到(n-1)的整数。g_cnt1ms时用于计算累计时间的变量。UART0_init()是通讯串口UART0初始化函数,通过此函数可以设置通讯波特率及其它通讯规则。UART0_start()是通讯启动函数。TIIMER_1ms_init()是定时器初始化函数,通过此函数可以设置定时器时间。TIIMER_1ms_start是定时器计数启动函数。T1、T2是指定的累计计数时间常量,T2<T1。RxData是UART0串口接收寄存器中接收到的数据。

具体工作流程包括以下步骤:

步骤1,单片机上电后系统对接收缓存数组RxBuffer[i]、数组下标i、计数变量g_cnt1ms、UART0串口和间隔定时器进行初始化,并启动UART0串口和间隔定时器,其中i≦n,n为缓存数组元素个数;即:

RxBuffer[n]={0};i=0;g_cnt1ms=0;UART0_init();UART0_start();TIIMER_1ms_init();TIIMER_1ms_start()。

步骤2,系统监测是否有中断信号产生,是则进入步骤3;否则,重复步骤2;

步骤3,系统检测中断信号,若中断信号为串口接收中断信号,则进入步骤4;若中断信号为间隔定时中断信号,系统检测计数变量g_cnt1ms值是否小于预设值T1,如果计数变量g_cnt1ms值小于T1,则计数变量g_cnt1ms值增加1,即g_cnt1ms++,重复步骤3;如果计数变量g_cnt1ms值大于或等于T1,则重复步骤2;

步骤4,系统判断计数变量g_cnt1ms值是否大于T2,是则系统将接收缓存数组的下标i置0,进入步骤5;否则系统判断接收缓存数组RxBuffer[i]的下标i是否大于或等于数组元素个数n,如果i>=n,则将接收缓存数组的下标i置0,再进入步骤5;

步骤5,系统将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData;然后,将接收缓存数组下标i值增加1,即i++,并将计数变量g_cnt1ms值清零后重复步骤2。

实施例2

本实施例将通过对现有常规单片机通讯接收数据方式和本发明单片机通讯接收数据方式进行比较,来对本发明进行阐述。

如图1、2、3、4所示,本例中包括单片机A、单片机B,单片机A发送数据,单片机B接收数据。单片机A发送数据一串长度为4个字节,共发送三串数据:第一串数据为A1H、01H、E0H、DBH,第二串数据为A2H、02H、D2H、CAH,第二串数据为A3H、03H、B4H、AFH。通讯波特率为9600bps,每一串数据通讯间隔为100ms。单片机B中接收缓存数据长度为4,即n=4。T1=30,T2=20。选择串口UART0作为通讯接收/发送口。间隔定时器定时时间t设置为1ms,即1ms产生一次定时中断信号。

一、常规单片机通讯接收数据通讯方式

如2所示,该通讯方式原理是:首先上电初始化并启动通讯接收,当串口UART0接收到数据时产生通讯中断信号,判断接收缓存数组下标i是否大于或等于n,如果接收缓存数组下标i大于或等于n,即i>=n,则将接收缓存数组下标i置0,即i=0;然后将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData,接收缓存数组下标i值增加1,即i++。最后继续监测是否串口UART0接收到数据产生通讯中断信号。如果接收缓存数组下标i小于n,则将UART0串口接收寄存器中接收到的数据RxData,存入到数组下标为i的接收缓存数组元素RxBuffer[i]中,即RxBuffer[i]=RxData,接收缓存数组下标i值增加1,即i++。最后继续监测是否串口UART0接收到数据产生通讯中断信号。

如图4所示,由于单片机A和单片机B开始通电时间不一致或其它原因,出现图4中的三种情况。常规单片机通讯接收数据通讯方式,单片机B接收数据情况如下:

情况一:单片机B从单片机A发送的第一串数据的第一个字节的第一位开始接收,单片机B接收到的第一个字节数据为A0H,保存在缓存数组RxBuffer[0]中;单片机B接收到的第二个字节数据为01H,保存在缓存数组RxBuffer[1]中;单片机B接收到的第三个字节数据为E0H,保存在缓存数组RxBuffer[2]中;单片机B接收到的第四个字节数据为DBH,保存在缓存数组RxBuffer[3]中。100ms后单片机B接收单片机A发送的第二串数据,如图2的通讯原理可知,直到单片机B接收完第二串数据后,单片机B中缓存数组RxBuffer[]中的数据为A2H、02H、D2H、CAH,与单片机A发送的第二串数据一致,说明通讯正确。

情况二:单片机B从单片机A发送的第一串数据的第二个字节的第一位开始接收,单片机B接收到的第一个字节数据为01H,保存在缓存数组RxBuffer[0]中;单片机B接收到的第二个字节数据为E0H,保存在缓存数组RxBuffer[1]中;单片机B接收到的第三个字节数据为DBH,保存在缓存数组RxBuffer[2]中。100ms后,单片机B接收单片机A发送的第二串数据,单片机B接收到的第四个字节数据是单片机A发送的第二串数据的第一个字节数据为A2H,保存在缓存数组RxBuffer[3]中。如图2的通讯原理可知,…,直到单片机B接收完第二串数据后,单片机B中缓存数组RxBuffer[]中的数据为02H、D2H、CAH、A2H,与单片机A发送的第二串数据不同,说明通讯错误。按此通讯方式继续接收,则缓存数组RxBuffer[]的第4号元素将由数据A2H变为A3H,即单片机A发送的第三串数据中的第一个数据。如此,单片机B将接收不到与单片机A发送相同的数据串。

情况三:单片机B从单片机A发送的第一串数据的第四个字节的第四位开始接收,单片机B接收到的第一个字节数据为FFH,保存在缓存数组RxBuffer[0]中;100ms后,单片机B接收单片机A发送的第二串数据,单片机B接收到的第二个字节数据是单片机A发送的第二串数据的第一个字节数据为A2H,保存在缓存数组RxBuffer[1]中;单片机B接收到的第三个字节数据是单片机A发送的第二串数据的第二个字节数据为02H,保存在缓存数组RxBuffer[2]中。如图2的通讯原理可知,…,直到单片机B接收完第二串数据后,单片机B中缓存数组RxBuffer[]中的数据为CAH、A2H、02H、D2H,与单片机A发送的第二串数据不同,说明通讯错误。按此通讯方式继续接收,则缓存数组RxBuffer[]的第2号元素将由数据A2H变为A3H,即单片机A发送的第三串数据中的第一个数据。如此,单片机B将接收不到与单片机A发送相同的数据串。

因此,采用常规单片机通讯接收数据通讯方式,只有情况一单片机A和单片机B之间能保持正常通讯。情况二和情况三,单片机A和单片机B之间都不能正常通讯。

二、本发明单片机通讯接收数据方式

如图3所示,根据本发明单片机通讯接收数据方式的原理可知:单片机接收到数据后,将接收到的数据保存到接收缓存数组RxBuffer[]中,同时将计数变量g_cnt1ms值置0。如果单片机长时间没有接收到数据,则计数变量g_cnt1ms将累加直到T1(30)值,当长时间后g_cnt1ms值大于T2(20)单片机再次接收到数据后,将接收到的数据保存到接收缓存数组RxBuffer[]中的第一号元素RxBuffer[0]中。其中,T1及T2的值均由用户根据具体需求进行自行设置,需要注意的是T2<T1。

同样以图4中的三种情况为例,通过本发明单片机通讯接收数据通讯方式,单片机B接收数据情况如下:

情况一:单片机B从单片机A发送的第一串数据的第一个字节的第一位开始接收,单片机B接收到的第一个字节数据为A0H,保存在缓存数组RxBuffer[0]中;单片机B接收到的第二个字节数据为01H,保存在缓存数组RxBuffer[1]中;单片机B接收到的第三个字节数据为E0H,保存在缓存数组RxBuffer[2]中;单片机B接收到的第四个字节数据为DBH,保存在缓存数组RxBuffer[3]中。100ms后单片机B接收单片机A发送的第二串数据,如图4的通讯原理可知,直到单片机B接收完第二串数据后,单片机B中缓存数组RxBuffer[]中的数据为A2H、02H、D2H、CAH,与单片机A发送的第二串数据一致,说明通讯正确。

情况二:单片机B从单片机A发送的第一串数据的第二个字节的第一位开始接收,单片机B接收到的第一个字节数据为01H,保存在缓存数组RxBuffer[0]中;单片机B接收到的第二个字节数据为E0H,保存在缓存数组RxBuffer[1]中;单片机B接收到的第三个字节数据为DBH,保存在缓存数组RxBuffer[2]中。100ms后,单片机B接收单片机A发送的第二串数据。如图4的通讯原理可知,由于单片机B在100ms没有接收到数据,计数变量g_cnt1ms值将变为T1=30,计数变量g_cnt1ms值大于T2=20,因此,单片机B接收单片机A发送的第二串数据的第一个字节数据为A2H,保存在缓存数组RxBuffer[0]中;单片机B接收单片机A发送的第二串数据的第二个字节数据为02H,保存在缓存数组RxBuffer[1]中;单片机B接收单片机A发送的第二串数据的第三个字节数据为D2H,保存在缓存数组RxBuffer[2]中;单片机B接收单片机A发送的第二串数据的第四个字节数据为CAH,保存在缓存数组RxBuffer[3]中。直到单片机B接收完第二串数据后,单片机B中缓存数组RxBuffer[]中的数据为A2H、02H、D2H、CAH,与单片机A发送的第二串数据一致,说明通讯正确。

情况三:单片机B从单片机A发送的第一串数据的第四个字节的第四位开始接收,单片机B接收到的第一个字节数据为FFH,保存在缓存数组RxBuffer[0]中;100ms后,单片机B接收单片机A发送的第二串数据。如图4的通讯原理可知,由于单片机B在100ms没有接收到数据,计数变量g_cnt1ms值将变为T1=30,计数变量g_cnt1ms值大于T2=20,因此,单片机B接收单片机A发送的第二串数据的第一个字节数据为A2H,保存在缓存数组RxBuffer[0]中;单片机B接收单片机A发送的第二串数据的第二个字节数据为02H,保存在缓存数组RxBuffer[1]中;单片机B接收单片机A发送的第二串数据的第三个字节数据为D2H,保存在缓存数组RxBuffer[2]中;单片机B接收单片机A发送的第二串数据的第四个字节数据为CAH,保存在缓存数组RxBuffer[3]中。直到单片机B接收完第二串数据后,单片机B中缓存数组RxBuffer[]中的数据为A2H、02H、D2H、CAH,与单片机A发送的第二串数据一致,说明通讯正确。

因此,采用本发明单片机通讯接收数据通讯方式后,以上三种情况,单片机B都能够正确接收来自单片机A的数据。也就是说,单片机B无论从何时刻开始接收数据,即使接收到第一串数据是错误的,也能保证接收到的第二串数据及以后的数据串是正确的。

综上所述,单片机之间通讯采用间隔定时器中断计数和UART串口通讯相结合的通讯方式进行通讯,处于接收方的单片机无论是在待接收的通讯数据串(第一串数据)的任意时刻开始接收,都能够保证在接收到以后通讯数据串(第二及以后数据串),使接收并保存到接收缓存数组中的数据和待接收的通讯数据串(第二及以后数据串)保持一致。从而提高了单片机通讯容错率,提高了单片机通讯的可靠性。从而保证通讯正常,使整个系统正常工作。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1