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状态 |
现在,再将通信线路控制寄存器的各位意义简要介绍如下:
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
}
在此仅举了发送功能模块的使用其它模块均可仿效此法实现。
C语言直接驱动硬件实现PC机的串口操作相关推荐
- c语言如何控制电脑串口,C语言直接驱动硬件实现PC机的串口操作
熟悉C语言的人都知道,虽然C语言是一门高级语言,拥有很多高级语言的特性,但是作为一种由低级语言到高级的过渡,他又继承了很多低级语言的特性,那就是可以直接操作计算机的硬件设备.本人近日在学习有关PLC网 ...
- s7300plc串口通信_基于LabVIEW的S7300PLC与PC机的串口通信.pdf
基于LabVIEW的S7300PLC与PC机的串口通信 2011 仪 表 技 术 与 传 感 器 2011 5 Instrument Technique and Sensor No5 LabV IEW ...
- 调制自动识别c语言实现,一种基于PC机的肺癌细胞自动识别分类系统
一种基于PC机的肺癌细胞自动识别分类系统 本文介绍了一种基于PC机的肺癌细胞自动识别分类系统的设计思想 (本文共3页) 阅读全文>> 儿童血性胸水中直到癌细胞,并且X线示有骨转移者少见,现 ...
- 利用开发板上的RS485模块与PC机的串口通讯
上网买的RS232转RS485的接口迟迟没有送到,程序又着急写,所以本人就利用开发板上现有的资源实现了一个简单的转化功能 本人利用的开发板资源:RS485模块(MAX 485芯片),U软串(PL230 ...
- c语言 pic16f877a 例子,PIC16F877A与PC机串行通信C语言源程序
//*******串口通信程序********* //*******定义变量************* #include #define unchar unsigned char #define ...
- PC机之间串口通信传输文件
参考资料 本文内容:本文主要介绍如何实现两电脑之间的串口通信.将两台笔记本电脑,借助 usb转TTL 模块和杜邦线,建立起串口连接.然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件 ...
- 在c语言中以16位pc机为例一个,在C语言中(以16位pc机为例),一个char型数据在内...
话题:在C语言中(以16位pc机为例),一个char型数据在内存中所占字节回答:标准的C语言范中:char占一个字节int占4个字节话题:计算机中16位的数据如何存放在32位的寄存器中回答:如果是 w ...
- PC 机 UART(NS8250)详解
PC 机 UART(NS8250)详解 异步串行通信原理 两台计算机/设备进行数据交换,即通信,必须像人们对话一样使用同一种语言.在计算机通信术语中,我们把计算机/设备与计算机/设备之间的" ...
- 单片机与PC机一样都是计算机,51单片机与PC机通信资料
<51单片机与PC机通信资料>由会员分享,可在线阅读,更多相关<51单片机与PC机通信资料(14页珍藏版)>请在人人文库网上搜索. 1.专业综合实习报告专 业: 电子信息工程 ...
最新文章
- php js获取file,PHP file_get_contents 读取js脚本的问题
- JS正则表达式验证数字非常全
- 什么是servlet?servlet的作用?——计算机网络系列学习笔记
- C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)
- 计算机网络—轮询访问介质访问控制
- Failed to access IIS metabase
- Eslint常用命令
- 使用Word的VBA功能过滤敏感词,实现网络文章过审
- TinyMce富文本编辑器配置说明
- kotlin serialization 使用指南(一)
- 小马的白痴日常2019.12.20
- 微信小程序-如何引入地图组件及显示当前所在位置
- RedisGeo实现增删改查 java计算指定坐标最近的距离并排序
- 东南大学计算机学院足球队,2017春季“放飞智能”杯东南大学苏州校友足球队比赛赛事系列报道(八)...
- 数据治理的数据流程整合
- 月份30或31c语言编程,C语言程序设计上机编程方法.PPT
- Android虚拟键盘的高度计算
- Horizon 二次开发 - 登陆页面修改
- 简单视频会议软件_简单而免费的视频会议
- cancase lin管脚_cancase