国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在CB6下基于api函數編寫串口通信程序簡介

2019-11-17 05:28:56
字體:
來源:轉載
供稿:網友

  1-在C++ Builder 6.0下基于api函數編寫串口通信程序簡介:
在dos/win95/win98的年代,操作系統對串口是不保護的,也就是說將串口的的資源完全
開放給用戶,用戶可以用直接操作硬件的函數(比如說TC2.0下的inport()和outport()函數)
跟串口直接打交道,這時候用戶使用直接操作串口的函數怎樣"折磨"串口都是沒有問題的,
操作系統根本就不管不問,對串口操作所造成的一切后果都是用戶一個人承擔的,這時候用
戶對串口具有高度自由的支配權;但是,這種情況好景不長,從win2000操作系統開始,微軟
為了"照顧好"計算機上的硬件,開始實施了對硬件的保護策略,也就是說任何用戶在他的操作
系統下企圖操縱串口時必須經過他的同意方可進行,其實也就是變相的將用戶往必須使用他的
通信api函數才能操作串口這條"羊腸小路"上趕(當然也有別的方法操作串口,但那些并非我等
普通用戶能研究明白的),形象一點說就似乎你想怎樣操作串口的意圖必須經過win2000的翻譯
(其實是win2000的設備驅動程序)才能轉達給串口一樣,基于這一點我們說(其實是很多資料上
說的)win2000下通過api函數操作串口是具有"設備無關性的",什么意思呢?就是說你想怎樣
操作串口就用相應的api函數告訴操作系統你想對串口干什么,然后操作系統就把你的意思轉
告給串口讓其做出相應的動作,相對于dos/win95/win98下來說,據我理解也就相當于你原來
寫的直接操作串口的函數在win2000下他替你完成了,但是你必須用win2000通信api函數清楚
地向操作系統表達清楚你到底想干什么,所以說在這種情況下要想寫好串口驅動程序你就必須
至少弄明白win2000下的通信api函數都是干什么的方可,啰里啰唆嘮叨了這么多... ...sorry,
還沒完呢,至少還有一件事我想說,原來在dos/win95/win98系統下有好多高手用c/c++對串口
進行直接操作是非常熟練的,尤其是dos時代的turbo 2.0操作串口的高手他們寫的串口驅動程
序直到win98的時候還用的非常洋洋自得,但是到了win2000的時候,他們的程序忽然不好使了
,而他們有的可能還會因為知識結構上的滯后始終弄不明白怎么回事兒,兄弟們,你們該明白
了吧?閑話少敘,下面介紹筆者寫串口通信函數時用到的各個api函數---------
2-CreateFile()
用途:打開串口
原型:HANDLE CreateFile(LPCTSTR lpFileName,
DWord dwDesiredaccess,
DWORD dwShareMode,
LPSECUR99vY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
參數說明:
-lpFileName:要打開的文件名稱。對串口通信來說就是COM1或COM2。
-dwDesiredAccess:讀寫模式設置。此處應該用GENERIC_READ及GENERIC_WR99vE。
-dwShareMode:串口共享模式。此處不答應其他應用程序共享,應為0。
-lpSecurityAttributes:串口的安全屬性,應為0,表示該串口不可被子程序繼續。
-dwCreationDistribution:創建文件的性質,此處為OPEN_EXISTING.
-dwFlagsAndAttributes:屬性及相關標志,這里使用異步方式應該用FILE_FLAG_OVERLAPPED。
-hTemplateFile:此處為0。
操作說明:若文件打開成功,串口即可使用了,該函數返回串口的句柄,以后對串口操作時
即可使用該句柄。
舉例:HANDLE hComm;
hComm=CreateFile("COM1", //串口號
GENERIC_READGENERIC_WR99vE, //答應讀寫
0, //通訊設備必須以獨占方式打開
NULL, //無安全屬性
OPEN_EXISTING, //通訊設備已存在
FILE_FLAG_OVERLAPPED, //異步I/O
0); //通訊設備不能用模板打開
hComm即為函數返回的串口1的句柄。
3-CloseHandle()
用途:關閉串口

原型:BOOL CloseHandle(HANDLE hObjedt)
參數說明:
-hObjedt:串口句柄
操作說明:成功關閉串口時返回true,否則返回false
舉例:CloseHandle(hComm);
4-GetCommState()
用途:取得串口當前狀態
原型:BOOL GetCommState(HANDLE hFile,
LPDCB lpDCB);
參數說明:
-hFile:串口句柄
-lpDCB:設備控制塊(Device Control Block)結構地址。此結構中含有和設備相關的
參數。此處是與串口相關的參數。由于參數非常多,當需要設置串口參數
時,通常是先取得串口的參數結構,修改部分參數后再將參數結構寫入。
在此僅介紹少數的幾個常用的參數:
DWORD BaudRate:串口波特率
DWORD fParity:為1的話激活奇偶校驗檢查
DWORD Parity:校驗方式,值0~4分別對應無校驗、奇校驗、偶校驗、校驗
置位、校驗清零
DWORD ByteSize:一個字節的數據位個數,范圍是5~8
DWORD StopBits:停止位個數,0~2分別對應1位、1.5位、2位停止位
操作舉例:DCB ComDCB; //串口設備控制塊
GetCommState(hComm,&ComDCB);
5-SetCommState()
用途:設置串口狀態,包括常用的更改串口號、波特率、奇偶校驗方式、數據位數等
原型:BOOL SetCommState(HANDLE hFile,
LPDCB lpDCB);
參數說明:
-hFile:串口句柄
-lpDCB:設備控制塊(Device Control Block)結構地址。要更改的串口參數包含在此結構中。
操作舉例:DCB ComDCB;
GetCommState(hComm,&ComDCB);//取得當前串口狀態
ComDCB.BaudRate=9600;//更改為9600bps,該值即為你要修改后的波特率
SetCommState(hComm,&ComDCB;//將更改后的參數寫入串口
6-WriteFile()
用途:向串口寫數據
原型:BOOL WriteFile(HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);
參數說明:
-hFile:串口句柄
-lpBuffer:待寫入數據的首地址
-nNumberOfBytesToWrite:待寫入數據的字節數長度
-lpNumberOfBytesWritten:函數返回的實際寫入串口的數據個數的地址,利用此變量可判定
實際寫入的字節數和預備寫入的字節數是否相同。
-lpOverlapped:重疊I/O結構的指針
操作舉例:DWORD BytesSent=0;
unsigned char SendBytes[5]={1,2,3,4,5};
OVERLAPPED ov_Write;
ov_Write.Offset=0;
ov_Write.OffsetHigh=0;
WriteFile(hComm, //調用成功返回非零,失敗返回零
SendBytes, //輸出緩沖區
5, //預備發送的字符長度
&BytesSent, //實際發出的字符數
&ov_Write); //重疊結構
假如函數執行成功的話檢查BytesSent的值應該為5,此函數是WriteFile函數執行完畢后
自行填充的,利用此變量的填充值可以用來檢查該函數是否將所有的數據成功寫入串口
7-ReadFile()
用途:讀串口數據
原型:BOOL ReadFile(HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
lpNumberOfBytesRead,
lpOverlapped);
參數說明:
-hFile:串口句柄
-lpBuffer:存儲被讀出數據的首地址
-nNumberOfBytesToRead:預備讀出的字節個數
-NumberOfBytesRead:實際讀出的字節個數
-lpOverlapped:異步I/O結構,
操作舉例:unsigned char UCRxBuff[20];
COMSTAT ComStat;
DWORD dwError=0;
DWORD BytesRead=0;
OVERLAPPED ov_Read;
ov_Read.hEvent=CreateEvent(NULL, true, false, NULL);//必須創建有效事件

ClearCommError(hComm,&dwError,&ComStat);//檢查串口接收緩沖區中的數據個數

bResult=ReadFile(hComm, //串口句柄
ucRxBuff, //輸入緩沖區地址
ComStat.cbInQue, //想讀入的字符數
&BytesRead, //實際讀出的字節數的變量指針
&ov_Read); //重疊結構指針
假如當前串口中有5個字節數據的話,那么執行完ClearCommError()函數后,ComStat
結構中的ComStat.cbInQue將被填充為5,此值在ReadFile函數中可被直接利用。
8-ClearCommError()
用途:清除串口錯誤或者讀取串口現在的狀態
原型:BOOL ClearCommError(HANDLE hFile,
LPDWORD lpErrors,
LPCOMATAT lpStat
);
參數說明:
-hFile:串口句柄
-lpErrors:返回錯誤數值,錯誤常數如下:
1-CE_BREAK:檢測到中斷信號。意思是說檢測到某個字節數據缺少合法的停止位。
2-CE_FRAME:硬件檢測到幀錯誤。
3-CE_IOE:通信設備發生輸入/輸出錯誤。
4-CE_MODE:設置模式錯誤,或是hFile值錯誤。
5-CE_OVERRUN:溢出錯誤,緩沖區容量不足,數據將丟失。
6-CE_RXOVER:溢出錯誤。
7-CE_RXPAR99vY:硬件檢查到校驗位錯誤。
8-CE_TXFULL:發送緩沖區已滿。
-lpStat:指向通信端口狀態的結構變量,原型如下:
typedef struct _COMSTAT{
...
...
DWORD cbInQue; //輸入緩沖區中的字節數
DWORD cbOutQue;//輸出緩沖區中的字節數
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉木萨尔县| 邵阳市| 远安县| 略阳县| 敖汉旗| 宣威市| 邮箱| 临高县| 日照市| 南投市| 前郭尔| 安庆市| 金堂县| 永寿县| 任丘市| 酉阳| 酉阳| 苏尼特左旗| 江北区| 荔波县| 宜丰县| 怀安县| 克拉玛依市| 资阳市| 宽城| 南漳县| 新巴尔虎左旗| 嘉鱼县| 灯塔市| 高雄市| 襄汾县| 灵川县| 浦东新区| 化州市| 阳春市| 兰考县| 外汇| 增城市| 姜堰市| 江北区| 蒙自县|