我是这么做的1,我讲讲我的思路,大家看看我的正确不:
(1)首先用driver studio 3.2 生成驱动框架,设置了一个端点6用于数据的读取,默认的端点0用于发送命令,我的通信协议是这样的,当上位机(PC)发送F1 xx xx xx xx xx xx xx 给相机时,相机就通过发送一副图像给端点6,然后上位机去读取端点6中的数据:
我在驱动中使用DeviceControl和应用程序进行通信,
NTSTATUS CameraDevice::DeviceControl(KIrp I)
{
T.Trace(TraceInfo, __FUNCTION__"++. IRP %p\n", I);
NTSTATUS status = STATUS_SUCCESS;
switch (I.IoctlCode())
{
case Camera_IOCTL_Control:
status = Camera_IOCTL_Control_Handler(I);//设置控制参数;
break;
case Camera_IOCTL_Read:
status = Camera_IOCTL_Read_Handler(I);//读端口6中的数据;
break;
case Camera_IOCTL_Write:
status = Camera_IOCTL_Write_Handler(I);
break;
default:
status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
if (status != STATUS_PENDING)
{
I.PnpComplete(this, status);
}
T.Trace(TraceInfo, __FUNCTION__"--. IRP %p, STATUS %x\n", I, status);
return status;
}
在应用程序中 使用openbyinterface()函数得到打开设备
然后使用DeviceIoControl 把控制命令发过去,我用bushound 查看,命令是发送过去了,但是相机没有给我 返回图像数据,是哪个地方出错了呢
void CTest_CameraDlg::TestControlParam()//这样参数传进去不行啊
{
UCHAR bufInput[IOCTL_INBUF_SIZE]={0x40,0xF1,0x00,0x00,0x00,0x00,0x08,0x00}; // Input to device
UCHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device
ULONG nOutput; // Count written to bufOutput
if (!DeviceIoControl(m_hDevice,
Camera_IOCTL_Control,
bufInput,
IOCTL_INBUF_SIZE,
bufOutput,
IOCTL_OUTBUF_SIZE,
&nOutput,
NULL)
)
{
MessageBox("Camera_IOCTL_Control", "错误", MB_OK | MB_ICONHAND);//
}
else
{
CString str;
str.Format("0x%x",bufOutput);
SetDlgItemText(IDC_OutputEndpoint,str);
}
}
欢迎大家一起讨论,共同学习