操作系统的USB端口通信如何控制?

魔都小强 2010-11-09 01:28:03
遇到一个问题,现在的打印机有以前的并口、串口,他们的通信都可以通过“ESC/POS”命令搞定,但是似乎USB端口不吃这一套,必须靠驱动来解决这些问题?不知有无好的办法,且驱动似乎不提供任何开发接口。
...全文
539 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
魔都小强 2010-11-23
  • 打赏
  • 举报
回复
自己搞定了,但是是通过固定的GUID来弄的,真心希望能找到动态获取GUID的办法,现在是监测注册表写入才发现某个设备的GUID的,55555,还是结了吧!~虽然这么久都没满意的答复!~
魔都小强 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jennyvenus 的回复:]
http://zhidao.baidu.com/question/143962617.html
[/Quote]

谢谢,不过注册的话好像也得知道设备的GUID哦,获取的只是类GUID。关键还是获取设备的的GUID,然后再获取设备路径,进而创建文件。:)不过还是感谢啊!~再次期待三人行。。。。。。
用户 昵称 2010-11-14
  • 打赏
  • 举报
回复
http://zhidao.baidu.com/question/143962617.html
魔都小强 2010-11-13
  • 打赏
  • 举报
回复
额。。。最好把原帖地址给俺啊,因为上面的代码有很多不确定因素。我用DDK获取的GUID似乎都是类GUID,和SetupApi获取的(SPDRP_DRIVER)一模一样,但是这样的话,枚举接口就会失败(SetupDiEnumDeviceInterfaces),应该是获取的GUID有误,不知道有无好的解决办法。叹啊!~莫非DDK中的HidD_GetHidGuid获取GUID有限定?还是?期待三人行。。。。
魔都小强 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jennyvenus 的回复:]
可以分啊,首先是GUID,不同的guid能够选出来的是不一样的设备,其次是vid,就是厂商代码,还有pid,就是产品代码,实际上最常用的就是用vid和pid来区别设备,同一种设备的vid和pid肯定是唯一的,由厂商自定的。不同设备的vid,pid基本上不一样,除非他们的通讯方法和命令集完全一致。
[/Quote]

恩,非常感谢,呵呵!~
通过这个函数可以获取PID和VID。

//得到设备实例的唯一标识ID(由注册表路径组成)
if (SetupDiGetDeviceInstanceId(hDevInfo, &spDevInfoData, szBuf, MAX_PATH, NULL))
{
sTmp.Format(_T("%03d : InstanceId = %s\n"), i, szBuf);
sTotal += sTmp;
}

但是另外获取USB设备路径(也即原题上的CreateFile函数的第一个参数)是否要结合DDK来获取,还是又更好的办法呢?通过结合DDK的方式还没试过,只是通过查资料了解了一些,不过最好能通过SetupApi来搞定,:)感谢jennyvenus,呵呵!~
用户 昵称 2010-11-12
  • 打赏
  • 举报
回复
可以分啊,首先是GUID,不同的guid能够选出来的是不一样的设备,其次是vid,就是厂商代码,还有pid,就是产品代码,实际上最常用的就是用vid和pid来区别设备,同一种设备的vid和pid肯定是唯一的,由厂商自定的。不同设备的vid,pid基本上不一样,除非他们的通讯方法和命令集完全一致。
用户 昵称 2010-11-12
  • 打赏
  • 举报
回复
消息映射
BEGIN_MESSAGE_MAP(CAFT_1394Dlg, CDialog)
//{{AFX_MSG_MAP(CAFT_1394Dlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
...
ON_WM_DEVICECHANGE()
//}}AFX_MSG_MAP

声明消息响应函数:
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);

定义函数内容:


BOOL XXXXXXX::OnDeviceChange(UINT nEventType,DWORD dwData)
{
DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;

//这里进行信息匹配,比如guid等

//针对各个事件进行处理.
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE:
...
break;
case DBT_DEVICEARRIVAL:
...
break;
...
...
...

default:
break;
}

return TRUE;

}

2.注册设备
if (Handle == NULL)
return FALSE;

