熟悉C语言的人都知道,虽然C语言是一门高级语言,拥有很多高级语言的特性,但是作为一种由低级语言到高级的过渡,他又继承了很多低级语言的特性,那就是可以直接操作计算机的硬件设备。本人近日在学习有关PLC网络方面的知识的时候接触到了这方面的知识特拿来和大家分享。
C语言实现串口通信功能的调用可分为三个层次,它们是:高级语言层(速度较慢)、BIOS功能调用以及直接驱动硬件,今天我要和大家介绍的的这种方法就是基于BIOS功能调用的。
首先,简单介绍一下何谓BIOS。
BIOS的全称是ROM-BIOS——ROM Basic I/O System(只读存储器基本输入输出系统)。它是一组固化到微机主板上一个ROM芯片上的子程序,主要功能包括:
(1)驱动系统中所配置的常用外设(即驱动程序),如显示器、键盘、打印机、磁盘驱动器、通信接口等。
(2)开机自检,引导装入。
(3)提供时间、内存容量及设备配置情况等参数。使用BIOS中断调用与DOS系统功能调用类似,用户也无须了解相关设备的结构与组成细节,直接调用即可。
为了实现BIOS调用,在BIOS中提供了大量的中断调用,供我们操作不同的硬件设备,它们是:
INT 05H ;打印屏幕内容功能调用
INT 10H ;显示中断调用
INT 12H ;测定内存容量调用
INT 14H ;异步通行功能调用
INT 16H ;键盘中断调用
INT 17H ;打印机控制调用
INT 1AH ;时钟调用
在众多的中断调用功能中于串口通讯有关的事 INT 14H 中断调用,为了实现串口通信 对它的入口参数和出口参数作了如下的约束:
功能
入口参数
出口参数
异步通信口初始化
(功能编码=0)
AH=0
DX=通信口号
AL=初始化参数
AH 中为通信线路状态
AL中为Modem状态
写字符到异步通信口
(功能编码=1)
AH=1
AL=要发送的字符
DX=通信口号
若成功AH的D7=0
若失败AH的D7=1
AH的D0~D6为通信线路状态
从异步通信口读数据
(功能编码=2)
AH=2
DH=通信口号
若成功AH的D7=0
若失败AH的D7=1
AH的D0~D6为通信线路状态
AL=所读取得字符
读取异步通信口状态
(功能编码=3)
AH=3
DX=通信口号
AH 中为通信线路状态
AL中为Modem状态
现在,再将通信线路控制寄存器的各位意义简要介绍如下:
D7
D6
D5
D4
D3
D2
D1、D0
访问寄存器
0=允许访问
发送、接收
中断允许
1=允许访问
除数寄存器
设置停顿
0=不设停顿
1=使Modem
发连续停顿
信号
固定奇偶位
0=不用
1=使用
D5 D4 D3
=111恒0
101恒1
校验选择
0=奇
1=偶
校验允许
0=无校验
1=有校验
停止位
0=1位
1=1.5/2位
数据位选择
00=5位
01=6位
10=7位
11=8位
在对BIOS调用和通信线路控制寄存器有了一些基本的了解以后,在对硬件了解的要求不高的情况下我们就可以借助下面的模块利用C语言实现异步通讯了。
C语言的BIOS功能调用模块:
1、通讯口初始化模块;
r.h.al=0xfb //7位数据位,偶校验,1位停止位。(该值时根据表二配置的)
r.h.ah=0 //初始化功能编码号:0
r,h,ax=通信端口号 //通信端口设置 0为COM1 1为COM2
int86(0x14,&r,&r) //INT14功能调用
2、发送数据功能模块:
r.h.ah=1 //初始化功能编码号:1
r.h.al=DATA // DATA 为要发送的数据
r,h,ax=通信端口号 //通信端口设置 0为COM1 1为COM2
int86(0x14,&r,&r) //INT14功能调用
3、读取通信信号状态功能模块:
r.h.ah=3 //初始化功能编码号:3
r,h,ax=通信端口号 //通信端口设置 0为COM1 1为COM2
int86(0x14,&r,&r) //INT14功能调用
(通信状态在ah中)
4、接收数据功能模块:
r.h.ah=2 //初始化功能编码号:2
r,h,ax=通信端口号 //通信端口设置 0为COM1 1为COM2
int86(0x14,&r,&r) //INT14功能调用
(接收的数据在al中)
有了这些功能模块后我们就可以轻松的利用C语言编写出异步通信程序了,现列举编写的发送共能的程序如下:
unsigned char send(int port,char c)
{
union REGS r;
r.x.dx=port;
r.h.ah=1;
r.h.al=c;
int86(0x14,&r,&r);
return (r.h.ah); //返回发送的结果成功与否失败返回 0x80
}
在此仅举了发送功能模块的使用其它模块均可仿效此法实现。