亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2128 | 回復: 0
打印 上一主題 下一主題

串口通信—Winbase.h—描述 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-05-16 12:15 |只看該作者 |倒序瀏覽
用于串口通信的函數(shù)和結(jié)構(gòu)在Winbase.h頭文件中定義。
函數(shù) 描述
CreateFile 打開串行口
GetCommState 用指定通信設備的當前控制設置填充設備控制塊(DCB結(jié)構(gòu))
SetCommState 按照DCB結(jié)構(gòu)的說明配置通信設備。這個函數(shù)重新初始化所有硬件
和控制設備,但不清空I/O隊列
GetCommTimeouts 獲得指定通信設備上所有讀/寫操作的超時參數(shù)
SetCommTimeouts 設置指定通信設備上所有讀/寫操作的超時參數(shù)
WriteFile 向串行口寫數(shù)據(jù),這樣將把數(shù)據(jù)傳送給串行連接另一端的設備
ReadFile 從串行口讀數(shù)據(jù),這樣將從串行連接另一端的設備接收數(shù)據(jù)
SetCommMask 指定為通信設備監(jiān)視的一組事件
GetCommMask 獲得指定通信設備的事件掩碼值
WaitCommEvent 等待指定通信設備的事件的發(fā)生。WaitCommEvent函數(shù)監(jiān)視的事件
包含在與設備句柄相關(guān)聯(lián)的事件掩碼中
EscapeCommFunction 指導指定通信設備執(zhí)行擴展功能。通常用于將串行口設置為IR模式
ClearCommBreak 恢復指定通信設備的字符傳輸,并設置傳輸線路為不可中斷狀態(tài)
ClearCommError 獲得通信錯誤數(shù)據(jù),并報告指定通信設備的當前狀態(tài)
打開端口
CreateFile函數(shù)用于打開串行口,因為硬件供應商和設備驅(qū)動程序開發(fā)者可以隨意命名端口,所以應用程序應該列出所有可用端口,從而使用戶能夠指定要打開的端口。如果端口不存在,則CreateFile函數(shù)返回ERROR_FILE_NOT_FOUND,而且應該通知用戶端口不可用。
打開串行口
1 在第一個參數(shù)lpzPortName指向的通信口后插入一個冒號。例如,指定“COM1:”為通信端口。
2 指定dwShareMode參數(shù)為0。通信端口不能像文件一樣被共享。
3 在dwCreationDisposition參數(shù)中指定OPEN_EXISTING。這個標志是必須的。
4 指定dwFlagsAndAttributes參數(shù)為0。Windows CE只支持非重疊I/0.
下面的代碼段說明了如何打開串行通信端口。
hPort=CreateFile(lpszPortName, //指出通信端口
GENERIC_READ|GENERIC_WRITE, //讀寫模式
0, //共享模式
NULL, //安全屬性
OPEN_EXISTING, //如何打開服務端口
0, //端口屬性
NULL); //端口屬性句柄的拷貝
配置串行口
打開串行口后,一般情況下,應用程序需要改變?nèi)笔≡O置。用GetCommState函數(shù)可以獲得缺省設置,用SetCommState函數(shù)可以設置新的端口設置。
另外,端口配置還包括用COMMTIMEOUTS結(jié)構(gòu)設置讀/寫操作的超時值。當發(fā)生超時時,ReadFile或WriteFile函數(shù)返回成功傳輸?shù)木唧w字符數(shù)。
配置串行口
DCB PortDCB;
PortDCB.DCBlength=sizeof(DCB);
GetCommState(hPort,&PortDCB);
PortDCB.BaudRate=9600; //波特率
PortDCB.fBinary=TRUE; //只支持二進制串行傳輸模式
PortDCB.fParity=TRUE; //啟用奇偶校驗
PortDCB.fOutxCtsFlow=FALSE; //TRUE是由CTS線來控制端口的輸出
PortDCB.fOutxDsrFlow=FALSE; //TRUE是由DSR線來控制端口的輸出
PortDCB.fDtrControl=DTR_CONTROL_ENABLE; //DTR_CONTROL_DISABLE:
禁用DTR(Data Terminal Ready)線并保持此狀態(tài);
DTR_CONTROL_ENABLE;
啟用DTR(Data Terminal Ready)線
DTR_CONTROL_HANDSHAKE
根據(jù)接收緩沖區(qū)數(shù)據(jù)的數(shù)量告訴串行驅(qū)動程序切換DTR線狀態(tài)
PortDCB.fDsrSensitivity=FALSE; //TRUE為端口將忽略任何輸入的字節(jié),除非端口DSR線被啟用
PortDCB.fTXContinueOnXoff=TRUE; //TRUE為如接收緩沖區(qū)已滿且驅(qū)動程序已傳送XOFF字符,
將使驅(qū)動程序停止傳輸字符
PortDCB.fOutX=FALSE; //TRUE為指定XON/XOFF控制被用于控制串行輸出
PortDCB.fInX=FALSE; //TRUE為指定XON/XOFF控制由輸入串行流使用
PortDCB.fErrorChar=FALSE; //Windows CE串行驅(qū)動程序默認忽略該字段
PortDCB.fNull=FALSE; //TRUE為使串行驅(qū)動程序忽略接收到的空字節(jié)
PortDCB.fRtsControl=RTS_CONTROL_ENABLE; //RTS_CONTROL_DISABLE表示當端口打開時RTS(Request and Send)行
將禁用
//RTS_CONTROL_ENABLE表示當端口打開時RTS行將啟用
//RTS_CONTROL_HANDSHAKE表示RTS線由驅(qū)動程序控制,輸入緩沖區(qū)
不到半滿,則RTS線將被啟用,否則將被禁用
//RTS_CONTROL_TOGGLE表示如果在輸出緩沖區(qū)有字節(jié)要被傳輸,則
驅(qū)動程序?qū)⒂肦TS線,否則將禁用該線
PortDCB.fAbortOnError=FALSE; //出現(xiàn)讀/寫錯誤并不終止
PortDCB.ByteSize=8; //指定每字節(jié)的位數(shù)
PortDCB.Parity=NOPARITY; //奇偶字段,EVENPARITY、MARKPARITY、NOPARITY、ODDPARITY、SPACERITY
PortDCB.StopBits=ONESTOPBIT; //停止位,每字節(jié)一位(ONESTOPBIT)、一位半(ONE5STOPBITS)、
兩位(TWOSTOPBITS)。
if(!SetCommState(hPort,&PortDCB))
{
MessageBox(hMainWnd,TEXT("Unable to configure the serial port"),TEXT("Error"),MB_OK);
dwError=GetLastError();
return FALSE;
}
配置超時值
每次打開通信端口時應用程序都必須用COMMTIMEOUTS結(jié)構(gòu)設置通信超時值。如果不配置這個結(jié)構(gòu),則端口使用驅(qū)動程序提供的缺省超時值,或者使用上一個通信應用程序的超時值。通過假定特殊的與實際設置不同的超時設置,應用程序可以執(zhí)行永遠不能完成的讀/寫操作,或者執(zhí)行完成過于頻繁的讀/寫操作。
當讀/寫操作發(fā)生超時時,操作結(jié)束。而且ReadFile和WriteFile函數(shù)并不返回錯誤值。若想確定某個操作是否發(fā)生了超時,可以驗證實際傳輸?shù)淖止?jié)數(shù)是否小于請求的字節(jié)數(shù)。例如,如果ReadFile函數(shù)返回TRUE,但讀的字節(jié)數(shù)小于請求的字節(jié)數(shù),則這個操作發(fā)生了超時。
配置串行口的超時值
1 調(diào)用GetCommTimeouts函數(shù)或者手工設置成員來初始化COMMTIMEOUTS結(jié)構(gòu)。
2 用ReadIntervalTimeout成員指定在不發(fā)生超時的情況下兩個字符間允許經(jīng)過的最大毫秒數(shù)。
3 用ReadTotalTimeoutMultiplier成員指定讀超時乘子。對于每個讀操作,這個乘子被乘以讀操作期望接收到的字節(jié)數(shù)。
4 用ReadTotalTimeoutConstant成員指定讀超時常數(shù)。這個成員表示的毫秒數(shù)被加到讀取的總字節(jié)數(shù)與 ReadTotalTimeoutMultiplier的乘積上。最后得到的結(jié)果是讀操作發(fā)生超時前必須經(jīng)過的毫秒數(shù)。
5 用WriteTotalTimeoutMultiplier成員指定寫超時乘子。對于每個寫操作,這個乘子被乘以寫操作期望接收的字節(jié)數(shù)。
6 用WriteTotalTimeoutConstant成員指定寫超時常數(shù)。這個成員表示的毫秒數(shù)被加到總字節(jié)數(shù)與WriteTotalTimeoutMultiplier的 乘積上。最后得到的結(jié)果是寫操作發(fā)生超時前必須經(jīng)過的毫秒數(shù)。
7 調(diào)用SetCommTimeouts函數(shù)激活端口超時設置。
為了有助于多任務處理,通常需要配置COMMTIMEOUTS結(jié)構(gòu),以便ReadFile函數(shù)能夠立即返回讀到的字符。要做到這一點,可以設置ReadIntervalTimeout為MAXWORD,設置ReadTotalTimeoutMultiplier和ReadTotalTimeoutMultiplier為0。
寫串行口
WriteFile函數(shù)通過串行連接向另一臺設備傳輸數(shù)據(jù)。調(diào)用這個函數(shù)之前,應用程序必須打開和配置串行口。
因為Windows CE不支持重疊I/O(也稱為異步I/O),所以主線程或者任何創(chuàng)建窗口的線程都不應該試圖向串行口寫大量數(shù)據(jù)。這樣的線程將被阻塞,因而不能管理消息隊列。應用程序可以通過創(chuàng)建多個線程處理讀/寫操作以模擬重疊I/O。為了協(xié)調(diào)多個線程,應用程序可以調(diào)用WaitCommEvent函數(shù)阻塞線程,直至發(fā)生特定的通信事件。
寫串行口
1 用CreateFile函數(shù)返回的句柄。
2 用lpBuffer參數(shù)指定要寫的數(shù)據(jù)的指針。這一數(shù)據(jù)通常是二進制數(shù)據(jù)或者字符數(shù)據(jù)。
3 用nNumberOfBytesToWrite參數(shù)指定要寫的字符數(shù)。對于基于Windows CE的設備,通常寫一個字符,因為應用程序必須將Unicode 字符轉(zhuǎn)換為ASCII字符,以便將文本傳輸?shù)酱羞B接另一端的設備。
4 用lpNumberOfBytesWritten參數(shù)指定實際寫的字節(jié)數(shù)的指針。WriteFile函數(shù)填充這個變量,以便應用程序能夠確定數(shù)據(jù)是否已 被傳輸。
5 lpOverlapped參數(shù)必須是NULL。
讀串行口
ReadFile函數(shù)從串行連接另一端的設備獲取數(shù)據(jù)。參數(shù)與WriteFile相同。
通常情況下,讀操作是一個獨立的線程,他總是隨時準備處理到達串行口的數(shù)據(jù)。通信事件通知讀線程串行口有數(shù)據(jù)可讀。讀線程通常一次讀一個字節(jié)(每讀一個字節(jié)調(diào)用一次ReadFile函數(shù)),直至讀完所有數(shù)據(jù),然后讀線程等待下一個通信事件。
使用通信事件
通信事件是當發(fā)生重要事件時Windows CE向應用程序發(fā)送的通知:應用程序可以用WaitCommEvent函數(shù)阻塞線程,直至特定事件發(fā)生;用SetCommMask函數(shù)可以指定繼續(xù)處理前必須發(fā)生的事件。如果指定了多個事件,則任何一個指定事件的發(fā)生將導致WaitCommEvent函數(shù)返回。
例如,這種機制使應用程序能夠知道數(shù)據(jù)何時到達串行口。通過等待表示數(shù)據(jù)到達的通信事件,應用程序可以避免因調(diào)用ReadFile函數(shù)等待數(shù)據(jù)到達而阻塞串行口。只有當有數(shù)據(jù)可讀時才應該調(diào)用ReadFile函數(shù)。
事件 描述
EV_BREAK 輸入中發(fā)生中斷
EV_CTS CTS信號狀態(tài)發(fā)生變化
EV_DSR DSR信號狀態(tài)發(fā)生變化
EV_ERR 發(fā)生線路狀態(tài)錯誤,線路狀態(tài)錯誤包括CE_FRAME,CE_OVERRUN和CE_RXPARITY
EV_RING 檢測到振鈴指示
EV_RLSD 接收線路信號檢測的信號狀態(tài)發(fā)生變化
EV_RXCHAR 接收到字符,并置于輸入緩沖區(qū)中
EV_RXFLAG 接收到事件字符,并置于輸入緩沖區(qū)中
EV_TXEMPTY 輸出緩沖區(qū)中的最后一個字符已被發(fā)送
使用通信事件
1 調(diào)用SetCommMask函數(shù)指定要查找的事件。
2 調(diào)用WaitCommEvent函數(shù),并指定導致這個函數(shù)返回的事件。當應用程序指定多個事件時,lpEvtMask參數(shù)指向表示導致 WaitCommEvent函數(shù)返回的事件的變量。
3 WaitCommEvent函數(shù)返回后,循環(huán)調(diào)用ReadFile函數(shù),直至讀完所有接收到的數(shù)據(jù)。
4 再次調(diào)用SetCommMask函數(shù),指定要查找的事件。
SetCommMask函數(shù)通常是應用程序在監(jiān)視串行口和讀數(shù)據(jù)的循環(huán)中第一個調(diào)用的函數(shù)。下面的代碼說明了如何將通信事件用于這個目的。
BYTE Byte;
DWORD dwBytesTransferred;
SetCommMask(hPort,EV_RXCHAR|EV_CTS|EV_DSR|EV_RLSD|EV_RING);
while(hPort!=INVALID_HANDLE_VALUE)
{
WaitCommEvent(hPort,&dwCommModemStatus,0);
SetCommMask(hPort,EV_RXCHAR|EV_CTS|EV_DSR|EV_RING);
if(dwCommModemStatus & EV_RXCHAR)
{
do
{
ReadFile(hPort,&Byte,1,&dwBytesTransferred,0);
if(dwBytesTransferred==1)
ProcessChar(Byte);
}while(dwBytesTransferred==1);
}
}
最后關(guān)閉串行口
CloseHandle(hPort);

本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/85282/showart_1931135.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP