基于UART8250的PC机与MCU多机串行通信的研究

时间:2022-05-25 06:00:13

基于UART8250的PC机与MCU多机串行通信的研究

摘要:简要介绍了一种异步通讯收发器INS8250的内部结构及其与MCU实现多机通讯功能的方法,并给出了多机通讯的实用程序。

关键词:单片机;INS8250;数据桢;多机通信

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)16-21227-03

Study on Communication Between PC and MCU System Based on UART INS8250

TAN Guan-lan,WANG Jian-xin

(Central South University,Changsha 410083,China)

Abstact:This paper introduces an internal structure of an asynchronous communication interface adapter(ACIA) INS8250 and multi-communication methods between INS8250 and Microcontroller Unit (MCU). Finally, some application programs of multi-communication are given.

Key words:MCU;INS8250;Data frame;Multi-communication

随着网络与通讯技术迅猛发展,MCU的应用技术已从单一的测控装置向复合的中小型集散控制系统转变,其大多数情况是以现场数据采集处理和控制为核心的MCU系统构成从机,以文字图形、复杂数据处理为任务的PC为主机,通过串行接口将两部分联系在一起,从而实现了远程通讯与控制。

最初出现的CMMS(Communication between Mcu and Mcu System)对于MCU网络组建与控制起到了推动作用,由于MCU难以处理文字和图形,因而在主MCU中实现生动形象的人机界面并非易事。至此,设计者将主机改为PC机,希望实现网络界面的人性化,但PC机内异步通讯收发器INS8250本身不具备多机通讯功能,亦不能产生通讯时所需的TB8和RB8位,下位机对PC机所发的数据帧和地址帧难以分别,这样串行口丧失了自动辩识能力,整个通讯网络协议得不到统一。本文分析了UART INS8250内部结构后提出了一种相应的解决方案,实践证明是可行的。

1 多机通讯原理

在CMMS中,当串行口工作在方式2(或3)时,每帧信息有11位:包括1位起始位,8位数据位,1位可编程位(TB8),1位停止位。帧信息有地址帧和数据帧之分,如将可编程位TB8置为1表示地址帧,置0时表示数据帧,同时通过SCON中的SM2使通讯端口具有辩识信息的功能,若置所有从机SM2=1,当其接收到地址帧时数据装入SBUF并产生中断请求,否则信息将抛弃;若置从机SM2为0,则只要接收到信息帧都会产生中断标志,其具体通讯过程如下:

(1)置所有从机SM2=1,等待接收地址帧;

(2)置主机SCON中TB8=1,并发送一地址帧。从机将接收到的地址帧与该机地址相比较,若相符则SM2清0并产生中断标志,否则SM2不变;

(3)置主机SCON中TB8=0并发送数据帧。被寻址过的从机接收数据信息,处理完毕后置SM2=1,准备下次主机访问,而其它从机不能产生中断标志。

2 INS 8250内部结构

INS8250是IBM-PC系统中通用的异步通讯收发器,将其配以电平转换收发器和逻辑控制电路做成接口卡形式的通讯视配器,在PC机中其COM1地址范围为3F8~3FFH,COM2地址范围为2F8~2FFH。利用进行通讯时,首先要对其初始化,即通讯波特率设置、数据格式设置、操作方式设置、中断允许寄存器设置,只要对INS8250内部寄存器写入相应的控制命令字即可实现初始化,限于篇幅,下面仅以COM1为例就与通讯编程部分加以介绍。

2.1 内部寄存器

2.1.1 通讯线控制寄存器(3FBH,只写)

该寄存器用于控制通讯数据格式,即数据位数、停止位数、寄存器校验方式及寻址波特率除数寄存器,格式如下:

D7:寻址位。D7=0表正常位,D7=1寻址波特率除数寄存器。

D6:间断值设置。D6=0无效,D6=1强制连续输出空白状态。

D5:附着奇偶校验。D5=0无效。D5=1时,若D3D4=10,则奇偶校验位为1,若D3D4=11,奇偶校验位为0,若D3D3=0×无奇偶校验位。

D4:奇偶校验类型。0表示奇校验,1表示偶校验。

D3:奇偶校验。0为无奇偶校验,1表示有奇偶校验。

D2:停止位数目。0表1位。

D1D0:数据位数。00(5位)~11(8位)。

2.1.2 数据发送保持寄存器(3F8H,只写)

该寄存器包含要串行发送的数据,其中D0是发送的第1位,数据格式如下:

2.1.3 除数锁存器(3F8H/3F9H,只写)

在MCS-51中,通过设置TH1、TL1即可获得波特率发生器,同样由低8位(3F8H)、高8位(3F9H)锁存器构成的16位除数锁存器也是设置波特率的一个工具,它将时钟输入(1.8432MHZ)进行分频产生16倍波特率发生器时钟。除数=1.8432×106÷(波特率×16),常见除数如下表示:

