国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

WinCE串口驅動分析

發布時間:2011-4-26 10:16    發布者:eechina
關鍵詞: WINCE
來自:微軟嵌入式中文社區(http://www.msembed.com/)郝明

串行通訊接口是目前十分流行的通訊接口之一,串口通訊也已是普遍的標準而被大家廣為熟悉。

基本架構

在WinCE中,串口的驅動實現是有固定模型的,其串口模型遵循ISO/OSI網絡通訊模型。在典型的應用中,serialAPI與間接通過TAPI或直接與ActiveSync交互,組成CE網絡的一部分。其實整個驅動模型是相當復雜的,好在驅動僅僅使用到SerialAPI這一層,在這個層次上串口的行為相對比較簡單。在WinCE中,串口驅動模型是作為Stream來實現的(即:流設備驅動),其架構如圖所示:


串口驅動本身分為MDD層和PDD層。

MDD提供框架性的實現,負責提供OS所需的基本實現,它對上層的設備管理器,提供了標準的流設備驅動接口(COM_xxx);而PDD提供了對硬件操作相應的代碼,它實現了HWOBJ結構及結構中若干針對于串口硬件操作的函數指針。

DDSI是指MDD與PDD兩個部分之間的接口,這個接口是人為的規定的,在串口驅動中實際上就是指HWOBJ,PDD層會傳給MDD層一個HWOBJ的結構指針,這樣MDD層就可以調用PDD層的函數來操作串口。在實際的驅動應用中僅僅需要實現HWOBJ相關的一系列函數,而無需從驅動頂層完全開發。

通常的串行連接有3wire和9wire兩種。3wire的接線方式下定義了發送、接收和地三根連接。而在9wire中將串行連接定義為如下形式。

  
針號
  
  
1
  
  
2
  
  
3
  
  
4
  
  
5
  
  
6
  
  
7
  
  
8
  
  
9
  
  
縮寫
  
  
DCD
  
  
RXD
  
  
TXD
  
  
DTR
  
  
GND
  
  
DSR
  
  
RTS
  
  
CTS
  
  
DELL
  
  
功能說明
  
  
數據載波檢測
  
  
接收數據
  
  
發送數據
  
  
數據終端就緒
  
  
信號地
  
  
數據設備就緒
  
  
請求發送
  
  
清除發送
  
  
振鈴指示
  

這就是在原3wire的基礎上增加了DCD、DTR、DSR、RTS、CTS、DELL六個控制線。其中RTS/CTS用于流控制,另外的DCD和DELL則留作連接modem使用。有了專門的硬件流控制引腳也就使得流控制成為可能,以完成收發兩端的匹配使得數據可以可靠的傳輸,即實現了流控制,保障了數據傳輸的完備性。

其他幾個引腳都是與modem相關的,DSR數據裝置準備好用于表明MODEM處于可以使用的狀態。

函數分析

1、HWOBJ

HWOBJ是相應的硬件設備操作的抽象集合,實現了對串口硬件的操作,并在MDD層被調用。

typedef struct __HWOBJ {
ULONG BindFlags;.
DWORD dwIntID;
PHW_VTBL pFuncTbl;
} HWOBJ, *PHWOBJ;

其中,BandFlags用于控制MDD層指定IST的啟動時間,MDD正是通過這些函數來訪問具體的PDD操作。

dwInitID是系統的中斷號。

pFuncTbl則是指向一個PHW_VTBL結構,該結構中包含一個函數指針列表,這些函數指針指向串口硬件操作函數,用于操作串口。



2、MDD

MDD層向上提供了流設備接口,用于管理串口,由Device.exe直接調用。

*   COM_Init (ULONG Identifier):
它是該驅動的初始化函數,通過硬件抽象接口HWInit初始化硬件。如果驅動被設備管理器加載,參數Identifier包含一個注冊表鍵值在“HKEY_LOCAL_MACHINE\Drivers\Active”的路徑下。

*    COM_Deinit(void):
當驅動被稱被卸下的時候該事件啟動,用作與COM_Init相反的操作。停止在MDD中的所有IST,釋放內存資源和臨界區等系統資源。

*    COM_Open(HANDLE pContext, DWORD AccessCode, DWORD ShareMode):
COM_Oepn在CreateFile后被調用,用于以讀/寫模式打開設備,并初始化所需要的空間/資源等,創建相應的實例。Open操作完成后,驅動就進入了工作狀態。

*  COM_Close(DWORD pContext):
COM_Close釋放COM_Open所使用的系統資源,停止IST線程,恢復驅動狀態。

*  COM_Read(HANDLE pContext, PUCHAR pTargetBuffer,
ULONG BufferLength, PULONG pBytesRead):
COM_Read是獲取串口所接收到數據的操作,在前面的IST中沒有看到對RX buffer進行修改Read標記的操作,也就是這兒來完成的。

*  COM_Write(HANDLE pContext, PUCHAR pSourceBytes,
ULONG NumberOfBytes):
COM_Write是與COM_Read相對應的操作,是寫串口數據的。應用程序調用WriteFile函數寫串口的時候,該函數被調用。在程序的開始,同樣也是參數檢查,內容與COM_Read一致。其中pContext參數是COM_Open函數返回的Handle。pSourceBytes指向一個Buffer,該Buffer包含要寫入串口的數據。NumberOfBytes表示要寫入串口的數據的大小。

*  COM_PowerUp/ COM_PowerDown (HANDLE pContext):
這兩個函數的調用都由CE的電源事件來引發,MDD并沒有對這兩個函數進行處理,僅僅是將其傳遞給PDD。

*  COM_IOControl (DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, DOWRD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut):
該函數主要實現了一些串口的IO控制,他會被應用層的一些串口函數調用來獲得或者設置串口的狀態。

3、PDD

實際上,在PDD層的主要工作就2個:一是控制硬件;二是和上層打好關系。先說上層接口,上層用了GetSerialHead()來獲得接口,所以PDD里面要實現GetSerialHead()的函數,并且將接口返回給上層。

GetSerialObject( DWORD DeviceArrayIndex )
{
    PHWOBJ pSerObj;
    pSerObj=(PHWOBJ)LocalAlloc( LPTR ,sizeof(HWOBJ) );
    if ( !pSerObj )
        return (NULL);
    pSerObj->BindFlags = THREAD_IN_PDD;
    pSerObj->dwIntID = DeviceArrayIndex;
    pSerObj->pFuncTbl = (HW_VTBL *) & IoVTbl;
    return (pSerObj);
}

PDD層的函數主要是實現了對串口硬件的操作,函數不少,可以參考以下列表:

序號    函數    說明
1    GetSerialObject    返回一個指向HWOBJ結構的指針,該結構包含了相關硬件接口函數的函數指針
2    HWClearBreak    清除串口中斷狀態,用于串口從中斷狀態恢復
3    HWClearDTR    設置串口的DTR管腳為低
4    HWClearRTS    設置串口的RTS管腳為低
5    HWClose    關閉由HWInit函數初始化的設備
6    HWDisableIR    禁用串口的紅外模式
7    HWEnableIR    啟用串口的紅外模式
8    HWGetCommProperties    重新獲得當前串口設備的硬件屬性
9    HWGetIntrType    獲得當前的中斷類型
10    HWGetModemStatus    獲得Modem的狀態
11    HWGetRxBufferSize    獲得串口硬件接收Buffer的大小
12    HWGetRxStart    返回硬件接收Buffer的起始位置
13    HWGetStatus    獲得硬件狀態信息
14    HWInit    初始化串口硬件設備
15    HWIoctl    執行I/O控制
16    HWLineIntrHandler    線路狀態信息中斷處理函數
17    HWOpen    打開串口設備
18    HWPowerOff    串口硬件進入Suspend模式
19    HWPowerOn    串口硬件從Suspend模式恢復到工作模式
20    HWSetDCB    設置串口硬件設備信息
21    HWSetDTR    設置串口的DTR管腳為高
22    HWSetRTS    設置串口的RTS管腳為高
23    HWPurgeComm    清除串口硬件buffer的信息
24    HWPutBytes    通過寫數據到硬件中來直接發送數據
25    HWReset    復位串口硬件
26    HWRxIntrHandler    接收數據中斷處理函數
27    HWSetBreak    設置串口為中斷狀態,停止發送接收數據
28    HWTxIntrHandler    串口發送中斷處理函數


非獨占式串口驅動

用過串口進行過開發的兄弟們都知道,串口驅動是一個典型的獨占設備。簡單點來說,就是在成功地調用CreateFile打開串口之后,沒有通過CloseHandle進行關閉,是無論如何都不能再次調用CreateFile來再次打開相同的串口,這樣做可以避免產生數據丟失,也避免獲取數據的線程是反復讀取。

但是現在的嵌入式設備功能都非常多,需要非獨占式串口驅動,也就是虛擬串口驅動。它主要是處理數據的分發,可以和具體的硬件分開,優勢也很明顯,可以不用理會具體的硬件規格,只要采用的是WinCE系統,虛擬串口驅動就能正常工作。

在設計驅動的時候需要注意,同一時間只能有一個進程對外輸出數據,其余進程只能在該進程輸出完畢之后才能進行。當然,程序不應該主動調用ReadFile來輪詢獲取數據,而是通過WaitCommEvent進行檢測。為了不丟失數據,緩沖大小一定要等于或大于READ_BUFFER_LENGTH。

在寫代碼的時候需要注意一點,WaitCommEvent函數只能被一個線程調用,同一時間只有唯一的一個線程通過WaitCommEvent函數進入等待狀態。因此對于IOCTL_SERIAL_WAIT_ON_MASK控制碼的處理,可以通過調用WaitForSingleObject進行線程等待。這時虛擬串口驅動會額外開放一個線程,該線程主要是通過調用WaitCommEvent來獲取原生串口的狀態,當狀態有通知時,再發送event給等待的線程。

switch(xxxx){
...
case IOCTL_SERIAL_WAIT_ON_MASK:
{  if(dwBufOutSize < sizeof(DWORD) ||
   WaitForSingleObject(g_hEventComm,INFINITE) == WAIT_TIMEOUT)
  {  *pBytesReturned = 0;
     return FALSE;
   } else {
     InterlockedExchange(reinterpret_cast(pBufOut), dwEvtMask);
     *pBytesReturned = sizeof(DWORD);
     return TRUE;
   }
}...

多串口擴展

在WinCE應用環境中,對擴展的多串口的編程方法,實際上與標準的串口應用程序完全一樣。

注意在打開串口號大于9的串口時,需要使用“\\$device\\COMxx”,而不是通常的“COMx:”。

考慮到共享中斷的異步特性,各個串口可能同時請求中斷,從而產生極高的中斷頻率,所以建議客戶把低波特率的串口通道,如9600bps或以下的波特率,配置在擴展串口上,以均衡CPU對各個硬件設備的開銷;相應地把需要使用高波特率的通道配置到嵌入式主板自帶的串口通道上,比如:EM9360的COM2-COM7,這些串口均配置有獨立的硬件中斷。



在WinCE標準的串口驅動程序中,為每個串口分配了2KB的接收數據緩沖區,所以各個串口上層處理線程可參考buffer的深度,采用合適的響應方式,以最大限度的避免線程空轉所帶來的CPU時間的無謂消耗。

WinCE下的驅動開發減少了開發者的工作量,不過其中還存在很多細節性的問題,動手實踐中就能慢慢體會到了。
本文地址:http://www.qingdxww.cn/thread-63514-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 想要避免發生災難,就用MPLAB SiC電源仿真器!
  • Cortex-M4外設 —— TC&TCC結合事件系統&DMA優化任務培訓教程
  • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
  • 利用模擬開發工具生態系統進行安全電路設計
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 自拍偷自拍亚洲精品情侣 | 久久6精品| 亚洲最色网 | 日韩精品视频免费网址 | 日日摸夜夜摸无需播放器 | 免费看日本大片免费 | 欧美视频精品在线 | 日狠狠 | 成人性视频app菠萝网站 | 国产一级二级三级在线观看 | 欧美在线视频一区二区 | 日本www在线播放 | 成人精品免费网站 | 欧美日韩精品乱国产 | 欧美亚洲国产日韩 | 污视频网站免费在线观看 | 国产一卡二卡三卡四卡 | 久热re国产手机在线观看 | 欧美在线观看不卡 | 久久99这里只有精品 | 国产精品香蕉在线观看不卡 | 六月婷婷网| 国产99精品视频 | 日韩欧美中文字幕在线视频 | 青青草伊人网 | 免费黄网页 | 日韩黄色一级视频 | 亚洲欧美视频在线观看 | 一级做α爰片久久毛片 | 日韩精品影视 | 日韩欧美高清在线 | 国产91视频观看 | 四虎影视8848a四虎在线播放 | 婷婷亚洲综合五月天小说 | 日韩免费高清专区 | 激情亚洲| 99视频精品全国免费 | 在线观看精品视频网站www | 又色又爽视频 | 欧美视频性 | 国产小视频精品 |