这两天快考试了,老师崔着交作业。弄了下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);
其实这个是很简单的,自己记录自己的学习,当作自勉把