如何实现两台机器之间USB接口互发数据?

annkie 2003-08-01 09:32:31
就给我一跟usb cable,要我实现两台机器之间USB接口互发数据,我没有做过这样的东西,请问我该怎么做?有代码更好!谢谢!
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yifeng_ch 2003-11-18
  • 打赏
  • 举报
回复
收藏。
annkie 2003-08-02
  • 打赏
  • 举报
回复
非常感谢 shao528(远洋) !!
我现在还处于筹备阶段,希望能有更多的资料,在下非常感激!
shao528 2003-08-02
  • 打赏
  • 举报
回复
: : Hi,

: : im want to communicate with a device via usb. So i tried to establish a connection and everything seemed to be fine. Finally CreateFile works and i got a valid file handle. When i call ReadFile or WriteFile i allways get an error message "wrong parameter".
: : Any idea what could be wrong?
: : (Compiler: MS Visual Studio 6.0, OS: Win2000)

: : Thanx,

: : klaus

:
: A HID device? Did you prepend the ReportID byte (usually 0x0)?


I'm not sure if its a HID; its a receiver for gps data. No, i dont prepend the reportID byte;
the code looks like this:


DEFINE_GUID(USBIODS_GUID, 0xa5dcbf10, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0,0x4f, 0xb9, 0x51, 0xed);

...

