对uart数据进行接收和解析的方法以及装置的制造方法_2

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