2.1.4 中断允许寄存器(3F9H,只写)

该寄存器用来设置串行口中断类型,其中接收错误中断优先级最高,其次为接收中断、允许发送中断,MODEM中断最低,命令字如下:

D3:1为MODEM中断允许,0禁止。

D2:1为接收错误中断允许,0禁止。

D1:1为发送中断允许,0禁止。

D0:1为接收中断允许,0禁止。

2.1.5通讯线状态寄存器(3FDH,只读)

该寄存器可供CPU查询数据传送或发送时的状态,格式如下:

D6:发送移位寄存器空。

D5:发送保持寄存器空。

D4:间断检测。

D3:格式错。

D2:奇偶错。

D1:超越错。

D0:数据接收就绪。

2.2 INS8250帧格式

INS8250具有与单台MCU通讯功能,但不具备多机通讯功能,这是由INS8250数据帧格式决定的,它可发送由1位起始位、8位数据位、1位奇偶校验位和1位停止位组成的11位数据帧,格式如下:

而MCS-51多机通讯典型数据帧格式如为:

比较这两种帧格式可知,其不同的仅在于奇偶校验位和TB8位,如果通过软件将INS8250数据帧奇偶校验位模拟成MCS-51中的TB8位,即置奇偶位=1说明发送地址帧,清0表示发送数据帧,这样只要在 INS8250通讯线控制寄存器写入特定命令字即可,如果PC机发送数据帧,用8086/8088汇编语言初始化为:

movdx,3fbh

moval,3bh

outdx,al

如发送地址帧,初始化为:

movdx,3fbh

moval,2bh

outdx,al

这样所有从机都可以辨识主机发送的数据是地址帧还是数据帧,实现了多机通讯要求。

3 串口接口通讯程序

分析了有关INS8250多机通讯的机理,我们可以针对其进行编程。软件协议约定如下:

波特率设定:2400波特。

数据传输方式:1个起始位,8个数据位,1个可编程位(奇偶位)。

校验方式:因奇偶校验位被用作发送帧信息的特征位,本协议无校验。

数据传输方式:IMB-PC采用查询方式,从机为中断方式。

3.1 8086/8088汇编语言

initiate:movdx,3f9h;禁止中断

moval,00h

outdx,al

movdx,3fbh;寻址波特率除数寄存器

moval,80h

outdx,al

movdx,3fbh;置波特率除数寄存器低8位置30h

moval,30h

outdx,al

movdx,3f9h;置波特率除数寄存器高8位置00h

moval,00h

outdx,al

movdx,3fbh;置奇偶位为1,待发送地址帧

moval,2bh

outdx,al

send:movdx,3f8h;发送下位机地址

moval,address

outdx,al

movdx,3fdh

in al,dx

test al,01h;检测接收是否就绪

jz send

test al,1eh

inz error ;检测通讯是否出错

mov dx,3f8h

in al,dx

jnz error

movdx,3fbh ;置奇偶位为0,待发送数据帧

moval,3bh

outdx,al

...

3.2 用VB开发的通讯程序

在可视化的VB语言中嵌入汇编语言可达到直接访问INS8250的目的,具体做法如下:

在串行通信中调用Windows的API接口方法,是实现VB直接控制串行口硬件的的有效方案。但VB提供了一个名为Mscomm的控件,能为应用程序提供串行通信功能,而且使用很方便,避免了调用API的烦恼。初始化和定时数据通信程序如下:

Dim Cindata As Variant ‘设置变体接收下位机数据

Dim Coutdata(LENGTH) As Byte ‘设置发送二进制的数据包

Private Sub Form_Load()

mPort = 1 ‘端口设置为1

MSComm1.PortOpen = True‘打开端口

MSComm1.Settings = "2400,m,8,1"‘准备发送给从机地址帧

MSComm1.InputMode = comInputModeBinary ‘以二进制形式传送

MSComm1.InputLen=1 ‘串行口每次接收1个字节

Coutdata(0) = ADDRESS‘发送下位机地址

MSComm1.Output = Coutdata

Do

DoEvents

Loop Until MSComm1.InBufferCount>=1

Cindata = MSComm1.Input

If Cindata(0) =ADDRESS Then

Do

DoEvents

Loop Until MSComm1.InBufferCount >= LEN 接收下位机长为LEN的数据

Cindata = MSComm1.Input

MSComm1.Settings = "2400,S,8,1" ‘准备发送给从机数据帧

Coutdata(0) = OVER‘给从机发送结束标志

MSComm1.Output = Coutdata(0)

End Sub

参考文献:

[1] 李华.MCS―51系列单片机使用接口技术,北京航空航天大学出版社,1993.8.

[2] 林生.计算机通信原理.西安电子科技大学出版社,1991.5.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:校园网优化与提速 下一篇:基于Web的网站信息采集系统的设计与实现