C语言直接驱动硬件实现PC机的串口操作


熟悉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状态

 现在,再将通信线路控制寄存器的各位意义简要介绍如下:

       D7D6 D5  D4D3 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
}

在此仅举了发送功能模块的使用其它模块均可仿效此法实现。


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值