提高串口数据接收正确性的方法和装置的制造方法_2

文档序号:9687387阅读:来源:国知局
[0049]步骤S104:检测UART中断标记,若检测到UART中断标记,则转至步骤S102。
[0050]清除UART中断标记后,并不会立即退出UART中断处理函数,而是继续检测UART中断标记,来判断UART端口是否接收到了新的数据,如果检测到UART中断标记的话,则证明UART端口接收到了新的数据,此时继续读取UART缓存中的数据到内存中,直至数据接收完成;如果没有检测到UART中断标记的话,则证明UART端口没有接收到新的数据,此时进行后续操作,可以是退出UART中断处理函数,也可以是其他操作。
[0051]在有的处理器中,UART模块除了可以通过UART中断标记来检查UART缓存中是否有数据外,某些状态寄存器中的值也能用来判断UART缓存中是否有数据,这并不影响本发明的内容。
[0052]与现有技术相比,本发明的提高串口数据接收正确性的方法中,在进入UART中断处理函数后,开始读取UART缓存中的数据到内存中,接收完成后,并不立刻退出,而是重新检测UART端口是否接收到了新的数据,如果接收到的话,继续读取UART缓存中的数据到内存中,直至数据接收完成。
[0053]本发明的提高串口数据接收正确性的方法降低了微控制器的工作负荷。本发明只需进入UART中断一次,就能完成串口数据的接收,微控制器不需要不断的中断当前操作、保持中断现场、执行中断处理函数、然后退出中断、恢复中断现场,这就降低了微控制器的工作负荷。
[0054]本发明的提高串口数据接收正确性的方法不会对微控制器当前进行的操作造成不利影响。由于本发明的方法在接收串口数据的时候,一次中断即可完成,不用频繁的进出中断从而影响到其它的操作,不会对整体程序的正常执行造成影响。
[0055]本发明的提高串口数据接收正确性的方法提高了软件的运行速度和运行效率。微控制器不用频繁的进出UART中断,不用将资源消耗到了保存中断现场、恢复中断现场上,减少了微控制器的一些无谓的工作开销,大大提高了微控制器的使用效率,从而大大提高了整体代码的执行速度和执行效率,提高了软件的运行速度和运行效率。
[0056]本发明的提高串口数据接收正确性的方法提高了数据接收的正确性。本发明在进入UART中断后,在中断函数内循环接收串口数据,直至串口数据接收完成,从而提高了串口数据接收的准确性。不会出现现有技术中的如下现象:如果一次中断发生后UART缓存中的数据被读取后,而此时微控制器还没有来的及退出UART中断处理函数时候,又有新数据被UART接口接收的话,此时将会造成这部分数据的丢失。
[0057]另外,发明人还发现,本发明的提高串口数据接收正确性的方法降低了系统的功耗。频繁的进出UART中断,将会使微控制器的工作负荷非常的大,从而使系统的功耗也非常的高。而通过本发明中的方法,降低了微控制器的工作负荷,从而在一定程度上降低了系统的功耗。
[0058]故本发明的提高串口数据接收正确性的方法降低了微控制器的工作负荷,不会对微控制器当前进行的操作造成不利影响,提高了软件的运行速度和运行效率,提高了数据接收的正确性,以及降低了系统的功耗。
[0059]作为本发明的提高串口数据接收正确性的方法的一种改进,如图5所示,步骤S104进一步为:检测UART中断标记,若检测到UART中断标记,则转至步骤S102,否则转至步骤S201 ;
[0060]方法还包括:
[0061]步骤S201:启动定时器,设置定时时间;
[0062]步骤S202:判断定时时间是否到,若是,转至步骤S203,否则,继续执行步骤S102 ;
[0063]步骤S203:检测UART中断标记,若检测到UART中断标记,则转至步骤S102,否则退出UART中断处理函数。
[0064]当未检测UART中断标记,没有接收到数据时,不立即退出UART中断处理函数,而是定时一段时间后再检测UART中断标记,若此时检测到UART中断标记,则表明数据传输未完成,继续执行前面的接收数据的过程,若此时没有检测到UART中断标记,则表明数据传输已经完成,退出UART中断处理函数。若没有定时环节,有可能在数据未接收完毕时就退出了 UART中断处理函数,此时有新的数据传来后,还需要再次进入UART中断处理函数。通过定时可以进一步减少进出UART中断处理函数的次数
[0065]故本发明的提高串口数据接收正确性的方法进一步降低了微控制器的工作负荷,更加不会对微控制器当前进行的操作造成不利影响,进一步提高了软件的运行速度和运行效率,进一步提高了数据接收的正确性,以及进一步降低了系统的功耗。
[0066]上述定时时间可以为串口接收一帧数据的时间的倍数。
[0067]异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。
[0068]数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10 X 120 = 1200字符/秒=1200波特(即1200bps)。
[0069]UART的数据传输格式如图3所示,(其中,LSB是least significant bit的缩写,中文为最低有效位;MSB是Most Significant Bit的缩写,中文为最高有效位,LSB的前一位),其中各位的意义如下:
[0070]起始位(图中为LSB的前一位):先发出一个逻辑0信号,表不传输字符的开始。
[0071]数据位(图中为LSB、MSB以及它们之间的各个位):可以是5?8位逻辑0或1。如ASCII码(7位),扩展BCD码(8位)。使用小端模式传输。(小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。)
[0072]校验位(图中为MSB的后一位):数据位加上这一位后,使得1的位数应为偶数(偶校验)或奇数(奇校验)。
[0073]停止位(图中为校验位的后一位):它是一个字符数据的结束标志。可以是1位、
1.5位、2位的高电平。
[0074]空闲位(图中为停止位的后一位):处于逻辑1状态,表示当前线路上没有资料传送。
[0075]注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。
[0076]本发明假设UART通讯波特率为Bau,一帧数据由S个bit组成,
[0077]则一秒钟UART端口所接收的帧数FR = Bau/S,那么每帧数据传输的周期CY = 1/FR(秒),本发明设置定时时间Time = n*CY(其中η为整数,可以根据实际应用确定),即如果连续η帧时间内UART端口没有再收到到数据的话,就认为该次接收行为后续再无数据,本次接收完成。
[0078]这样设置定时时间既可以保证在数据未接收完毕时就退出了 UART中断处理函数的情况不会发生,又不会使微处理器等待时间过长而浪费时间,提高了微处理器的工作效率。
[0079]优选的,定时时间可以为10-500ms,具体的:在应用中,UART常用的最低的波特率为9600bps,以一帧为8bit,经过实际测试,选择10倍帧率的延时时间最为合适(即η =10),Time = 1/ (9600/8) *10 = 8.3ms,考虑一定的余量,Time = 10ms);
[0080]作为本发明的提高串口数据接收正确性的方法的另一种改进,如图6所示,步骤S104进一步为:检测UART中断标记,若检测到UART中断标记,则转至步骤S102,否则转至步骤S501 ;
[0081]方法还包括:
[0082]步骤S501:设置计数变量的初值以及预设值;
[0083]步骤S502:检测UART中断标记,若检测到UART中断标记,则转至步骤S102,否则转至步骤S503。
[0084]步骤S503:使计数变量自加或自减;
[0085]步骤S504:判断计数变量的值是否等于预设值,若是,退出UART中断处理函数,否贝1J,转至步骤S502 ;
[0086]当未检测UART中断标记,没有接收到数据时,不立即退出UART中断处理函数,而是继续检测UART中断标记一定次数(该次数由计
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1