WinCE中串口驱动及接口函数介绍
作者:ARM-WinCE
?
在WinCE中,串口驅動實際上就是一個流設備驅動,具體架構如圖:
?
???????串口驅動本身分為MDD層和PDD層。MDD層對上層的Device Manager提供了標準的流設備驅動接口(COM_xxx),PDD層實現了HWOBJ結構及結構中若干針對于串口硬件操作的函數指針,這些函數指針將指向PDD層中的串口操作函數。DDSI是指MDD層與PDD層的接口,在串口驅動中實際上就是指HWOBJ,PDD層會傳給MDD層一個HWOBJ結構的指針,這樣MDD層就可以調用PDD層的函數來操作串口。
???????微軟針對于串口驅動提供了參考源代碼,可以在下面的目錄下找到:”/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/SERIAL”。
???串口驅動的結構也就是這樣了,下面介紹相關的驅動中的接口。
1. HWOBJ結構?
??? 在串口驅動中,HWOBJ結構中的函數實現了對串口硬件的操作,并在MDD層被調用。可以說,該結構描述了串口設備的所有特性,先來介紹一下該結構,具體定義如下: typedef struct __HWOBJ {?? ULONG BindFlags;?? DWORD dwIntID;?? PHW_VTBL pFuncTbl; } HWOBJ, *PHWOBJ;BindFlags:用于控制MDD層如何來處理IST,具體值如下:???????????
???????????????????????THREAD_IN_PDD:MDD層不處理,中斷在PDD層處理。???????????
???????????????????????THREAD_AT_INIT:在驅動初始化的時候,MDD層啟動IST。???????????
?????????????????????? THREAD_AT_OPEN:在驅動被Open的時候,MDD層啟動IST。
dwInitID: 系統的中斷號 pFuncTbl: 指向一個PHW_VTBL結構,該結構中包含一個函數指針列表,這些函數指針指向串口硬件操作函數,用于操作串口。
?
[css]?view plaincopy?這些函數將在PDD層實現,用于實際的串口硬件操作。
?
2. MDD層API
MDD層向上提供了流設備接口,這部分代碼微軟已經實現,用于管理串口。雖然我們不需要實現這部分,但是還是對相應的接口做個簡單介紹。
?
2.1HANDLE COM_Init(ULONG Identifier):
???????初始化串口設備,該函數通過讀取注冊表獲得串口設備號,并獲得相應的HWOBJ的結構指針,通過該指針調用PDD層的硬件初始化函數初始化串口。
Identifier:如果驅動被設備管理器加載,那么這個參數將包含一個注冊表鍵值在” HKEY_LOCAL_MACHINE/Drivers/Active”路徑下。如果驅動是通過調用RegisterDevice函數來加載的,那么這個值等于dwInfo的值。在COM_Init中,會先打開該鍵值,用返回的句柄來查詢DeviceArrayIndex值,并根據該值獲得PDD層的HWOBJ結構指針。
?
2.2 BOOL COM_Deinit(void):
???????卸載串口設備,該函數中主要做了一些釋放資源的操作。也可以被DeregisterDevice函數調用。
?
2.3 HANDLE COM_Open(HANDLE pContext, DWORD AccessCode, DWORD ShareMode):
???????打開串口設備。應用程序調用CreateFile函數打開串口時,該函數會被調用。
?????? pContext:COM_Init函數返回的Handle。
?????? AccessCode:設置訪問模式,比如共享讀或者是讀寫模式。
?????? ShareMode:在參數從應用程序中的CreateFile函數中傳來,表示是否支持獨自占有。
?
2.4 BOOL COM_Close(DWORD pContext):
???????關閉串口設備。應用程序調用CloseHandle函數關閉串口時,該函數會被調用。
?????? pContext:該參數為COM_Open函數返回的Handle。
?
2.5 ULONG COM_Read(HANDLE pContext, PUCHAR pTargetBuffer, ULONG BufferLength, PULONG pBytesRead):
???????讀串口數據。應用程序調用ReadFile函數讀串口的時候,該函數被調用。
?????? pContext:COM_Open函數返回的Handle。
?????? pTargetBuffer:指向一個用于存放讀到數據的Buffer。
?????? BufferLength:pTargetBuffer指向的Buffer的大小。
?????? pBytesRead:實際讀到的數據的大小。
?
2.6 ULONG COM_Write(HANDLE pContext, PUCHAR pSourceBytes, ULONG NumberOfBytes):
???????寫串口數據。應用程序調用WriteFile函數寫串口的時候,該函數被調用。
?????? pContext:COM_Open函數返回的Handle。
?????? pSourceBytes:指向一個Buffer,該Buffer包含要寫入串口的數據。
?????? NumberOfBytes:要寫入串口的數據的大小。
?
2.7 BOOL COM_PowerUp(HANDLE pContext):
???????該函數主要用于串口設備從suspend模式恢復到正常模式。
?????? pContext:串口設備的Handle。
?
2.8 BOOL COM_PowerDown(HANDLE pContext):
???????該函數主要用于串口設備從正常模式進入suspend狀態。
?????? pContext:串口設備的Handle。
?
2.9 BOOL COM_IOControl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, DOWRD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut):
???????該函數主要實現了一些串口的IO控制,他會被應用層的一些串口函數調用來獲得或者設置串口的狀態。
?????? dwOpenData:COM_Open函數返回的Handle。
?????? dwCode:I/O控制操作碼。
?????? pBufIn:傳入的Buffer。
?????? dwLenIn:傳入的Buffer的大小。
?????? pBufOut:傳出的Buffer。
?????? dwLenOut:傳出的Buffer的大小。
?????? pdwActualOut:實際傳出的數據的大小。
??? 對于串口驅動來說,COM_IOControl函數非常有用,應用程序通過調用COM_IOControl函數并傳入不同的操作碼,實現了控制串口的功能。這里列舉一些操作碼如下:
| 操作碼 | 解釋 |
| IOCTL_SERIAL_CLR_DTR | 設置串口的DTR管腳為低 |
| IOCTL_SERIAL_CLR_RTS | 設置串口的RTS管腳為低 |
| IOCTL_SERIAL_DISABLE_IR | 禁用串口的紅外模式 |
| IOCTL_SERIAL_ENABLE_IR | 啟用串口的紅外模式 |
| IOCTL_SERIAL_GET_COMMSTATUS | 清除串口設備的異常標記并返回當前狀態 |
| IOCTL_SERIAL_GET_DCB | 獲得串口的DCB結構 |
| IOCTL_SERIAL_GET_MODEMSTATUS | 獲得當前Modem的控制寄存器值 |
| IOCTL_SERIAL_GET_PROPERTIES | 重新獲得當前串口設備的硬件屬性 |
| IOCTL_SERIAL_GET_TIMEOUTS | 獲得串口設備的讀寫超時 |
| IOCTL_SERIAL_GET_WAIT_MASK | 獲得等待事件標記掩碼 |
| IOCTL_SERIAL_IMMEDIATE_CHAR | 在發送數據前,先發送一個特定的字符 |
| IOCTL_SERIAL_PURGE | 清除串口中的輸入輸出Buffer,也可以中止未進行的讀寫操作 |
| IOCTL_SERIAL_SET_BREAK_OFF | 串口通訊從中斷狀態恢復 |
| IOCTL_SERIAL_SET_BREAK_ON | 設置串口為中斷狀態,停止發送接收數據 |
| IOCTL_SERIAL_SET_DCB | 設置串口的DCB結構 |
| IOCTL_SERIAL_SET_DTR | 設置串口的DTR管腳為高 |
| IOCTL_SERIAL_SET_QUEUE_SIZE | 目前,在微軟的MDD層代碼中沒有支持 |
| IOCTL_SERIAL_SET_RTS | 設置串口的RTS管腳為高 |
| IOCTL_SERIAL_SET_TIMEOUTS | 設置串口的讀寫操作超時 |
| IOCTL_SERIAL_SET_WAIT_MASK | 設置等待事件標記掩碼 |
| IOCTL_SERIAL_SET_XOFF | 軟件流控模式下,終止數據傳輸 |
| IOCTL_SERIAL_SET_XON | 軟件流控模式下,啟動數據傳輸 |
| IOCTL_SERIAL_WAIT_ON_MASK | 等待一個與事件掩碼中匹配的事件 |
???????上述的操作碼,很多都會被應用程序調用,看看MDD層中的實現,其中一些也是調用了PDD層下的函數來完成對串口硬件的設置。
3. PDD層API
?????? PDD層的函數主要是實現了對串口硬件的操作,函數比較多,不過還是都說一下吧:
3.1 PHWOBJ GetSerialObject(DWORD DeviceArrayIndex):
???????該函數返回一個指向HWOBJ結構的指針,該結構包含了相關硬件接口函數的函數指針。
?????? DeviceArrayIndex:串口索引號
?
3.2 VOID HWClearBreak(PVOID pContext):
???????清除串口中斷狀態,用于串口從中斷狀態恢復。
?????? pConText:指向HWInit函數返回的指針。
?
3.3 VOID HWClearDTR(PVOID pContext):
???????設置串口的DTR管腳為低
?????? pConText:指向HWInit函數返回的指針。
?
3.4 VOID HWClearRTS(PVOID pContext):
???????設置串口的RTS管腳為低
?????? pConText:指向HWInit函數返回的指針。
?
3.5 VOID HWClose(PVOID pContext):
???????關閉由HWInit函數初始化的設備
?????? pConText:指向HWInit函數返回的指針。
?
3.6 VOID HWDeinit(PVOID pContext):
???????當設備驅動被卸載的時候,該函數被調用。
?????? pConText:指向HWInit函數返回的指針。
?
3.7 VOID HWDisableIR(PVOID pContext):
???????禁用串口的紅外模式
?????? pConText:指向HWInit函數返回的指針。
?
3.8 VOID HWEnableIR(PVOID pContext):
???????啟用串口的紅外模式
?????? pConText:指向HWInit函數返回的指針。
?
3.9 VOID HWGetCommProperties(PVOID pContext, LPCOMMPROP pCommProp):
???????重新獲得當前串口設備的硬件屬性。
?????? pConText:指向HWInit函數返回的指針。
?????? pCommProp:指向一個COMMPROP結構,該結構描述硬件設備的屬性,比如最大波特率,停止位以及流控模式等。
?
3.10 INTERRUPT_TYPE HWGetIntrType(PVOID pContext):
???????獲得當前的中斷類型。返回值可以是INTR_NONE,INTR_LINE,INTR_RX,INTR_TX和INTR_MODEM,這些值在Serhw.h中定義。
?????? pConText:指向HWInit函數返回的指針。
?
3.11 VOID HWGetModemStatus(PVOID pContext, PULONG pModemStatus):
???????獲得Modem的狀態。
?????? pConText:指向HWInit函數返回的指針。
?????? pModemStatus:Modem的狀態。
?
3.12 ULONG HWGetRxBufferSize(PVOID pContext):
???????獲得串口硬件接收Buffer的大小。
?????? pConText:指向HWInit函數返回的指針。
?
3.13 PVOID HWGetRxStart(PVOID pContext):
???????返回硬件接收Buffer的起始位置。
?????? pConText:沒有被使用。
?
3.14 ULONG HWGetStatus(PVOID pContext, LPCOMSTAT lpStat):
???????獲得硬件狀態信息。
?????? pConText:指向HWInit函數返回的指針。
?????? lpStat:指向COMSTAT結構,該結構描述硬件狀態。
?
3.15 PVOID HWInit(ULONG Identifier, PVOID pMDDContext, PHWOBJ pHWObj):
???????初始化串口硬件設備。
?????? Identifier:該驅動的鍵值,從MDD層傳到PDD層。
?????? pMDDContext:指向MDD層串口相關信息,從MDD層傳給PDD層。
?????? pHWObj:指向HWOBJ結構。
?
3.16 BOOL HWIoctl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut):
???????執行I/O控制
?????? dwOpenData:COM_Open函數返回的Handle。
?????? dwCode:I/O控制操作碼。
?????? pBufIn:傳入的Buffer。
?????? dwLenIn:傳入的Buffer的大小。
?????? pBufOut:傳出的Buffer。
?????? dwLenOut:傳出的Buffer的大小。
?????? pdwActualOut:實際傳出的數據的大小。
?
3.17 VOID HWLineIntrHandler(PVOID pContext):
???????線路狀態信息中斷處理函數
?????? pContext:指向HWInit函數返回的指針。
?
3.18 VOID HWModemIntrHandler(PVOID pContext):
???????該函數檢測Modem狀態,并對相關中斷進行處理。
?????? pContext:指向HWInit函數返回的指針。
?
3.19 BOOL HWOpen(PVOID pContext):
???????打開串口設備,可以在該函數中打開串口硬件供電。
?????? pContext:指向HWInit函數返回的指針。
?
3.20 VOID HWOtherHandler(PVOID pContext):
???????該函數已經被HWModemIntrHandler取代,實現與HWModemIntrHandler一樣。
?????? pContext:指向HWInit函數返回的指針。
?
3.21 BOOL HWPostInit(PVOID pContext):
???????該函數在COM_Init中被調用,但是在串口數據,硬件以及IST初始化后備調用。
?????? pContext:指向HWInit函數返回的指針。
?
3.22 BOOL HWPowerOff(PVOID pContext):
???????串口硬件進入Suspend模式。
?????? pContext:指向HWInit函數返回的指針。
?
3.23 BOOL HWPowerOn(PVOID pContext):
???????串口硬件從Suspend模式恢復到工作模式。
?????? pContext:指向HWInit函數返回的指針。
?
3.24 VOID HWPurgeComm(PVOID pContext, DWORD fdwAction):
???????清除串口硬件buffer的信息。
?????? pContext:指向HWInit函數返回的指針。
???????fdwAction:
????????????????????????PURGE_TXABORT:終止寫操作立即返回。
????????????????????????PURGE_RXABORT:終止讀操作立即返回。
????????????????????????PURGE_TXCLEAR:清空寫Buffer。
????????????????????????PURGE_RXCLEAR:清空讀Buffer。
?
3.25 ULONG HWPutBytes(PVOID pContext, PUCHAR pSrc, ULONG NumberOfBytes, PULONG pBytesSent):
???????通過寫數據到硬件中來直接發送數據。
?????? pContext:指向HWInit函數返回的指針。
?????? pSrc:指向要發送的數據Buffer。
?????? NumberOfBytes:要發送的數據長度。
?????? pBytesSent:實際發送的數據長度。
?
3.26 VOID HWReset(PVOID pContext):
???????復位串口硬件。
?????? pContext:指向HWInit函數返回的指針。
?
3.27 ULONG HWRxIntrHandler(PVOID pContext, PUCHAR pTargetBuffer, PULONG pByteNumber):
???????接收數據中斷處理函數。
?????? pContext:指向HWInit函數返回的指針。
?????? pTargetBuffer:接收數據Buffer。
?????? pByteNumber:接收數據Buffer的大小。
?
3.28 VOID HWSetBreak(PVOID pContext):
???????設置串口為中斷狀態,停止發送接收數據。
?????? pContext:指向HWInit函數返回的指針。
?
3.29 BOOL HWSetCommTimeouts(PVOID pContext, LPCOMMTIMEOUT lpCommTO):
???????設置串口操作超時時間。
?????? pContext:指向HWInit函數返回的指針。
?????? lpComTO:指向一個超時的結構,其中包括讀寫超時。
?
3.30 BOOL HWSetDCB(PVOID pContext, LPDCB pDCB):
???????設置串口硬件設備信息。
?????? pContext:指向HWInit函數返回的指針。
?????? pDCB:指向DCB結構,該結構描述相關的串口硬件設置信息。
?
3.31 VOID HWSetDTR(PVOID pContext):
???????設置串口的DTR管腳為高
?????? pContext:指向HWInit函數返回的指針。
?
3.32 VOID HWSetRTS(PVOID pContext):
???????設置串口的RTS管腳為高
?????? pContext:指向HWInit函數返回的指針。
?
3.23 VOID HWTxIntrHandler(PVOID pContext, PUCHAR pSourceBuffer, PULONG pByteNumber):
???????串口發送中斷處理函數。
?????? pContext:指向HWInit函數返回的指針。
???????pSourceBuffer:發送數據Buffer。
???????pByteNumber:最大能夠發送的數據的大小。函數返回時,指向實際發送的數據的大小。
?
3.24 VOID HWXmitComChar(PVOID pContext, UCHAR ComChar):
???????發送一個字符
?????? pContext:指向HWInit函數返回的指針。
?????? ComChar:要被發送的字符。
?
?
?
??? 上述這些函數不一定串口驅動中都會被用到,根據具體要求來實現吧。在這里我還要給自己找條退路,由于本人并未實現上面的所有函數,一些是通過讀文檔和看源碼分析得來,而且本人水平有限,如果有錯誤的地方,請諒解并歡迎指正。
總結
以上是生活随笔為你收集整理的WinCE中串口驱动及接口函数介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平安信用卡密码输错3次怎么办
- 下一篇: Windows CE下流驱动的动态加载