DEV_BROADCAST_DEVICEINTERFACE DevInt;
memset(&DevInt,0,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;

DevInt.dbcc_classguid = GetCurrentUSBGUID();//m_usb->GetDriverGUID();
if (!RegisterDeviceNotification(m_hWnd, &DevInt,DEVICE_NOTIFY_WINDOW_HANDLE) )
return FALSE;

只有注册了该设备,OnDeviceChange才能获得详细的信息,否则收到的参数都是0007.

-----------------------------
都是论坛里面回复的,俺都是转贴
魔都小强 2010-11-12
  • 打赏
  • 举报
回复
或者如何知道USB硬件设备(像我这个USB小票打印机)的GUID,然后我再根据GUID来获取设备路径,这样就得到答案了!~:)但是如何得到它的GUID呢?直接通过SetupApi获取吗?
魔都小强 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jennyvenus 的回复:]
主要使用setup api来进行操作,得到设备的guid,然后有一系列的函数可以操作和筛选,最后得到目的设备的信息,里面包含设备的路径,CreateFile的参数就是这个设备的路径。
[/Quote]

恩,谢过:),研究下这个看看先!
魔都小强 2010-11-11
  • 打赏
  • 举报
回复

//获取设备信息集
HDEVINFO hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_USB, NULL, 0, DIGCF_PRESENT);

if (hDevInfo == INVALID_HANDLE_VALUE)
{
SetupDiDestroyDeviceInfoList(hDevInfo);
return FALSE;
}



TCHAR szBuf[MAX_PATH];
SP_DEVINFO_DATA spDevInfoData = {sizeof(SP_DEVINFO_DATA)};
CString sTmp, sTotal;

//开始列举设备
for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
{
//得到设备类描述
if (SetupDiGetClassDescription(&spDevInfoData.ClassGuid, szBuf, MAX_PATH, NULL))
{
sTmp.Format(_T("\n%03d : ClassDescription = %s\n"), i, szBuf);
sTotal += sTmp;
}

//得到设备实例的唯一标识ID(由注册表路径组成)
if (SetupDiGetDeviceInstanceId(hDevInfo, &spDevInfoData, szBuf, MAX_PATH, NULL))
{
sTmp.Format(_T("%03d : InstanceId = %s\n"), i, szBuf);
sTotal += sTmp;
}

//得到设备名称
if (SetupDiGetDeviceRegistryProperty(
hDevInfo, &spDevInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szBuf, MAX_PATH, NULL))
{
sTmp.Format(_T("%03d : DeviceDesc = %s\n"), i, szBuf);
sTotal += sTmp;

}

//得到设备型号
if (SetupDiGetDeviceRegistryProperty(
hDevInfo, &spDevInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szBuf, MAX_PATH, NULL))
{
sTmp.Format(_T("%03d : FriendName = %s\n"), i, szBuf);
sTotal += sTmp;
}

//得到设备在注册表中的子路径
if (SetupDiGetDeviceRegistryProperty(
hDevInfo, &spDevInfoData, SPDRP_DRIVER, NULL, (PBYTE)szBuf, MAX_PATH, NULL))
{
sTmp.Format(_T("%03d : Regedit Path = %s\n"), i, szBuf);
sTotal += sTmp;
}


}



AfxMessageBox(sTotal);


通过这段可以获取USB的相关信息,不过似乎每个USB的信息都长的一样,能区分么?例如:我一看某个参数就知道这个USB已经插了打印机,另外一个插了顾显屏等,再一个插了U盘等,有没有特征区分?:)。
用户 昵称 2010-11-10
  • 打赏
  • 举报
回复
打印机指令集要是不变,那肯定还能用。

驱动自然不提供操作接口,驱动生效后,使用createfile之类的api就可以读写了。
向立天 2010-11-10
  • 打赏
  • 举报
回复
把U口驱上操作就应该一样了吧
zhf_198647 2010-11-10
  • 打赏
  • 举报
回复
好像是要的吧
用户 昵称 2010-11-10
  • 打赏
  • 举报
回复
主要使用setup api来进行操作,得到设备的guid,然后有一系列的函数可以操作和筛选,最后得到目的设备的信息,里面包含设备的路径,CreateFile的参数就是这个设备的路径。
魔都小强 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jennyvenus 的回复:]
打印机指令集要是不变,那肯定还能用。

驱动自然不提供操作接口,驱动生效后,使用createfile之类的api就可以读写了。
[/Quote]
//...
CreateFile(strPort, GENERIC_READ | GENERIC_WRITE,
0, NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL );
strPort该写啥呢?USB还是USB001..002等还是?那两种都试过,好像不行哦!~:)
sd6814466 2010-11-09
  • 打赏
  • 举报
回复
应该是的吧。。。
xzjxylophone 2010-11-09
  • 打赏
  • 举报
回复
友情帮顶 楼主加油!
魔都小强 2010-11-09
  • 打赏
  • 举报
回复
自己顶下,莫非真要驱动程序的SDK?

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