HDEVINFO hInfo = SetupDiGetClassDevs((LPGUID) &USBIODS_GUID, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

if(!SetupDiEnumDeviceInterfaces (hInfo, NULL, //infoData,
(LPGUID) &USBIODS_GUID, //interfaceClassGuid,
i,
&deviceInterfaceData))

{
SetupDiDestroyDeviceInfoList (hInfo);
}
else
{
SetupDiGetInterfaceDeviceDetail(hInfo, &deviceInterfaceData, NULL, 0, &needed, NULL);
detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA ) malloc (needed);
detail->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);
if(!detail)
{
break;
}
else
{
if(!SetupDiGetInterfaceDeviceDetail(hInfo, &deviceInterfaceData, detail, needed, NULL, NULL))
{
break;
}
else
{
char devName[256];
int i = 0;
strncpy(devName, detail->DevicePath, sizeof(devName));
hUsbIo = CreateFile(devName, GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if(hUsbIo != INVALID_HANDLE_VALUE)
{

succ = WriteFile(hUsbIo, sCommand, sizeof(sCommand) ,&nBytes, &overlapped);
if(!succ)
{
LPVOID lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL );

annkie 2003-08-01
  • 打赏
  • 举报
回复
是usb 桥接线,是可以实现pc间的通信的。
我有两个疑问:
1。是否对不同的系统(比如:98)我要自己开发驱动程序?还是买来usb桥接线就有对应所有系统的驱动程序。
2。根据已知的驱动程序如何实现通信
希望有经验的朋友给出一点思路,我初次接触驱动和usb通信,请不吝赐教!
syl79 2003-08-01
  • 打赏
  • 举报
回复
一套USB系统有且只有一个USB的HOST,并且一台PC机就是一个HOST,所以在两台PC机用USB线传数据是不可能的。
而其他的设备,如U盘,这就不是HOST,U盘接受HOST的命令来与HOST通信。
annkie 2003-08-01
  • 打赏
  • 举报
回复
多谢楼上!!
shao528 2003-08-01
  • 打赏
  • 举报
回复
关于你的第二个问题,我这里有点源码:

如果你想打开一个USB管道,你首先要知道这种USB设备的GUID和管理道名称,
获取句柄以后就可以使用ReadFile/WriteFile进行读写了!
以下是代码,请参考!!

// filename是管道名称,如pipe01等
int CUSBImpObject::open_file( char *filename)
{

int successOpened = 0,i;
int NumOpened;
HANDLE h;
NumOpened=OpenAllUsbDevices((LPGUID) &GUID_CLASS_I82930_BULK);
if(NumOpened<=0)
return 0;
for(i=0;i<NumOpened;i++){
strcat (outnamebuf[i],
"\\"
);

strcat (outnamebuf[i],
filename
);


h= CreateFile(outnamebuf[i],
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
if (h == INVALID_HANDLE_VALUE) {
handUsbArray[i]=NULL;
} else {
handUsbArray[i]=h;
successOpened++;
}
}
return successOpened;
}


int CUSBImpObject::OpenAllUsbDevices(LPGUID pGuid) //打开所有的GUID为
pGuid的USB器件
{ //输出名存在outnamebuf中
ULONG NumberDevices;
HANDLE hOut = INVALID_HANDLE_VALUE; //HANDLE Phout[8];
HDEVINFO hardwareDeviceInfo;
SP_INTERFACE_DEVICE_DATA deviceInfoData;
ULONG i,flag=1,j;
ULONG NumDevicesOpened=0;
BOOLEAN done;
PUSB_DEVICE_DESCRIPTOR usbDeviceInst;
PUSB_DEVICE_DESCRIPTOR *UsbDevices = &usbDeviceInst;
char DeviceName[256]=""; //器件名

*UsbDevices = NULL;
UsbDevicesOpened = 0; //打开器件数置零

hardwareDeviceInfo = SetupDiGetClassDevs (
pGuid,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_INTERFACEDEVICE)); // Function class devices.

NumberDevices = 4;
done = FALSE;
deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
i=0 ;
while (!done) {
NumberDevices *= 2;

if (*UsbDevices) {
*UsbDevices =
(struct _USB_DEVICE_DESCRIPTOR *)realloc (*UsbDevices, (NumberDevices *
sizeof (USB_DEVICE_DESCRIPTOR)));
} else {
*UsbDevices = (struct _USB_DEVICE_DESCRIPTOR *)calloc (NumberDevices,
sizeof (USB_DEVICE_DESCRIPTOR));
}

if (NULL == *UsbDevices) {
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
return 0 ;
}

usbDeviceInst = *UsbDevices + i;

for (; i < NumberDevices; i++) {
if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo,
0,
pGuid,
i,
&deviceInfoData))
{
hOut = OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, DeviceName);
if ( hOut != INVALID_HANDLE_VALUE )
{
handUsbArray[UsbDevicesOpened]=hOut;

if(!outnamebuf[UsbDevicesOpened])
{
return 0;
}
for(j=0;j<256;j++)
{
*(outnamebuf[UsbDevicesOpened]+j)=*(DeviceName+j);
*(DeviceName+j)=0;
}
UsbDevicesOpened++;
}
}
else
{
if(ERROR_NO_MORE_ITEMS == GetLastError())
{
done = TRUE;
break;
}
}

} //end for
} //end while
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
free ( *UsbDevices );
return UsbDevicesOpened ;

}

//--------------------------------------------------------------------
//
//
//
//--------------------------------------------------------------------
HANDLE CUSBImpObject::OpenOneDevice (
IN HDEVINFO HardwareDeviceInfo,
IN PSP_INTERFACE_DEVICE_DATA DeviceInfoData,
IN char *devName
)
{
PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;
ULONG predictedLength = 0;
ULONG requiredLength = 0;
HANDLE hOut = INVALID_HANDLE_VALUE;
SetupDiGetInterfaceDeviceDetail (
HardwareDeviceInfo,
DeviceInfoData,
NULL, // probing so no output buffer yet
0, // probing so output buffer length of zero
&requiredLength,
NULL); // not interested in the specific dev-node


predictedLength = requiredLength;

functionClassDeviceData =(struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A *)
malloc (predictedLength);
functionClassDeviceData->cbSize = sizeof
(SP_INTERFACE_DEVICE_DETAIL_DATA);

if (! SetupDiGetInterfaceDeviceDetail (
HardwareDeviceInfo,
DeviceInfoData,
functionClassDeviceData,
predictedLength,
&requiredLength,
NULL)) {
free( functionClassDeviceData );
return INVALID_HANDLE_VALUE;
}

strcpy( devName,functionClassDeviceData->DevicePath) ;

hOut = CreateFile (
functionClassDeviceData->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, // no SECURITY_ATTRIBUTES structure
OPEN_EXISTING, // No special create flags
0, // No special attributes
NULL); // No template file

if (INVALID_HANDLE_VALUE == hOut) {

}
free( functionClassDeviceData );
return hOut;
}

21,597

社区成员

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

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