一种基于C8051F310的UART扩展实现
扫描二维码
随时随地手机看文章
引言
UART数据发送协议作为一种简单的数据发送协议,被大量的使用在当前各种数字外设的数据传输上。但是现在的PC机存在无UART接口或接口较少的问题,当需要利用PC机对于多个数字设备同时处理问题时,就需要在PC机上进行UART扩展,这类问题在笔记本PC上尤为突出。通常这种问题的解决方法有以下几种方法:(1)利用USB接口通过相应的转换设备进行转换。(2)利用PCI总线转换卡获得多个UART接口的扩展。前者优点在于实现简单设备,成本低。后者优点在于可以实现多个接口扩展且功能完善。但在实际使用中发现两者都存在一个共同的问题,即利用扩展获得UART接口其工作性能不够稳定,且存在不能完全实现多个UART接口的实时通讯。
为解决上述硬件方法在工程实现存在的不足,本文针对项目实际需要提出了一种利用C8051F310单片机实现多UART接口扩展方法。通过单片机作为数据收发的中继器,实现对于多个UART采集的需要。
UART数据发送
8位UART数据传输主要利用RX,TX信号线实现数据的双向传输(如图1)。
当数据接收时,数据线RX首先处于接收准备状态即RX呈高电平,根据UART数据发送协议,如果RX线有数据接收时,RX线被置为低电平,接收起始位,在起始位后是为数据位,当最后一帧数据接收完毕后,产生终止,终止位的作用为将RX线电平置高,是RX线处于等待状态。
发送通过对于TX线上信号电平的操作实现对于数据的发送,发送初始状态下TX线处于高电平,当启动发送后将TX线电平置低产生起始位,在一个波特率时钟周期后将开始发送数据,数据发送完毕后重新将TX电平置高使发送机处于等待状态。
单个UART实现方法
本文利用C8051F310单片机作为软件UART实现的平台,主要方法是通过单片机的定时器产生波特率,根据波特率确定的位时间定时读取(或发送)位数据信号,从而模拟了硬件UART的工作过程。具体的实现方法如下所述。
(1)硬件连接
在UART的软件实现中主要是利用单片机模拟硬件UART的发送过程,因此我们利用C8051F310单片机中定时器T0工作的双八位定时模式用于产生波特率,PC机A0工作在边沿捕捉状态以捕捉SW_RX端口的电平变化产生,判断数据接收的初始和终止。具体的硬件连接如图2。
(2)软件实现
发送状态机软件实现:将数据进入到发送缓冲寄存器,然后置SW_TX端口为低电平,启动发送,装载波特率源,此后每经过1/2个位时间后通过移位操作将发送缓冲寄存器中的数据按位改变SW_TX数据线电平从而实现数据的发送。
接收状态机软件实现:当PCA0模块捕捉到SW_RX下边沿后为产生中断,捕捉接收起始位,然后转载波特率,此后每1/2个位时间读取SW_RX线数据位,通过移位操作进入接收缓存。在第九位是由PCA0捕捉停止位,完成接收。[!--empirenews.page--]
多个UART的扩展实现
由于软件UART主要利用中断来控制接收和发送的,因此,当进行多个UART扩展是不可避免的遇到了由于中断处理时间对于UART上发送数据和接收数据的位时间对准问题。根据UART传输原理为了保证接收的准确性一般采用在1/2个位时间处读取和发送数据。因此无论进行多少个UART扩展其总的时间开销应小于1/2个位时间,因此当配置多个UART扩展时传输的波特率是有限制的。同时为了尽可能的多扩展UART应当尽量采用较高的系统时钟频率。
在本设计中利用C8051F310实现了4路UART扩展。分别利用定时器T0,定时器T2,定时器T3和PCA定时器作为波特率产生定时器。设定波特率为9600b/s。
考虑中断处理时间,前文提到了总的中断处理时间应小于1/2个位时间,考虑了最差情况,即4路中断同时并发的情况,一般而言此种情况是不常发生的,因此,认为只要满足下式:
即可满足n个UART扩展的要求,其中为平均中断处理时间。
对于中断时间的测定,可采用在中断开始和中断结束处设置断点读取定时器计数值方式获得。
由此可以看出能否尽量多的扩展一定波特率要求的UART,主要是控制中断处理的时间采用尽量少的中断处理完成读取和发送的I/O端口控制,以及相应的移位操作,一般接收状态机中中断时间较长,而中断发送机时间较短。
多串口数据转发协议
本设计中实现多串口软件扩展的目的是为了解决端口不足的问题,利用一个串口实现对于多个UART设备的通讯,同时克服硬件扩展中信道占用问题,因此需要编制数据中继转发协议。
下行数据的读取
UART设备的数据发送可以分为两类:分为主从式和直发式,主从式数据的获取需要先向设备发送指令,通过指令获取相应设备数据。直发式设备则无论处于何种状态,系统加电后按照预定数据协议向上发送数据。在本设计中同时存在这两类设备。
对于直发式设备本设计采用直接利用一路软件UART获取数据,将数据保存在单片机预先开辟好的一组存储区域中,对于主从式设备本设计采用由单片机按照其最小工作周期连续采集数据进行存储的方式(即利用单片保持数据的最小采集周期更新)。
采集的时序安排,由于下挂的各种设备数据采集周期不同,因此不可避免的存在各种数据采集的时序问题,由于采用中断方式进行采集,这种时序的安排体现在了中断的优先级安排上。为了最大限度的保持数据采集的实时性,应将数据周期较长的设备设定为高优先级中断,这样在其设备采集设备的同时可以更新其他低速设备。
上行数据的转发
上行数据转发采用指令方式,即利用指令判断从数据存储区中获取那些设备的数据。通过这种方式把原来两类设备数据传输方式统一到了主从式上。
上行器件命令的发送
主要采用协议地址的方式判明指令针对的设备,需要在单片机中对于指令按照预先编制的指令协议进行指令的解析,形成针对各自设备的指令码向下转发。具体的数据协议控制图见图3,多串口硬件见图4。
[!--empirenews.page--]
实验
(1)为了验证单个软件UART可用首先利用串口调试助手随机发送数据,选择不同的自动发送周期,每个发送周期连续1000字节数据发送检验数据接收和发送错误率,实验结果见表1。
通过以上数据我们可以看到软件UART在发送和接收时间上存在延迟,因为利用中断和单片机对于数据的转发造成了数据传输的延迟,这是不可避免的,只要保证较高的单片机时钟频率,这种延时可以尽量的减小。其次当发送周期较短时,扩展串口的错误较高,但是延迟到50ms发送周期后这种错误基本解决。因此当传输周期越长,数据错误率越低。
(2)定波特率下,4UART同时工作的测试结果见表2。
波特率上升到115200b/s时,UART传输出现大幅错误,基本无正常数据。
(3)接入实际设备后输出结果,发送指令码:0xaa,取4设备数据。
由于设备1采集周期最长达到300ms,因此其优先级最高。且设备1一直发送数据。
实验中发现由于设备1,一直向上发送数据,其他端口数据无法接收,当设备一端口被关闭后其他端口才可接收已经发送数据。表明此前其他端口设备数据被暂时保存在了硬件的缓存当中。
结语
通过实验表明在特定波特率条件下利用单片机实现的UART端口可以具有较好的稳定性,且延迟时间可以被接收,同时利用协议方式可以有效地避免硬件扩展串口存在的信道堵塞问题。对于一般PC扩展而言是一种很好的选择。但同时可以看到这种方法在通用性上同硬件扩展有很大差距,必须根据特定设备编写特定协议,并且利用编程模拟的UART接口对于波特率和数据传输时间上具有很高的要求,因此对于实时性要求较高的场合并不使用。