日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WinCE中串口驱动及接口函数介绍

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WinCE中串口驱动及接口函数介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:ARM-WinCE

?

WinCE中,串口驅動實際上就是一個流設備驅動,具體架構如圖:

?

???????串口驅動本身分為MDD層和PDD層。MDD層對上層的Device Manager提供了標準的流設備驅動接口(COM_xxx)PDD層實現了HWOBJ結構及結構中若干針對于串口硬件操作的函數指針,這些函數指針將指向PDD層中的串口操作函數。DDSI是指MDD層與PDD層的接口,在串口驅動中實際上就是指HWOBJPDD層會傳給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
  • typedef?struct?__HW_VTBL???
  • ??
  • ????{??
  • ??
  • ????PVOID?(*HWInit)(ULONG?Identifier,?PVOID?pMDDContext);??
  • ??
  • ????ULONG?(*HWDeinit)(PVOID?pHead);??
  • ??
  • ????BOOL?(*HWOpen)(PVOID?pHead);??
  • ??
  • ????ULONG?(*HWClose)(PVOID?pHead);??
  • ??
  • ????ULONG?(*HWGetBytes)(PVOID?pHead,?PUCHAR?pTarget,?PULONG?pBytes);??
  • ??
  • ????PVOID?(*HWGetRxStart)(PVOID?pHead);??
  • ??
  • ????INTERRUPT_TYPE?(*HWGetIntrType)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWOtherIntrHandler)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWLineIntrHandler)(PVOID?pHead);??
  • ??
  • ????ULONG?(*HWGetRxBufferSize)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWTxIntrHandler)(PVOID?pHead);??
  • ??
  • ????ULONG?(*HWPutBytes)(PVOID?pHead,?PUCHAR?pSrc,?ULONG?NumBytes,?PULONG?pBytesSent);??
  • ??
  • ????BOOL?(*HWPowerOff)(PVOID?pHead);??
  • ??
  • ????BOOL?(*HWPowerOn)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWClearDTR)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWSetDTR)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWClearRTS)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWSetRTS)(PVOID?pHead);??
  • ??
  • ????BOOL?(*HWEnableIR)(PVOID?pHead,?ULONG?BaudRate);??
  • ??
  • ????BOOL?(*HWDisableIR)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWClearBreak)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWSetBreak)(PVOID?pHead);??
  • ??
  • ????BOOL?(*HWXmitComChar)(PVOID?pHead,?UCHAR?ComChar);??
  • ??
  • ????ULONG?(*HWGetStatus)(PVOID?pHead,?LPCOMSTAT?lpStat);??
  • ??
  • ????VOID?(*HWReset)(PVOID?pHead);??
  • ??
  • ????VOID?(*HWGetModemStatus)(PVOID?pHead,?PULONG?pModemStatus);??
  • ??
  • ????VOID?(*HWGetCommProperties)(PVOID?pHead,?LPCOMMPROP?pCommProp);??
  • ??
  • ????VOID?(*HWPurgeComm)(PVOID?pHead,?DWORD?fdwAction);??
  • ??
  • ????BOOL?(*HWSetDCB)(PVOID?pHead,?LPDCB?pDCB);??
  • ??
  • ????BOOL?(*HWSetCommTimeouts)(PVOID?pHead,?LPCOMMTIMEOUTS?lpCommTO);??
  • ??
  • ????BOOL?(*HWIoctl)(PVOID?pHead,?DWORD?dwCode,PBYTE?pBufIn,?DWORD?dwLenIn,?PBYTE?pBufOut,DWORD?dwLenOut,PDWORD?pdwActualOut);??
  • ??
  • }?HW_VTBL,?*PHW_VTBL;??
  • ?這些函數將在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函數打開串口時,該函數會被調用。

    ?????? pContextCOM_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函數讀串口的時候,該函數被調用。

    ?????? pContextCOM_Open函數返回的Handle

    ?????? pTargetBuffer:指向一個用于存放讀到數據的Buffer。

    ?????? BufferLengthpTargetBuffer指向的Buffer的大小。

    ?????? pBytesRead:實際讀到的數據的大小。

    ?

    2.6 ULONG COM_Write(HANDLE pContext, PUCHAR pSourceBytes, ULONG NumberOfBytes)

    ???????寫串口數據。應用程序調用WriteFile函數寫串口的時候,該函數被調用。

    ?????? pContextCOM_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控制,他會被應用層的一些串口函數調用來獲得或者設置串口的狀態。

    ?????? dwOpenDataCOM_Open函數返回的Handle

    ?????? dwCodeI/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_NONEINTR_LINEINTR_RXINTR_TXINTR_MODEM,這些值在Serhw.h中定義。

    ?????? pConText:指向HWInit函數返回的指針。

    ?

    3.11 VOID HWGetModemStatus(PVOID pContext, PULONG pModemStatus)

    ???????獲得Modem的狀態。

    ?????? pConText:指向HWInit函數返回的指針。

    ?????? pModemStatusModem的狀態。

    ?

    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控制

    ?????? dwOpenDataCOM_Open函數返回的Handle。

    ?????? dwCodeI/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中串口驱动及接口函数介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。