DCB--今天看的

这两天快考试了,老师崔着交作业。弄了下wince系统。

 

现在来说说DCB是个什么东东把。我们要了解wince下的驱动开发的一些基本的知识。首先来了解下PDD和MDD,PDD在msdn上是这

 

样说的:platform-dependent driver (PDD),平台相关的驱动程序。再看remarks:The platform-specific layer of a native

 

device driver supplied by an original equipment manufacturer.See also native device driver. 那我们看看native device

driver:A software component that enables a computer system to communicate with a device,使操作系统能够与设备通

 

信的一个软件组件。这下对PDD很明白了,它大概意思就说,特定平台下的能让操作系统和设备通信的软件包是由原始的设备制造厂商提供

 

的。PDD就是提供了对硬件操作相应的代码,这些代码通过结构HWOBJ来相互联系。MDD,csdn上说model device driver (MDD) ,模

 

块设备驱动。有微软提供的。MDD提供框架性的实现,负责提供OS所需的基本实现。DDSI就是指这两个部分之间的接口,DDSI是指

MDD层与PDD层的接口,在串口驱动中实际上就是指HWOBJ,实现接口的关键在与结构指针 HWOBJ的使用和具体函数的实现。

 

在实际的驱动应用中仅仅需要实现HWOBJ相关的一系列函数,而无需从驱动顶层完全开发。

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

PDD的实现必须遵循HW_VTBL中所描述的函数形式,并构造出相应的HW_VTBL实例。驱动的编写就是针对这些函数来一一进

行实现的。

typedef struct __HW_VTBL {
PVOID (*HWInit)(ULONG Identifier,
PVOID
pMDDContext,
PHWOBJ
pHWObj);
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;

这个结构提相当与linux下file_options,针对具体的需求去实现把。这里我就记录今天自己做试验里面的内容。呵呵,我的试验

内容就是使用串口驱动接口。具体的代码实现如下:

 HANDLE hSer;
 hSer = CreateFile(TEXT("COM!:"),GENERIC_READ|GENERIC_WRITE,
  0,NULL,OPEN_EXISTING,0,NULL);
 
 if(hSer == INVALID_HANDLE_VALUE )//创建不成功
 {
  MessageBox(L"CreateFailed",L"Failed");
  return ;
 }
    //DCB  This structure defines the control setting for a serial communications device
 DCB commParam;

 if(!GetCommState(hSer,&commParam))//获取端口状态
 {
  MessageBox(L"GetCommState",L"Failed");
  return ;
 }

 //获取端口状态成功,则
 WCHAR s[20];
 wsprintf(s,L"baud:%d bytesize:%d stopbits:%d",
 commParam.BaudRate,commParam.ByteSize,commParam.StopBits);
 MessageBox(s);

 //对端口参数设置;
 commParam.BaudRate = 38400;     //设置波特率
 commParam.fBinary = 1;      //设置二进制模式,此处必须置1
 commParam.fParity = 1;      //支持奇偶校验
 commParam.ByteSize = 8;     // 数据位,范围:4-8
 commParam.Parity = NOPARITY;    // 校验模式
 commParam.StopBits = 1;      // 停止位


 commParam.fOutxCtsFlow = FALSE;    // No CTS output flow control
 commParam.fOutxDsrFlow = FALSE;    // No DSR output flow control
 commParam.fDtrControl = DTR_CONTROL_ENABLE; // DTR flow control type

 commParam.fDsrSensitivity = FALSE;   // DSR sensitivity
 commParam.fTXContinueOnXoff = TRUE;  // XOFF continues Tx
 commParam.fOutX = FALSE;       // No XON/XOFF out flow control
 commParam.fInX = FALSE;     // No XON/XOFF in flow control
 commParam.fErrorChar = FALSE;   // Disable error replacement
 commParam.fNull = FALSE;     // Disable null stripping
 commParam.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control
 commParam.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写

 if(!SetCommState(hSer,&commParam))
 {
  MessageBox(L"SetCommState",L"Failed!");
  return ;
 }

 int RC;
 DWORD cByte_send,cByte_written;
 char ch[20];
 cByte_send = sizeof(ch);

 sprintf(ch,"test COM1 good!"); //把后面的字符串写道前面的buffer中
 RC=WriteFile(hSer,ch,cByte_send,&cByte_written,NULL);
 
 WCHAR ret[20];
 wsprintf(ret,L"%d",cByte_written) ;//
 if(RC)
 {
  MessageBox(L"Send OK!");
  MessageBox(ret);
  CloseHandle(hSer);
  return ;
 }
 wsprintf(ret,L"%d",cByte_written) ;//
 MessageBox(ret);
 CloseHandle(hSer);

其实这个是很简单的,自己记录自己的学习,当作自勉把

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值