急!!哪位有老大有关于USB口通信的资料或者源码?最好是Delphi的或C++的!

shao528 2003-08-01 05:23:49
现在要做一个UPS产品状态控制程序,通过usb通信,但不知道USB与COM口通信有何区别,请高手帮忙啊!如果有这方面的资料或者源码请提供给小弟,不胜感激!
...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yifeng_ch 2003-11-18
  • 打赏
  • 举报
回复
收藏。
xiaohedou 2003-08-11
  • 打赏
  • 举报
回复
恭喜你!
xiaohedou 2003-08-08
  • 打赏
  • 举报
回复
对主要是CreateFile/ReadFile/WriteFile我也是在学习
shao528 2003-08-08
  • 打赏
  • 举报
回复
我已经有突破了,已经能够枚举USB设备的所有设备名称,下一步就是用文件方式进行读写,但有一点不明白,取得USB的设备名称后,是不是可以像COM口一样通信?也要设定波特率?

我实现的代码如下(Delphi的,花了两天时间从C++的资料中总结出来的):

const
DIGCF_PRESENT = 2;
DIGCF_INTERFACEDEVICE = 16;
type

PSP_DEVINFO_DATA = ^SP_DEVINFO_DATA;
SP_DEVINFO_DATA = packed record
cbSize :DWORD;
ClassGuid :TGUID;
DevInst :DWORD ; // DEVINST handle
Reserved :DWORD;
end;

HDEVINFO = Pointer;

pulong = ^ulong;

PSP_INTERFACE_DEVICE_DATA = ^SP_INTERFACE_DEVICE_DATA;
SP_INTERFACE_DEVICE_DATA = packed record
cbSize :ulong;
InterfaceClassGuid : TGuid;
Flags :ulong;
Reserved :ulong;
end;

PSP_INTERFACE_DEVICE_DETAIL_DATA = ^PSP_INTERFACE_DEVICE_DETAIL_DATA;
SP_DEVICE_INTERFACE_DETAIL_DATA = packed record
cbSize :DWORD;
DevicePath: Char;
end;


PUSB_DEVICE_DESCRIPTOR = ^USB_DEVICE_DESCRIPTOR;
USB_DEVICE_DESCRIPTOR = packed record
bLength :UCHAR;
bDescriptorType :UCHAR;
bcdUSB :WORD;
bDeviceClass :UCHAR;
bDeviceSubClass :UCHAR;
bDeviceProtocol :UCHAR;
bMaxPacketSize0 :UCHAR;
idVendor :Word;
idProduct :Word;
bcdDevice :Word;
iManufacturer :UCHAR;
iProduct :UCHAR;
iSerialNumber :UCHAR;
bNumConfigurations :UCHAR;
end;

function SetupDiGetDeviceInterfaceDetail(
DeviceInfoSet : HDEVINFO;
DeviceInterfaceData: PSP_INTERFACE_DEVICE_DATA;
DeviceInterfaceDetailData: PSP_INTERFACE_DEVICE_DETAIL_DATA;
DeviceInterfaceDetailDataSize : DWORD;
RequiredSize : PDWORD;
DeviceInfoData : PSP_DEVINFO_DATA
): BOOL; stdcall; external 'SETUPAPI.dll' name 'SetupDiGetDeviceInterfaceDetailA';

function SetupDiGetClassDevsEx(
ClassGuid :PGUID;
Enumerator :PChar;
hwndParent :HWND;
Flags : DWORD;
MachineName :PChar;
Reserved :Pointer
): HDEVINFO; stdcall; external 'SETUPAPI.dll' name 'SetupDiGetClassDevsExA';

function SetupDiGetClassDevs(
ClassGuid :PGUID ;
Enumerator: PChar;
hwndParent: HWND;
Flags : DWORD
): HDEVINFO; stdcall; external 'SETUPAPI.dll' name 'SetupDiGetClassDevsA';

function SetupDiEnumDeviceInterfaces(
DeviceInfoSet :HDEVINFO;
DeviceInfoData :PSP_DEVINFO_DATA;
InterfaceClassGuid :PGUID;
MemberIndex :DWORD;
DeviceInterfaceData :PSP_INTERFACE_DEVICE_DATA
): BOOL; stdcall; external 'SETUPAPI.dll' name 'SetupDiEnumDeviceInterfaces';

