有写过usb通信程序的朋友进来看看,有问题请教。

annkie 2003-08-23 11:33:53
我想实现 两台机器之间的通信程序。也就是从一个台机器上读一个文件,写到usb中,另外一台机器从usb中读取缓冲区数据,写到另外的文件中。我使用了usb bridge实现,在单机的情况下,也就是在一台机器上读写文件到usb再写到文件我已经可以实现了。在两台机器之间通信的时候,服务端发送一个数据到客户端通知其开始接收数据,客户端的线程可以正常读写,但是服务端的线程无法读取usb数据正常循环。我实在没有办法了,调试了好多天了,时间也到了,想起来真失败,但不得不挺下去了,望有这方面的朋友帮忙看一下,有意的请和我联系。谢谢了。annkie@tom.com
...全文
64 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
annkie 2003-08-25
  • 打赏
  • 举报
回复
有什么办法清空usb的缓冲区吗?还是往里面写0?
annkie 2003-08-24
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
void __fastcall ReadUSBThread::Execute()
{
/****************************
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
/****************************/
LPOVERLAPPED lpOverlapped;
OVERLAPPED ov;

DWORD nBytesToRead = BUFFERSIZE; //
BOOL bResult;

DWORD dwTimeout = 20;
DWORD nBytesRead;

ov.Offset = 0;
ov.OffsetHigh = 0;
memset(&ov,0,sizeof(OVERLAPPED));
ov.hEvent = ::CreateEvent(0,true,false,0);
lpOverlapped = &ov;
nCount = 0;

while(!Terminated)
{
CS->Enter();
if(!bReadDone)
{
//这里无法一直读USB,去掉这句线程是正常的。这会是什么原因呢??
bResult = ReadFile(hUSB,
&pszBuffer,
nBytesToRead,
&nBytesRead,
lpOverlapped) ;

//::MessageBox(0,"server:ReadUSBthread","警告",MB_OK|MB_ICONINFORMATION);
//ShowSystemErr();
if(bResult)
{
Msg ="Read from client....ok" + AnsiString(pszBuffer).SubString(1,8)+"%%";
FileWrite(hDebugFile,Msg.c_str(),Msg.Length());
}

if(!bResult)
{
ShowSystemErr();
if(::GetLastError()==ERROR_IO_PENDING)
{
switch(::WaitForSingleObject(ov.hEvent ,dwTimeout))
{
case WAIT_OBJECT_0:
if(!::GetOverlappedResult(hUSB,&ov,&nBytesRead,TRUE))
ShowSystemErr();
break;
case WAIT_TIMEOUT:
ShowSystemErr();
::CancelIo(hUSB);
default: ;
}
}
}

char *strData = "ReadDone";
if(strncmp(pszBuffer,strData,8)==0)
{
//::MessageBox(0,"Readdone","",MB_OK);
Msg = "ReadDone";
FileWrite(hDebugFile,Msg.c_str(),Msg.Length())+"&&";
//client has received the last package of data
//and is ready to receive next one.
bReadDone = true;
::SetEvent(hEvent);//turn on the signal to notify write thread
}

if(nCount++ < 100)
Synchronize(ShowMemo);


Sleep(30);
} //end of outer if
CS->Leave();

}//end of while

//CloseHandle(hOvEvent);
if(FreeOnTerminate!=true)
{
delete this;
}
}
//---------------------------------------------------------------------------
conanfans 2003-08-24
  • 打赏
  • 举报
回复
www.driverdevelop.com
annkie 2003-08-24
  • 打赏
  • 举报
回复
原本发在硬件那一块的,无人问津,还不如转回自家大门。。。
annkie 2003-08-24
  • 打赏
  • 举报
回复
明显就是被阻塞在哪里的样子,我用另外的程序写usb,这个程序才会读出来,而且循环几次又停掉了。
annkie 2003-08-24
  • 打赏
  • 举报
回复
我在同一台机器上测试的。
到底是写快还是读快?我一直认为是读更快的
zjqyb 2003-08-24
  • 打赏
  • 举报
回复
你客户端机器是不是太快了
annkie 2003-08-24
  • 打赏
  • 举报
回复
没有搞定,郁闷ing。。。。
annkie 2003-08-23
  • 打赏
  • 举报
回复
不是usb host阿,我是usb bridge啦,我都已经可以通信了,只是没办法实现我上面的功能了。
itisajoke 2003-08-23
  • 打赏
  • 举报
回复
两个USB HOST端直接连接是无法实现通讯的。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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