摘 要 本文介绍了如何利用RS232寄存器I/O操作,实现RS232口的直接数字量输入及简便的模拟量输入方法。用这种方法实现的A/D转换器及I/O扩展器,直接利用RS232口进行供电,无需外接其它电源。在软件编程方面,无需对串口进行波特率及数据格式设置。通过配置相应的电路,不仅能够完成标准TTL信号的输入,还能完成光隔小信号输入。是一种简便而又行之有效的数据采集方法。
关键词 RS232接口 MCR寄存器 MSR寄存器 LCR寄存器 数字量采集 模拟量采集 串行A/D转换
1. 前言
RS232端口几乎是所有x86计算机必备的端口,它可以连接FAX/MODEM设备、串行鼠标器、串行小键盘、采集模块、PLC等,还可以连接RS232-RS485适配接头,控制RS485网络设备。RS232端口广泛采用9芯D型接头,具有接线简单、传输速率高、传数据可靠等优点。除了Tx/Rx方式的高效数据传输外,RS232接口还具备直接I/O输入输出能力。本文介绍的是利用RS232接口直接完成4路数字量信号的输入,可广泛地应用于机关开关式传感器、临近感应式传感器、霍尔效应式传感器、小型机械键盘、TTL信号的输入。除此之外,利用简单的I/O操作,还可实现RS232口的多路模拟信号采集。简单的串口I/O操作,只是利用RS232口的MCR及MSR寄存器,无需串口初始化及波特率设置等烦琐操作。
2. RS232的端口安排
计算机正常启动后,RS232端口COM1、COM2、COM3、COM4的地址一般被安排在3F8、2F8、3E8、2E8,用于了解外部状态的寄存器地址则被分别设置为3FE、2FE、3EE、2EE,用于控制外部设备的寄器地址则被设置3FC、2FC、3EC、2EC,。RS232接口的针脚安排如下:
D型25芯接头 |
D型9芯接头 | ||
PIN8....CD |
pin1 | ||
pin3...RxD |
pin2 | ||
pin2...TxD |
pin3 | ||
pin20..DTR |
pin4 | ||
pin7....SG |
pin5 | ||
pin6...DSR |
pin6 | ||
pin4...RTS |
pin7 | ||
pin5...CTS |
pin8 | ||
pin22...RI |
pin9 | ||
信号名称 | |||
TxD |
Transmit Data |
RxD |
Receive data |
RTS |
Request to send |
CTS |
Clear to Send |
DSR |
Data Set Ready |
DTR |
Data terminal ready |
SG |
Signal ground |
RI |
Ring inDICator |
CD |
Carrier Detect |
|
|
由于大多数x86计算机都使用9芯D型接头。下面讲述的寄存器安排,均指的是9芯D型接头。
RS232口MCR寄存器安排:
地址 |
BIT7 |
BIT6 |
BIT5 |
BIT4 |
BIT3 |
BIT2 |
BIT1 |
BIT0 |
3FC |
X |
X |
X |
X |
X |
X |
PIN7 |
PIN4 |
2FC |
X |
X |
X |
X |
X |
X |
PIN7 |
PIN4 |
3EC |
X |
X |
X |
X |
X |
X |
PIN7 |
PIN4 |
2EC |
X |
X |
X |
X |
X |
X |
PIN7 |
PIN4 |
RS232口MSR寄存器安排
地址 |
BIT7 |
BIT6 |
BIT5 |
BIT4 |
BIT3 |
BIT2 |
BIT1 |
BIT0 |
3FE |
PIN1 |
PIN9 |
PIN6 |
PIN8 |
X |
X |
X |
X |
2FE |
PIN1 |
PIN9 |
PIN6 |
PIN8 |
X |
X |
X |
X |
3EE |
PIN1 |
PIN9 |
PIN6 |
PIN8 |
X |
X |
X |
X |
2EE |
PIN1 |
PIN9 |
PIN6 |
PIN8 |
X |
X |
X |
X |
上面的列表对RS232寄存器进行了必要的简化。MCR寄存器用于控制D型接头的7脚和4脚,MSR用于读取1、9、8、6脚的状态,5脚为地。标有X的位用于其它用途,本文不作介绍。
3. RS232窃电技术
EIA-RS232标准中未定义电源输出引脚,所以RS232接口中找不到电源输出针脚,只能间接地从RS232的其它引脚中获取电源。最直接的方法是利用PIN7和PIN4两个针脚,它们足以驱动CD4093、LM324等MOS型IC芯片器件。除此之外,还可以用下述方法从Tx和Rx引脚中获取电源。
Tx和Rx在传输信号时是正负变化的,图中的二极管D1和D2可以从Rx和Tx中获取一定的能量供后续电路使用。由于本文的直接I/O不使用Tx和Rx传输数据,因此对RS232的窃电只使用PIN7和PIN4,电路图如下:
比较好的窃电方法是上述两种方法的结合,电路图如下:
4. TTL信号的采集
RS232接口可以直接采集TTL信号,TTL信号电平与RS232的标准规定是不一样的,但TTL信号电平在RS232标准规定电平之内,所以TTL信号可以直接通过RS232进行采集。谈到RS232直接I/O操作,就要考虑MSR寄存器。
QBASIC采集例程
PINS =INP(&H3FE)
用I/O操作实现RS232口数字及模拟信号的采集
宋永强 北京232信箱 邮编101149
中海油田服务有限公司研发中心信息技术及产品制造部
BIT7 = (PINS AND 128) / 128
BIT6 = (PINS AND 64) / 64
BIT5 = (PINS AND 32) / 32
BIT4 = (PINS AND 16) / 16
TC++采集例程
#include<conio.h>
#include<stdio.h>
main()
{
int ISTATU,BNC,BIT7,BIT6,BIT5,BIT4;
ISTATU = inportb(0x3fe);
BIT7 = (ISTATU&128) / 128
BIT6 = (ISTATU& 64) / 64
BIT5 = (ISTATU& 32) / 32
BIT4 = (ISTATU& 16) / 16
}
Visual Basic采集例程
由于Visual Basic本身不具备端口处理能力。因此,要借助于外部的动态链接库实现对端口的操作。WINACQ.DLL和WINACQ32.DLL是比较适用的动态链接库。前者用于VB2.0及VB3.0在WIN3X环境下的程序开发,后者用于VB5.0及VB6.0在WIN9X环境下的控制开发。您可以任意使用传播这两个动态链接库。
此程序可以在处或在下述站点免费下载:
http://www.download.com.cn
http://www.daqchina.net
l VB2或VB3编程
在MODULE1.BAS模块中声明送数函数
DECLARE FUNCTION OUTDATA LIB "WINACQ.DLL"
(BYVAL WPP AS INTEGER,BYVAL WMM AS INTEGER)
AS INTEGER
其中WPP: 端口地址 WMM: 数据
在MODULE1.BAS模块中再声明取数函数
DECLARE FUNCTION FETDATA LIB "WINACQ.DLL"
(BYVAL WPP AS INTEGER) AS INTEGER
其中WPP: 端口地址 函数返回值即为读取的数据
在FORM1窗体上放一个COMMAND1钮,其下面填写代码:
ISTATU = FETDATA(&H3FE)
BIT7 = (ISTATU AND 128) / 128
BIT6 = (ISTATU AND 64) / 64
BIT5 = (ISTATU AND 32) / 32
BIT4 = (ISTATU AND 16) / 16
l VB5或VB6编程
在VB5或VB6下编程与在VB2或VB3下编程类似。
在MODULE1.BAS模块中声明送数函数
DECLARE FUNCTION OUTDATA LIB "WINACQ32.DLL"
(BYVAL WPP AS INTEGER,BYVAL WMM AS INTEGER)
AS INTEGER
其中WPP: 端口地址 WMM: 数据
在MODULE1.BAS模块中再声明取数函数
DECLARE FUNCTION FETDATA LIB "WINACQ32.DLL"
(BYVAL WPP AS INTEGER) AS INTEGER
其中WPP: 端口地址 函数返回值即为读取的数据
在FORM1窗体上放一个COMMAND1钮,其下面填写代码:
ISTATU = FETDATA(&H3FE)
BIT7 = (ISTATU AND 128) / 128
BIT6 = (ISTATU AND 64) / 64
BIT5 = (ISTATU AND 32) / 32
BIT4 = (ISTATU AND 16) / 16
上述编程需要将WINACQ.DLL及WINACQ32.DLL拷贝到WINDOWS\SYSTEM目录及WINDOWS\SYSTEM32目录下面去。
采集到的BIT7、BIT6、BIT5、BIT4意义如下:
MSR寄存器位值 |
9针D型接头针脚状态 | ||||||
BIT7 |
BIT6 |
BIT5 |
BIT4 |
PIN1 |
PIN9 |
PIN6 |
PIN8 |
0 |
0 |
0 |
0 |
低电平 |
低电平 |
低电平 |
低电平 |
0 |
0 |
0 |
1 |
低电平 |
低电平 |
低电平 |
高电平 |
0 |
0 |
1 |
0 |
低电平 |
低电平 |
高电平 |
低电平 |
0 |
0 |
1 |
1 |
低电平 |
低电平 |
高电平 |
高电平 |
0 |
1 |
0 |
0 |
低电平 |
高电平 |
低电平 |
低电平 |
0 |
1 |
0 |
1 |
低电平 |
高电平 |
低电平 |
高电平 |
0 |
1 |
1 |
0 |
低电平 |
高电平 |
高电平 |
低电平 |
0 |
1 |
1 |
1 |
低电平 |
高电平 |
高电平 |
高电平 |
1 |
0 |
0 |
0 |
高电平 |
低电平 |
低电平 |
低电平 |
1 |
0 |
0 |
1 |
高电平 |
低电平 |
低电平 |
高电平 |
1 |
0 |
1 |
0 |
高电平 |
低电平 |
高电平 |
低电平 |
1 |
0 |
1 |
1 |
高电平 |
低电平 |
高电平 |
高电平 |
1 |
1 |
0 |
0 |
高电平 |
高电平 |
低电平 |
低电平 |
1 |
1 |
0 |
1 |
高电平 |
高电平 |
低电平 |
高电平 |
1 |
1 |
1 |
0 |
高电平 |
高电平 |
高电平 |
低电平 |
1 |
1 |
1 |
1 |
高电平 |
高电平 |
高电平 |
高电平 |
由此可以看出,我们通过软件连续读取MSR寄存器的状态就直接反应了RS232口D型接头的针脚的电平情况。