CN102546843B - 一种通过软件模拟实现多个uart通信接口的方法 - Google Patents
一种通过软件模拟实现多个uart通信接口的方法 Download PDFInfo
- Publication number
- CN102546843B CN102546843B CN201210013739.7A CN201210013739A CN102546843B CN 102546843 B CN102546843 B CN 102546843B CN 201210013739 A CN201210013739 A CN 201210013739A CN 102546843 B CN102546843 B CN 102546843B
- Authority
- CN
- China
- Prior art keywords
- data
- timer
- communication interfaces
- software
- uart communication
- 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.)
- Active
Links
Landscapes
- Communication Control (AREA)
Abstract
本发明涉及一种嵌入式系统中通过软件模拟实现UART通信接口数据的发送和接收的处理方法。本发明的通过软件模拟实现多个UART通信接口的方法,包括数据接收方法和数据发送方法,利用定时器的定时中断功能实现精确的波特率定时,发送和接收都在定时中断的控制之下进行。本发明中模拟一个UART通信接口仅需要1个定时器,2个I/O端口,1个软件中断。模拟多个UART通信接口可以共用一个定时器和一个软件中断,因此,每增加扩展一个UART通信接口,仅需要增加2个I/O端口。本发明应用于软件模拟实现UART通信接口。
Description
技术领域
本发明涉及一种软件模拟实现UART通信的方法,特别是涉及一种嵌入式系统中通过软件模拟实现UART通信接口数据的发送和接收的处理方法。
背景技术
随着嵌入式技术发展和嵌入式设备的多样化,由嵌入式设备构成的多机系统取得了长足的发展,多个嵌入式设备之间以串行口UART(Universal Asynchronous Receiver/Transmitter,通用异步接收和发送器)进行数据传输,构成复杂的主从式通讯网。
在实际应用中,经常遇到一个主机设备需要同时连接各种不同的从机设备,而主机设备与从机设备之间的通信方式经常采用UART通信接口,UART通信接口只能一对一通信,不能多个通信接口并接在一起通信,以往的实现方式:1.在设计开发主机设备时选择具有多路UART通信接口的微处理器,而实际上具有多路UART通信接口的微处理器的型号比较少,带来器件选型上的限制,而且比较昂贵,增加产品成本;2.采用串口扩展芯片实现,如ST16C550、ST16C554、SP2538、MAX3110等,虽然成本较高,但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统;3.采用分时切换的方法将一个串口扩展与多个串口设备通信,分时复用的方法成本低,但只适用于数据量不大的场合,并且只能由这个单片机主动和多个设备通信,实时性差;4.用软件模拟的方法扩展串口,其优势是成本低、实时性好,但需要占用一些CPU时间。
例如申请号为200710172965.9的发明提供了基于无线通信模块的软件模拟UART的方法,该方法包括中断处理方法、位于中断处理方法流程末端的数据发送方法和数据接收方法,该发明使用2个普通的I/O和一个定时器来实现,且带FIFO功能,扩展模拟UART的收发数据在中断服务中完成。但其实现方法存在多个缺点,1.判断数据起始位的方法是采用中断定时采样监测方式,中断定时间隔为波特率定时间隔的1/3,以3倍的波特率对接收数据进行采样监测,这样导致定时器中断过于频繁,而且在无数据收发的情况下也需要定时采样监测通信总线是否有数据,耗费系统资源;2.每次采样的位数据都是采集位的末尾位置,数据接收的容错性差,准确率低,因为在定时器精度较低或对方发送的位数据宽度误差较大的情况下,会出现采集错位导致接收数据出错;3.按照该方案描述,在发送数据时,将定时进行3分频,中断定时间隔等于波特率间隔,这样每一次定时中断就发送一位,从而可以看出,在发送数据过程中无法以3倍的波特率定时频率对接收数据进行采样监测,无法实现数据接收,因此,无法达到全双工数据收发通信模式;4.当模拟多个UART通信接口且各通信接口波特率不同时,每一个通信接口都需要有一个定时器,无法实现多个UART通信接口共享一个定时器,因此可模拟的UART通信接口个数受限于微处理器的定时器个数,而通常情况下微处理器的定时器个数都是比较少的;5.当一个字节的数据接收完毕后在定时器中断服务程序中将接收数据存储到接收FIFO队列,这样将导致定时器中断服务程序执行时间过长,降低系统的准确度,降低最高可支持的通信波特率。
发明内容
本发明所要解决的技术问题是,提供一种通过软件模拟实现多个UART通信接口的方法,在同等系统主频和硬件资源条件下提高通信波特率、提升通信准确率,实现真正全双工通信,并可扩展多个UART通信接口,满足各种不同通信波特率的要求,解决UART通信接口不足问题,降低产品成本,提高产品竞争力。
为解决上述技术问题,本发明的思路是:在硬件方面,使用1个定时器和2个I/O端口,利用定时器的定时中断功能实现精确的波特率定时,发送和接收都在定时中断的控制之下进行。数据发送的思想是:当启动字节发送时,通过发送管脚TXD先发起始位,然后发数据位和奇偶效验位,最后再发停止位,发送过程由发送状态机控制,每次中断根据计算延时计数器到期只发送1个位,经过若干个定时中断完成1个字节数据的发送。数据接收的思想是,当不在字节数据接收过程时,将接收管脚RXD配置成I/O低电平中断方式,监测起始位,当检测到起始位,则开始启动一次字节数据接收,字节数据接收过程由接收状态机控制,每次中断根据计算延时计数器到期接收1个位,经过若干个定时中断完成1个字节数据的接收。为了提高串口的性能,在发送和接收上都实现了FIFO功能,提高通信的实时性。
具体的,本发明所采用的技术方案是:一种通过软件模拟实现多个UART通信接口的方法,包括数据接收方法和数据发送方法,其中数据接收方法包括以下步骤:
配置芯片一I/O管脚为接收管脚RXD的步骤:将接收管脚RXD配置为低电平中断模式并打开I/O中断使能;
实时监测接收管脚RXD接收数据的步骤:当接收到数据时,首先检测该数据的起始位,如果起始位为高电平则继续实时监测,如果起始位为低电平,则触发接收管脚RXD发生I/O低电平中断;
I/O低电平中断处理步骤:配置接收管脚RXD为通用I/O输入模式并关闭I/O中断使能,启动定时器,启动字节数据接收,其中所述定时器的定时时间间隔设置为多个UART通信接口中最高波特率的位时长的1/n(n≥2),即定时器中断频率为多个UART通信接口中最高波特率的n(n≥2)倍,定时器的定时时间到时触发定时器中断;优选的,其中n的取值为2;
定时器中断处理步骤:根据定时器定时中断接收数据,每次中断根据计算延时计数器到期接收一个位,经过若干个定时中断完成1个字节数据的接收,并判断接收到的字节的有效性,如果接收到的字节无效则返回“配置芯片一I/O管脚为接收管脚RXD的步骤”,如果接收到的字节有效则首先触发软件中断,执行软件中断处理步骤,然后再返回“配置芯片一I/O管脚为接收管脚RXD的步骤”,退出定时器中断后进入软件中断,在软件中断中存储接收的字节数据;
软件中断处理步骤:将接收到的有效字节数据存储到接收FIFO缓存队列中;
数据发送方法包括以下步骤:
配置芯片另一I/O管脚为发送管脚TXD的步骤:将发送管脚TXD配置为通用I/O输出模式;准备发送数据的步骤:将待发送的数据存储到发送FIFO缓存队列中,触发软件中断;
软件中断处理步骤:获取发送FIFO缓存队列中字节数据,启动字节数据发送,并按照定时器的定时时间来触发定时器中断;
定时器中断处理步骤:根据定时器定时中断发送数据,每次中断根据计算延时计数器到期发送一个位,经过若干个定时中断完成1个字节数据的发送;如果字节数据发送完毕,触发软件中断,进入软件中断处理步骤。
进一步的,所述I/O低电平中断处理步骤,包括:
配置芯片接收管脚RXD的步骤,将接收管脚RXD配置为通用I/O输入模式并关闭I/O中断使能;
计算并设置定时器参数的步骤:所述定时器的定时时间间隔设置为多个UART通信接口中最高波特率的位时长的1/n(n≥2),即定时器中断频率为多个UART通信接口中最高波特率的n(n≥2)倍,通过定时器中断频率/UART通信接口的波特率计算获得一个位需要定时中断的次数;优选的,其中n的取值为2;
启动起始位接收的步骤:设置接收位数等于起始位数,启动起始位接收;
启动定时器的步骤:启动定时器开始计时。
进一步的,所述I/O低电平中断处理步骤还包括数据采样步骤,所述数据采样步骤延时半个位时间后在定时中断处理步骤中再次采集起始位是否为低电平,具体来说,设置延时计数器为一个位需要定时中断的次数的1/2,即可实现延时半个位时间后采集起始位。
进一步的,所述定时器中断处理步骤,包括:判断处于接收状态还是发送状态,根据判断结果选择进入数据接收流程或数据发送流程,并判断数据收发是否结束,如果在设定的一段时间内没有数据收发,则停止定时器;所述I/O低电平中断处理步骤中的启动定时器的步骤还包括以下过程:判断定时器是否已启动,如果未启动则启动定时器。
进一步的,在设定的一段时间内没有数据收发则停止定时器,所述设定的一段时间是根据通信数据量和频繁度来设定,本发明中设为10个定时器中断时间。
进一步的,所述软件中断处理步骤,包括:判断处于接收状态还是发送状态,根据判断结果选择进入数据接收的软件中断处理和数据发送的软件中断处理,其中:
所述数据接收的软件中断处理是将接收到的有效字节数据存储到接收FIFO缓存队列中;
所述数据发送的软件中断处理是:判断FIFO缓存队列中是否仍有数据待发送,如果没有,则直接中断返回,如果有,则获取发送FIFO缓存队列中字节数据;设置定时器的参数:所述定时器的定时时间间隔设置为多个UART通信接口中最高波特率的位时长的1/n(n≥2),即定时器中断频率为多个UART通信接口中最高波特率的n(n≥2)倍,通过定时器中断频率/UART通信接口的波特率计算获得一个位需要定时中断的次数;启动字节数据发送;中断退出。优选的,其中n的取值为2。
本发明采用上述方法,与现有技术相比,具有以下优点:
1.本发明的所述定时器的定时时间间隔设置为多个UART通信接口中最高波特率的位时长的1/n,即定时器中断频率为多个UART通信接口中最高波特率的n倍,而计算一个位需要定时中断的次数=定时器中断频率/UART通信接口的波特率,这样,对于各种不同通信波特率的多个UART通信接口,计算得到的各个UART通信接口的一个位需要定时中断的次数,保证了模拟多个UART通信接口可以共享一个定时器,降低了定时器中断频率,降低了系统资源损耗;同时,使用本发明模拟一个UART通信接口时仅需要1个定时器、2个I/O端口,1个软件中断,当模拟多个UART通信接口时,可以共用一个定时器和一个软件中断,每增加一个UART通信接口只需要增加2个I/O端口即可,降低了产品成本,提高了产品竞争力;
2.本发明的所述I/O低电平中断处理步骤还包括数据采样步骤,所述数据采样步骤是设置延时计数器为一个位需要定时中断的次数的1/2,即延时半个位时间后在定时中断处理步骤中再次采集起始位是否为低电平,严格判断起始位的正确性,提高接收数据的检错能力;
3.本发明的所述定时器中断处理步骤还包括数据采样步骤,所述数据采样步骤是设置延时计数器为一个位需要定时中断的次数,即在起始位采样后每延时一个位时间采集一个位数据,从而使每次采样的位数据都是采集位的中间位置,避免因定时器精度误差造成的采样位出错,提高数据接收的容错性和准确率;
4.本发明的接收/发送数据过程根据定时器定时中断接收/发送数据,每次中断根据计算延时计数器到期接收/发送一个位,经过若干个定时中断完成1个字节数据的接收/发送,从而可以实现真正的全双工通信;
5.本发明在一段时间内检测到没有数据收发,则停止定时器,从而降低在无数据通信情况下的系统资源损耗;
6.本发明在数据接收的过程中,当一个字节的数据接收完毕后不在定时器中断处理中对FIFO缓存队列进行操作,从而提高定时器精度,保障了系统通信的准确度。
附图说明
图1是本发明的数据接收方法的流程。
图2是本发明的数据发送方法的流程。
图3是本发明的定时器中断处理步骤。
图4是本发明的定时器中断处理步骤中的数据接收流程。
图5是本发明的定时器中断处理步骤中的数据发送流程。
图6是本发明的软件中断处理步骤。
图7是本发明的实施例的系统模块框图。
具体实施方式
现结合附图和具体实施方式对本发明进一步说明。
本发明方法模拟一个UART通信接口仅需要1个定时器,2个I/O端口,1个软件中断。模拟多个UART通信接口可以共用一个定时器和一个软件中断,因此,每扩展一个UART通信接口,仅需要增加2个I/O端口。
其中,定时器的作用是利用定时器定时中断功能提供精确的波特率定时。考虑到模拟多个UART通信接口共享一个定时器且通信波特率有可能不同的情况,定时器的定时时间间隔(T_TIMER)设定为多个UART通信接口中最高波特率的位时长1/2,即定时器中断频率(F_TIMER)仅为最高波特率的2倍,降低定时器中断频率,降低系统资源损耗。在一段时间内如果无数据收发,则停止定时器,从而降低在无数据通信情况下的系统资源的耗费,一段时间定义为无数据收发界定时间(T_IDLE),可默认定义为10个定时器中断时间,具体可根据通信数据量和频繁度来配置。当然上述定时器中断频率(F_TIMER)为最高波特率的2倍,也可以设置为n倍,n≥2,考虑到定时器中断越频繁,系统的负荷就越大,影响系统正常运行,本实施例取n的优选值为2。
2个I/O端口,其中一个I/O端口作为接收管脚(RXD),该I/O端口可配置成低电平中断模式或通用I/O端口模式,另外一个I/O端口作为发送管脚(TXD),配置成通用I/O端口模式。
软件中断,主要作用有两个:一是当完整接收完一个有效字节数据时,程序主动触发软件中断,在软件中断处理步骤中将该有效字节数据存储到接收FIFO缓存队列中;二是当发送完一个字节数据后,程序主动触发软件中断,在软件中断处理步骤中判断发送FIFO缓存队列中是否还有数据要发送,如果有,则取出发送FIFO缓存队列中一个字节数据继续发送。
具体的,本发明的一种通过软件模拟实现多个UART通信接口的方法,包括数据接收方法和数据发送方法。
其中数据接收方法如图1所示,包括以下过程:
接收管脚(RXD)用来接收数据,在无数据接收的情况下配置成低电平中断模式并打开I/O中断使能,用于监测接收数据,当有数据到来时,首先会检测到起始位,而起始位为低电平,因此立即发生I/O低电平中断;
进入I/O低电平中断处理步骤,判断定时器是否已启动,未启动则启动定时器,启动字节数据接收;
进入定时器中断处理步骤,按位接收存储形成字节数据,并判断数据起始位、停止位、奇偶校验有效性,接收到一个有效字节数据,接收标志(RX_FLAG)设置为有效状态,接着触发软件中断,返回配置芯片接收管脚RXD的步骤,退出定时器中断后进入软件中断,在软件中断中存储接收的字节数据;
进入软件中断处理步骤,判断接收标志(RX_FLAG)是否为有效状态,如果为有效状态,则清除该有效状态标志,并将接收的字节数据存储到接收FIFO缓存队列中。
进一步的,如图2所示,数据发送方法包括以下过程:
发送管脚(TXD)用来发送数据,配置成通用I/O输出模式,在无数据发送的情况下,发送管脚控制输出高电平;
发送数据时,将待发送的数据存储到发送FIFO缓存队列中,发送标志(TX_FLAG)设置为有效状态,触发软件中断,进入软件中断处理步骤;
进入软件中断处理步骤,判断发送标志(TX_FLAG)是否为有效状态,如果为有效状态,则清除该有效状态标志,并获取发送FIFO缓存队列中字节数据,赋值到发送变量(TX_SHIFT),启动发送;
进入定时器中断处理步骤,按位发送字节数据,字节数据发送完毕,发送标志(TX_FLAG)设置为有效状态,触发软件中断。
进一步的,所述I/O低电平中断处理步骤,包括以下流程:
配置接收管脚(RXD)为通用I/O输入模式,关闭I/O中断使能;
计算一个位需要定时中断的次数(C_MUL)=定时器中断频率(F_TIMER)/波特率(BAUD);
设置延时计数器(RX_DELAY)=C_MUL/2,这里除以2的作用是为了延时半个位时间后在定时中断处理步骤中再次采集起始位是否为低电平,严格判断起始位的正确性,提高接收数据的检错能力;
设置接收位数(RX_BIT)=起始位数(START_BIT),设置接收步骤(RX_STEP)=0,启动起始位接收;
判断定时器是否已启动,未启动则启动定时器,无数据收发的计数器(C_IDLE)清0。
进一步的,如图3所示,所述定时器中断处理步骤,包括以下流程:
判断接收位数(RX_BIT)是否大于0,接收位数(RX_BIT)大于0则说明处于字节数据接收过程,进入数据接收流程;
判断发送位数(TX_BIT)是否大于0,发送位数(TX_BIT)大于0则说明处于数据发送过程,进入数据发送流程;
无数据收发的计数器(C_IDLE)加1,接着判断无数据收发计数器(C_IDLE)是否大于无数据收发界定时间(T_IDLE),是则停止定时器,接着中断退出,否则直接中断退出。由于无数据收发的计数器(C_IDLE)在进入数据接收流程和进入数据发送流程中会清0,因此在数据收发过程中不会停止定时器。
具体的,如图4所示,定时器中断处理步骤中的数据接收流程如下:
步骤1:
进入数据接收流程,跳到步骤2;
步骤2:
无数据收发的计数器(C_IDLE)清0,延时计数器(RX_DELAY)减1,接着判断RX_DELAY是否等于0,是则跳到步骤3;否则退出;
步骤3:
延时计数器(RX_DELAY)等于0,则说明延时到期,接收位数(RX_BIT)减1,通过接收步骤(RX_STEP)值判断接收步骤。如果RX_STEP等于0,则处于接收起始位步骤,跳到步骤4;如果RX_STEP等于1,则处于接收数据位步骤,跳到步骤5;如果RX_STEP等于2,则处于接收奇偶校验位步骤,跳到步骤6;如果RX_STEP等于3,则处于接收停止位步骤,跳到步骤7;
步骤4:
接收起始位,读取RXD管脚当前状态,判断起始位有效性,低电平表示有效,高电平表示无效;
起始位有效,延时计数器(RX_DELAY)设置为位定时中断的次数(C_MUL),表示延时一个位时间后开始采集数据位,由于I/O中断处理步骤中延时半位采集起始位,因此,每次采样的位数据都是采集位的中间位置,降低对定时器精准度的要求,提高数据接收的容错性,提高准确率。接收位数(RX_BIT)设置为数据位数(DATA_BIT),表示后续需要接收的数据位数。数据接收变量(RX_SHIFT)清0,为后续存储数据逻辑位做好准备。接收步骤(RX_STEP)设置为1,启动数据位接收,退出;
起始位无效,跳到步骤8;
步骤5:
接收数据位,采集当前RXD管脚的状态,按位接收存放在变量(RX_SHIFT)中,延时计数器(RX_DELAY)设置为位定时中断的次数(C_MUL),表示延时一个位时间后接收下一个逻辑位,接着判断接收位数(RX_BIT)是否等于0;
接收位数(RX_BIT)等于0,表示数据位接收完毕,接着判断是否有奇偶校验,是则下一步接收奇偶校验位,接收步骤(RX_STEP)设置为2,接收位数(RX_BIT)设置为奇偶校验位数(PARITY_BIT),启动奇偶校验位接收,退出;否则下一步接收停止位,接收步骤(RX_STEP)设置为3,接收位数(RX_BIT)设置为停止位数(STOP_BIT),启动停止位接收,退出;
接收位数(RX_BIT)不等于0,表示数据位未接收完毕,继续接收下一个逻辑位,退出;
步骤6:
接收奇偶校验位,采集当前RXD管脚的状态,按位接收存放在变量(RX_PARITY)中,延时计数器(RX_DELAY)设置为位定时中断的次数(C_MUL),表示延时一个位时间后接收下一个逻辑位,接着判断接收位数(RX_BIT)是否等于0;
接收位数(RX_BIT)等于0,表示奇偶校验位接收完毕,接收步骤(RX_STEP)设置为3,接收位数(RX_BIT)设置为停止位数(STOP_BIT),启动停止位接收,退出;
接收位数(RX_BIT)不等于0,表示奇偶校验位未接收完毕,继续接收下一个逻辑位,退出;
步骤7:
接收停止位,采集当前RXD管脚的状态,延时计数器(RX_DELAY)设置为位定时中断的次数(C_MUL),表示延时一个位时间后接收下一个逻辑位,接着判断停止位是否有效;
停止位有效则判断接收位数(RX_BIT)是否等于0,等于0表示停止位接收完毕,接收标志(RX_FLAG)设置为1,RXD接收管脚配置成低电平中断模式并打开I/O中断使能,继续监测接收数据,触发软件中断,退出;接收位数(RX_BIT)不等于0表示停止位未接收完毕,继续接收下一个逻辑位,退出;
停止位无效,跳到步骤8;
步骤8:
接收位数(RX_BIT)清0,表示退出数据接收过程;RXD接收管脚配置成低电平中断模式并打开I/O中断使能,重新开始监测接收数据,退出。
具体的,如图5所示,定时器中断处理步骤中的数据发送流程:
步骤1:
进入数据发送流程,跳到步骤2;
步骤2:
无数据收发的计数器(C_IDLE)清0,延时计数器(TX_DELAY)减1,接着判断TX_DELAY是否等于0,是则跳到步骤3;否则退出;
步骤3:
延时计数器(TX_DELAY)等于0,则说明延时到期,发送位数(TX_BIT)减1,通过发送步骤(TX_STEP)值判断发送步骤。如果TX_STEP等于0,则处于发送起始位步骤,跳到步骤4;如果TX_STEP等于1,则处于发送数据位步骤,跳到步骤5;如果TX_STEP等于2,则处于发送奇偶校验位步骤,跳到步骤6;如果TX_STEP等于3,则处于发送停止位步骤,跳到步骤7;
步骤4:
发送起始位,控制TXD管脚输出低电平,表示发送起始位,延时计数器(TX_DELAY)设置为位定时中断的次数(C_MUL),表示延时一个位时间后开始发送下一个逻辑位,接着判断发送位数(TX_BIT)是否等于0;
发送位数(TX_BIT)等于0,表示起始位发送完毕,发送位数(TX_BIT)设置为数据位数(DATA_BIT),表示后续需要发送的数据位数。发送步骤(TX_STEP)设置为1,启动数据位发送,退出;
发送位数(TX_BIT)不等于0,表示起始位未发送完毕,继续发送下一个逻辑位,退出;
步骤5:
发送数据位,按位发送存放在变量(TX_SHIFT)中逻辑位,根据变量(TX_SHIFT)中逻辑位值控制TXD管脚输出对应电平,逻辑1输出高电平,逻辑0输出低电平。延时计数器(TX_DELAY)设置为位定时中断的次数(C_MUL),表示延时一个位时间后发送下一个逻辑位,接着判断发送位数(TX_BIT)是否等于0;
发送位数(TX_BIT)等于0,表示数据位发送完毕,接着判断是否有奇偶校验,是则下一步发送奇偶校验位,发送步骤(TX_STEP)设置为2,发送位数(TX_BIT)设置为奇偶校验位数(PARITY_BIT),启动奇偶校验位发送,退出;否则下一步发送停止位,发送步骤(TX_STEP)设置为3,发送位数(TX_BIT)设置为停止位数(STOP_BIT),启动停止位发送,退出;
发送位数(TX_BIT)不等于0,表示数据位未发送完毕,继续发送下一个逻辑位,退出;
步骤6:
发送奇偶校验位,按位发送存放在变量(TX_PARITY)中逻辑位,根据变量(TX_PARITY)中逻辑位值控制TXD管脚输出对应电平,逻辑1输出高电平,逻辑0输出低电平。延时计数器(TX_DELAY)设置为位定时中断的次数(C_MUL),表示延时一个位时间后发送下一个逻辑位,接着判断发送位数(TX_BIT)是否等于0;
发送位数(TX_BIT)等于0,表示奇偶校验位发送完毕,发送步骤(TX_STEP)设置为3,发送位数(TX_BIT)设置为停止位数(STOP_BIT),启动停止位发送,退出;
发送位数(TX_BIT)不等于0,表示奇偶校验位未发送完毕,继续发送下一个逻辑位,退出;
步骤7:
发送停止位,控制TXD管脚输出高电平,表示发送停止位,延时计数器(TX_DELAY)设置为位定时中断的次数(C_MUL),表示延时一个位时间后发送下一个逻辑位,接着判断发送位数(TX_BIT)是否等于0;
发送位数(TX_BIT)等于0,表示停止位发送完毕,到此,一个字节数据发送完毕,发送标志(TX_FLAG)设置为1,触发软件中断,退出;
发送位数(TX_BIT)不等于0,表示停止位未发送完毕,继续发送下一个逻辑位,退出。
具体的,软件中断处理步骤,如图6所示,执行以下流程:
判断接收标志(RX_FLAG)是否等于1,接收标志(RX_FLAG)等于1则说明已接收到一个完整字节数据,接收标志(RX_FLAG)清0,将接收变量(RX_SHIFT)值存储到接收FIFO缓存队列中;
判断发送标志(TX_FLAG)是否等于1,发送标志(TX_FLAG)等于1则说明已发送完一个字节数据,发送标志(TX_FLAG)清0,判断发送FIFO缓存队列是否还有数据要发送;
发送FIFO缓存队列中有数据待发送,获取发送FIFO缓存队列中字节数据赋值给发送变量(TX_SHIFT),判断定时器是否已启动,未启动则启动定时器,无数据收发的计数器(C_IDLE)清0;计算一个位需要定时中断的次数(C_MUL)=定时器中断频率(F_TIMER)/波特率(BAUD);设置延时计数器(TX_DELAY)=C_MUL;设置发送位数(TX_BIT)=起始位数(START_BIT),设置发送步骤(TX_STEP)=0,启动起始位发送;
发送FIFO缓存队列中无数据待发送,中断退出。
上述过程中,共3个中断事件:定时器中断、I/O口电平中断、软件中断。其中定时器中断优先级设为最高,I/O口电平中断优先级居中,软件中断优先级最低。高优先级的中断可以打断低优先级中断,即在执行低优先级中断处理步骤过程中,如果发生了高优先级中断事件,系统立即响应高优先级中断,程序立即跳转到高优先级中断处理步骤中执行。因此定时器的中断事件将得以实时响应执行,提高定时器精准度,为提升通信准确率和提高通信波特率提供前提条件。
下面结合具体应用实例来描述上述方法的应用,如图7所示,本实例是一个由微处理器、LCD显示屏、卫星定位模块、移动通信模块及其他设备组成的GPS车载终端,LCD显示屏、卫星定位模块、移动通信模块及其他设备通过UART通信接口与微处理器电性连接。下面根据实际应用场景来阐述本发明的一种通过软件模拟实现多个UART通信接口的方法的应用:
GPS车载终端是一个安装在车辆上的设备,包含了微处理器、存储器RAM、FLASH、外围输入输出接口、UART通信接口、移动通信模块和卫星定位模块等子系统,主要起到移动网络无线数据通信、GPS卫星定位功能、人机界面交互等功能。
微处理器具有1个物理UART通信接口,多个I/O口,2个定时器,1个软件中断等硬件资源。本实施例中具有四个设备:LCD显示屏、卫星定位模块、移动通信模块及其他设备,那么微处理器还需要模拟扩展3个UART通信接口才能连接这四个硬件设备,UART2连接移动通信模块,UART3连接LCD显示屏,UART4连接卫星定位模块。
微处理器UART1为物理UART通信接口,连接其他设备,由于设备不固定性,因此通信参数,通信波特率等都不确定,而物理UART可支持很高通信波特率,因此预留连接其他设备。
微处理器UART2为模拟UART通信接口,用来连接移动通信模块,移动通信模块通信波特率为19200bps、8位数据位、无奇偶校验、1位停止位。
微处理器UART3为模拟UART通信接口,用来连接LCD显示屏,LCD显示屏通信波特率为38400bps、8位数据位、无奇偶校验、1位停止位。
微处理器UART4为模拟UART通信接口,用来连接卫星定位模块,卫星定位模块通信波特率为9600bps、8位数据位、无奇偶校验、1位停止位。
基于以上介绍,微处理器需要通过UART通信接口连接各种单元模块,而且各单元模块通信波特率都不一样,而微处理器只有一个物理UART通信接口,需要扩展UART通信接口同时尽量控制产品成本。采用本发明的一种通过软件模拟实现多个UART通信接口的方法,能够解决以上所述问题,实现真正全双工通信,可扩展多个UART通信接口,满足各种不同通信波特率的要求,解决UART通信接口不足问题,降低产品成本,提高产品竞争力。
当然本发明的方法不局限于扩展三个UART通信接口,也可以扩展为其他数目的UART通信接口,每扩展一个UART通信接口,仅需要增加2个I/O端口。
尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。
Claims (9)
1.一种通过软件模拟实现多个UART通信接口的方法,其特征在于:包括数据接收方法和数据发送方法,其中数据接收方法包括以下步骤:
配置芯片一I/O管脚为接收管脚RXD的步骤:将接收管脚RXD配置为低电平中断模式并打开I/O中断使能;
实时监测接收管脚RXD接收数据的步骤:当接收到数据时,首先检测该数据的起始位,如果起始位为高电平则继续实时监测,如果起始位为低电平,则触发接收管脚RXD发生I/O低电平中断;
I/O低电平中断处理步骤:配置接收管脚RXD为通用I/O输入模式并关闭I/O中断使能,启动定时器,启动字节数据接收,其中所述定时器的定时时间间隔设置为多个UART通信接口中最高波特率的位时长的1/n,即定时器中断频率为多个UART通信接口中最高波特率的n倍,定时器的定时时间到时触发定时器中断,其中n≥2;
定时器中断处理步骤:根据定时器定时中断接收数据,每次中断根据计算延时计数器到期接收一个位,经过若干个定时中断完成1个字节数据的接收,并判断接收到的字节的有效性,如果接收到的字节无效则返回“配置芯片一I/O管脚为接收管脚RXD的步骤”,如果接收到的字节有效则首先触发软件中断,执行软件中断处理步骤,然后再返回“配置芯片一I/O管脚为接收管脚RXD的步骤”,退出定时器中断后进入软件中断,在软件中断中存储接收的字节数据;
软件中断处理步骤:将接收到的有效字节数据存储到接收FIFO缓存队列中;
数据发送方法包括以下步骤:
配置芯片另一I/O管脚为发送管脚TXD的步骤:将发送管脚TXD配置为通用I/O输出模式;准备发送数据的步骤:将待发送的数据存储到发送FIFO缓存队列中,触发软件中断;
软件中断处理步骤:获取发送FIFO缓存队列中字节数据,启动字节数据发送,并按照定时器的定时时间来触发定时器中断;
定时器中断处理步骤:根据定时器定时中断发送数据,每次中断根据计算延时计数器到期发送一个位,经过若干个定时中断完成1个字节数据的发送;如果字节数据发送完毕,触发软件中断,进入软件中断处理步骤。
2.根据权利要求1所述的通过软件模拟实现多个UART通信接口的方法,其特征在于:所述I/O低电平中断处理步骤,包括:
配置芯片接收管脚RXD的步骤:将接收管脚RXD配置为通用I/O输入模式并关闭I/O中断使能;
计算并设置定时器参数的步骤:所述定时器的定时时间间隔设置为多个UART通信接口中最高波特率的位时长的1/n,即定时器中断频率为多个UART通信接口中最高波特率的n倍,通过定时器中断频率/UART通信接口的波特率计算获得一个位需要定时中断的次数,其中n≥2;
启动起始位接收的步骤:设置接收位数等于起始位数,启动起始位接收;
启动定时器的步骤:启动定时器开始计时。
3.根据权利要求1或2所述的通过软件模拟实现多个UART通信接口的方法,其特征在于:n的取值为2。
4.根据权利要求2所述的通过软件模拟实现多个UART通信接口的方法,其特征在于:所述I/O低电平中断处理步骤还包括数据采样步骤,所述数据采样步骤是延时半个位时间后在定时中断处理步骤中再次采集起始位是否为低电平。
5.根据权利要求3所述的通过软件模拟实现多个UART通信接口的方法,其特征在于:所述I/O低电平中断处理步骤还包括数据采样步骤,所述数据采样步骤是延时半个位时间后在定时中断处理步骤中再次采集起始位是否为低电平。
6.根据权利要求1所述的通过软件模拟实现多个UART通信接口的方法,其特征在于:所述定时器中断处理步骤,包括:判断处于接收状态还是发送状态,根据判断结果选择进入数据接收流程或数据发送流程,并判断数据收发是否结束,如果在设定的一段时间内没有数据收发,则停止定时器;所述I/O低电平中断处理步骤中的启动定时器的步骤还包括以下过程:判断定时器是否已启动,如果未启动则启动定时器。
7.根据权利要求6所述的通过软件模拟实现多个UART通信接口的方法,其特征在于:在设定的一段时间内没有数据收发则停止定时器,所述设定的一段时间是根据通信数据量和频繁度来设定。
8.根据权利要求1所述的通过软件模拟实现多个UART通信接口的方法,其特征在于:所述软件中断处理步骤,包括:判断处于接收状态还是发送状态,根据判断结果选择进入数据接收的软件中断处理和数据发送的软件中断处理,其中所述数据接收的软件中断处理是将接收到的有效字节数据存储到接收FIFO缓存队列中;
所述数据发送的软件中断处理是:判断FIFO缓存队列中是否仍有数据待发送,如果没有,则直接中断返回,如果有,则获取发送FIFO缓存队列中字节数据;设置定时器的参数:所述定时器的定时时间间隔设置为多个UART通信接口中最高波特率的位时长的1/n,即定时器中断频率为多个UART通信接口中最高波特率的n倍,通过定时器中断频率/UART通信接口的波特率计算获得一个位需要定时中断的次数,其中n≥2;启动字节数据发送;中断退出。
9.根据权利要求8所述的通过软件模拟实现多个UART通信接口的方法,其特征在于:n的取值为2。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210013739.7A CN102546843B (zh) | 2012-01-17 | 2012-01-17 | 一种通过软件模拟实现多个uart通信接口的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210013739.7A CN102546843B (zh) | 2012-01-17 | 2012-01-17 | 一种通过软件模拟实现多个uart通信接口的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102546843A CN102546843A (zh) | 2012-07-04 |
CN102546843B true CN102546843B (zh) | 2017-10-24 |
Family
ID=46352788
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210013739.7A Active CN102546843B (zh) | 2012-01-17 | 2012-01-17 | 一种通过软件模拟实现多个uart通信接口的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102546843B (zh) |
Families Citing this family (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102970279B (zh) * | 2012-10-24 | 2015-01-21 | 厦门金龙联合汽车工业有限公司 | 一种基于串口的汽车电子设备的自适应通信系统 |
CN103605306B (zh) * | 2013-11-18 | 2016-07-06 | 四川长虹电器股份有限公司 | 基于uart通讯接口扩展的通讯装置 |
CN104717155B (zh) * | 2013-12-15 | 2017-10-24 | 中国航空工业集团公司第六三一研究所 | 一种采样系统中的网络流量处理电路及方法 |
CN103744804A (zh) * | 2013-12-30 | 2014-04-23 | 福建星网视易信息系统有限公司 | 一种在软件模拟通信接口时防干扰的方法及系统 |
CN104156335A (zh) * | 2014-08-08 | 2014-11-19 | 成都联星微电子有限公司 | 一种uart多接口复用方法 |
CN104536328A (zh) * | 2014-11-04 | 2015-04-22 | 安徽国科电力设备有限公司 | 一种总线操作器件串口资源的扩展模块 |
CN104640151A (zh) * | 2015-01-19 | 2015-05-20 | 青岛中天信通物联科技有限公司 | 一种传感器无线管理方法 |
CN105446925A (zh) * | 2015-06-16 | 2016-03-30 | 北京天诚盛业科技有限公司 | 提高串口数据接收正确性的方法和装置 |
CN105512061A (zh) * | 2015-11-24 | 2016-04-20 | 北京天诚盛业科技有限公司 | 对uart数据进行接收和解析的方法以及装置 |
CN105718415A (zh) * | 2016-01-19 | 2016-06-29 | 江苏飞尚安全监测咨询有限公司 | 一种单片机通用异步收发器接收分帧检测算法 |
US10949365B2 (en) * | 2016-09-05 | 2021-03-16 | IOT.nxt BV | Software-defined device interface system and method |
CN107357742A (zh) * | 2017-07-14 | 2017-11-17 | 上海瀚银信息技术有限公司 | 一种串口模拟方法和计算机设备 |
CN109783431B (zh) * | 2019-02-25 | 2023-02-07 | 东莞蕾纳智能科技有限公司 | 微处理器间i/o端口通信方法 |
CN110177035B (zh) * | 2019-05-15 | 2021-12-14 | 北京猎户星空科技有限公司 | 数据接收和发送方法、装置及数据收发系统 |
CN111309664A (zh) * | 2020-01-21 | 2020-06-19 | 明见(厦门)技术有限公司 | 一种模拟lin总线主机发送lin数据包的方法 |
CN112597081A (zh) * | 2020-12-22 | 2021-04-02 | 青岛鼎信通讯股份有限公司 | 基于低压物联感知终端的uart软件实现方法 |
CN114185267B (zh) * | 2021-12-07 | 2024-02-02 | 中国兵器工业集团第二一四研究所苏州研发中心 | 一种延时电路参数配置方法及系统 |
CN114253879A (zh) * | 2021-12-23 | 2022-03-29 | 北京恒源利通电力技术有限公司 | 一种基于软件模拟的多通道串口通信方法及系统 |
CN114726494B (zh) * | 2022-03-04 | 2024-03-29 | 深圳拓邦股份有限公司 | uart接口电路、uart通信方法及装置 |
CN115001613B (zh) * | 2022-05-19 | 2023-05-16 | 中国北方车辆研究所 | 一种多路光纤陀螺数据接收处理并实时发送的方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4702209B2 (ja) * | 2006-07-21 | 2011-06-15 | ソニー株式会社 | 信号処理装置、信号処理方法、並びにプログラム |
CN101471787A (zh) * | 2007-12-25 | 2009-07-01 | 希姆通信息技术(上海)有限公司 | 基于无线通信模块的软件模拟uart的方法 |
CN101626288A (zh) * | 2009-08-10 | 2010-01-13 | 中国航空工业集团公司洛阳电光设备研究所 | 带有波特率检测设置功能的uart装置及其检测设置方法 |
CN101631012B (zh) * | 2009-08-13 | 2013-03-20 | 中兴通讯股份有限公司 | 一种通用异步收发报机的控制方法及其装置 |
-
2012
- 2012-01-17 CN CN201210013739.7A patent/CN102546843B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN102546843A (zh) | 2012-07-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102546843B (zh) | 一种通过软件模拟实现多个uart通信接口的方法 | |
JP2678283B2 (ja) | データ通信制御装置 | |
CN100471156C (zh) | 数据总线桥接器及其工作方法 | |
CN202870808U (zh) | 一种spi串口模块的fpga实现装置 | |
CN102223452B (zh) | 移动终端的tty测试方法及系统 | |
CN102523632A (zh) | 一种用于航天器内环境监测的无线传感器网络系统 | |
CN113258546B (zh) | 芯片级软硬件协同继电保护装置 | |
CN102438010B (zh) | 用于流送数据剖析的方法和装置 | |
CN110519374B (zh) | ZigBee网络化工业控制系统的边缘计算方法及其边缘节点 | |
CN105975424A (zh) | 一种主从串行通讯协议 | |
CN101471787A (zh) | 基于无线通信模块的软件模拟uart的方法 | |
CN107562672A (zh) | 一种提高矢量网络分析仪数据传输速率的系统及方法 | |
CN104765701B (zh) | 数据访问方法及设备 | |
CN104156335A (zh) | 一种uart多接口复用方法 | |
CN104035901A (zh) | 一种ttcan总线对时及发送数据的方法 | |
CN110134180A (zh) | 基于SMBus总线BMC时间同步系统及方法 | |
CN204733178U (zh) | 一种基于FPGA的EtherCAT主站装置 | |
CN103019990A (zh) | 一种采集端启动pci-e总线dma上传数据的方法 | |
CN114089649A (zh) | 一种自动化测试工装系统及方法 | |
CN103077144A (zh) | 一种确保数据完整的spi通讯接口及其通讯方法 | |
CN109426643A (zh) | Usb接口请求调度方法、装置及设备 | |
CN103618681A (zh) | 一种弹性的网络带宽控制方法及其系统 | |
CN109361653A (zh) | 一种powerlink主站 | |
KR101125365B1 (ko) | Sdl?opnet 코-시뮬레이션 기법을 이용한 통신 프로토콜의 단일 모델 기반 통합 설계 방법 | |
CN102880576B (zh) | 基于stm32f103ve芯片模拟多组uart接口的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |