c语言如何控制电脑串口,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语言如何控制电脑串口,C语言直接驱动硬件实现PC机的串口操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: a的n次方的最后三位数c语言,求13的n
- 下一篇: oracle 用户禁止登录,[转] or