function SetupDiDestroyDeviceInfoList(
DeviceInfoSet :HDEVINFO
):BOOL; stdcall; external 'SETUPAPI.dll' name 'SetupDiEnumDeviceInterfaces';


以下代码就可以枚举设备:

var b :integer;
bRst :BOOL;
hInfo :HDEVINFO;
USBIODS_GUID :TGuid;
deviceInterfaceData :SP_INTERFACE_DEVICE_DATA;

predictedLength : ULONG;
requiredLength :ULONG;
nCount: integer;
begin

...
predictedLength := 0;
requiredLength := 0;
hInfo := nil;
hInfo := SetupDiGetClassDevs(@USBIODS_GUID, nil, 0,
DIGCF_PRESENT OR DIGCF_INTERFACEDEVICE);

bRst := true;
nCount := 0;

deviceInterfaceData.cbSize := Sizeof(SP_INTERFACE_DEVICE_DATA);
DeviceDetailData.cbSize := sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

if hInfo <> nil then
showmessage('b')
else exit;

while bRst do
begin
deviceInterfaceData.cbSize := Sizeof(deviceInterfaceData);

bRst := SetupDiEnumDeviceInterfaces(hInfo, nil, @USBIODS_GUID,
nCount, @deviceInterfaceData);
if bRst then
begin
SetupDiGetDeviceInterfaceDetail(hInfo, @deviceInterfaceData,
nil, 0, @requiredLength, nil);


predictedLength := requiredLength;
DeviceDetailData.cbSize := sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bRst := SetupDiGetDeviceInterfaceDetail(hInfo, @deviceInterfaceData,
@DeviceDetailData, predictedLength, @requiredLength, nil);

if bRst then
begin
showmessage('ok'+inttostr(nCount));
pszDevicePath[nCount] := string(PChar(@(DeviceDetailData.DevicePath)));
showmessage(pszDevicePath[nCount]);
Memo1.Lines.Add(pszDevicePath[nCount]);
Inc(nCount);
end;
end;
end; //end while
showmessage('finished');
shao528 2003-08-06
  • 打赏
  • 举报
回复
谢谢无声的雨!
annkie 2003-08-02
  • 打赏
  • 举报
回复
\\.\USBSampl0
应该是指根目录下的 某个usb设备
请参考这篇文章,我从msdn炒的。
http://xsc.xmu.edu.cn/annkie/bbs/dispbbs.asp?boardID=54&ID=165

另外你可以到我的网站上看一下,我会慢慢收集一些资料(我正在做一个project),大家互相帮助一下!
http://annkie.yeah.net/
shao528 2003-08-02
  • 打赏
  • 举报
回复
找到一段代码,不知道其中的:CreateFile(\\.\USBSampl0,GENERIC_READ|

GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULI,OPEN_EXISTING,0,NULL); //打开USB句柄



的 "\\.\USBSampl0"是什么用法?是不是搞错了?



HANDLE m_hUsbSample; //USB句柄

m_hUsbSample=CreateFile(\\.\USBSampl0,GENERIC_READ|

GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULI,OPEN_EXISTING,0,NULL); //打开USB句柄

DeviceIoControl(m_hUsbSample,IOCTL_USBSAMPL_REBOOT, NULL,0,NULL,0,&length,NULL); //控制传输

WriteFile(m_hUsbSample,pBuffer,writelength,&writelength,NULL); //批量输出传输

ReadFile(m_hUsbSample,pBuffer,64,&lgngth,NULL); //批量输入传输

CloseHandle(m_hUsbSample); //关闭USB句柄
shao528 2003-08-02
  • 打赏
  • 举报
回复
Gao2003能再讲详细点吗?谢谢!
Gao2003 2003-08-01
  • 打赏
  • 举报
回复
与usb通信只有通过ReadFile WriteFile DevicIOControl三个函数进行。你只要在驱动程序里实现这三个例程就可以在上层应用通过上面的三个函数与它通信
xiaohedou 2003-08-01
  • 打赏
  • 举报
回复
勤勉!前面两个很好,再提供一个:

www.laogu.com
annkie 2003-08-01
  • 打赏
  • 举报
回复
你看看这两个网站
http://www.DriverDevelop.com/
http://www.usb.org/

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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