c语言如何控制电脑串口,C语言直接驱动硬件实现PC机的串口操作
熟悉C語言的人都知道,雖然C語言是一門高級語言,擁有很多高級語言的特性,但是作為一種由低級語言到高級的過渡,他又繼承了很多低級語言的特性,那就是可以直接操作計算機的硬件設(shè)備。本人近日在學習有關(guān)PLC網(wǎng)絡(luò)方面的知識的時候接觸到了這方面的知識特拿來和大家分享。
C語言實現(xiàn)串口通信功能的調(diào)用可分為三個層次,它們是:高級語言層(速度較慢)、BIOS功能調(diào)用以及直接驅(qū)動硬件,今天我要和大家介紹的的這種方法就是基于BIOS功能調(diào)用的。
首先,簡單介紹一下何謂BIOS。
BIOS的全稱是ROM-BIOS——ROM Basic I/O System(只讀存儲器基本輸入輸出系統(tǒng))。它是一組固化到微機主板上一個ROM芯片上的子程序,主要功能包括:
(1)驅(qū)動系統(tǒng)中所配置的常用外設(shè)(即驅(qū)動程序),如顯示器、鍵盤、打印機、磁盤驅(qū)動器、通信接口等。
(2)開機自檢,引導裝入。
(3)提供時間、內(nèi)存容量及設(shè)備配置情況等參數(shù)。使用BIOS中斷調(diào)用與DOS系統(tǒng)功能調(diào)用類似,用戶也無須了解相關(guān)設(shè)備的結(jié)構(gòu)與組成細節(jié),直接調(diào)用即可。
為了實現(xiàn)BIOS調(diào)用,在BIOS中提供了大量的中斷調(diào)用,供我們操作不同的硬件設(shè)備,它們是:
INT 05H?????????? ;打印屏幕內(nèi)容功能調(diào)用
INT 10H?????????? ;顯示中斷調(diào)用
INT 12H?????????? ;測定內(nèi)存容量調(diào)用
INT 14H???????????;異步通行功能調(diào)用
INT 16H?????????? ;鍵盤中斷調(diào)用
INT 17H?????????? ;打印機控制調(diào)用
INT 1AH?????????? ;時鐘調(diào)用
在眾多的中斷調(diào)用功能中于串口通訊有關(guān)的事 INT 14H 中斷調(diào)用,為了實現(xiàn)串口通信 對它的入口參數(shù)和出口參數(shù)作了如下的約束:
功能
入口參數(shù)
出口參數(shù)
異步通信口初始化
(功能編碼=0)
AH=0
DX=通信口號
AL=初始化參數(shù)
AH 中為通信線路狀態(tài)
AL中為Modem狀態(tài)
寫字符到異步通信口
(功能編碼=1)
AH=1
AL=要發(fā)送的字符
DX=通信口號
若成功AH的D7=0
若失敗AH的D7=1
AH的D0~D6為通信線路狀態(tài)
從異步通信口讀數(shù)據(jù)
(功能編碼=2)
AH=2
DH=通信口號
若成功AH的D7=0
若失敗AH的D7=1
AH的D0~D6為通信線路狀態(tài)
AL=所讀取得字符
讀取異步通信口狀態(tài)
(功能編碼=3)
AH=3
DX=通信口號
AH 中為通信線路狀態(tài)
AL中為Modem狀態(tài)
現(xiàn)在,再將通信線路控制寄存器的各位意義簡要介紹如下:
D7
D6
D5
D4
D3
D2
D1、D0
訪問寄存器
0=允許訪問
發(fā)送、接收
中斷允許
1=允許訪問
除數(shù)寄存器
設(shè)置停頓
0=不設(shè)停頓
1=使Modem
發(fā)連續(xù)停頓
信號
固定奇偶位
0=不用
1=使用
D5 D4 D3
=111恒0
101恒1
校驗選擇
0=奇
1=偶
校驗允許
0=無校驗
1=有校驗
停止位
0=1位
1=1.5/2位
數(shù)據(jù)位選擇
00=5位
01=6位
10=7位
11=8位
在對BIOS調(diào)用和通信線路控制寄存器有了一些基本的了解以后,在對硬件了解的要求不高的情況下我們就可以借助下面的模塊利用C語言實現(xiàn)異步通訊了。
C語言的BIOS功能調(diào)用模塊:
1、通訊口初始化模塊;
r.h.al=0xfb??????????????? ?//7位數(shù)據(jù)位,偶校驗,1位停止位。(該值時根據(jù)表二配置的)
r.h.ah=0????????????????? ? //初始化功能編碼號:0
r,h,ax=通信端口號???? //通信端口設(shè)置 0為COM1 1為COM2
int86(0x14,&r,&r)????? //INT14功能調(diào)用
2、發(fā)送數(shù)據(jù)功能模塊:
r.h.ah=1?? ????????????????//初始化功能編碼號:1
r.h.al=DATA??????????? //?DATA 為要發(fā)送的數(shù)據(jù)
r,h,ax=通信端口號???? //通信端口設(shè)置 0為COM1 1為COM2
int86(0x14,&r,&r)????? //INT14功能調(diào)用
3、讀取通信信號狀態(tài)功能模塊:
r.h.ah=3???????????????????//初始化功能編碼號:3
r,h,ax=通信端口號???? //通信端口設(shè)置 0為COM1 1為COM2
int86(0x14,&r,&r)????? //INT14功能調(diào)用
(通信狀態(tài)在ah中)
4、接收數(shù)據(jù)功能模塊:
r.h.ah=2???????????????????//初始化功能編碼號:2
r,h,ax=通信端口號???? //通信端口設(shè)置 0為COM1 1為COM2
int86(0x14,&r,&r)????? //INT14功能調(diào)用
(接收的數(shù)據(jù)在al中)
有了這些功能模塊后我們就可以輕松的利用C語言編寫出異步通信程序了,現(xiàn)列舉編寫的發(fā)送共能的程序如下:
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);???????? //返回發(fā)送的結(jié)果成功與否失敗返回 0x80
}
在此僅舉了發(fā)送功能模塊的使用其它模塊均可仿效此法實現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的c语言如何控制电脑串口,C语言直接驱动硬件实现PC机的串口操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: a的n次方的最后三位数c语言,求13的n
- 下一篇: 数据字典在sga的哪一个组件中缓存_非功