有写过usb通信程序的朋友吗?有问题请教。

annkie 2003-08-23 11:31:35
我想实现 两台机器之间的通信程序。也就是从一个台机器上读一个文件,写到usb中,另外一台机器从usb中读取缓冲区数据,写到另外的文件中。我使用了usb bridge实现,在单机的情况下,也就是在一台机器上读写文件到usb再写到文件我已经可以实现了。在两台机器之间通信的时候,服务端发送一个数据到客户端通知其开始接收数据,客户端的线程可以正常读写,但是服务端的线程无法读取usb数据正常循环。我实在没有办法了,调试了好多天了,时间也到了,想起来真失败,但不得不挺下去了,望有这方面的朋友帮忙看一下,有意的请和我联系。谢谢了。annkie@tom.com
...全文
65 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
annkie 2003-08-24
  • 打赏
  • 举报
回复
协议到可以自己写的,现在的问题是通信不行,估计被阻塞了,而且发现如果使用另外的程序写数据,当前这个程序的读才能完成,非常奇怪。异步是立刻返回的么?不解。到是我用同步会立刻执行过去,但没有数据。
Behard 2003-08-24
  • 打赏
  • 举报
回复
确实可以使用 ZModem 协议

要不自己写协议也是很简单的
如果你做过 COM 与单片机通讯的话,非常简单的
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;
}
}
//---------------------------------------------------------------------------
annkie 2003-08-24
  • 打赏
  • 举报
回复
算了 ,我搜索了一下,那样的话我得从头开始做,没用了。
zjqyb 2003-08-24
  • 打赏
  • 举报
回复
网上搜一下有好多zmodem,xmodem,ymodem任选一种就可以了
annkie 2003-08-24
  • 打赏
  • 举报
回复
使用usb联机线可以采用什么协议?
使用这些协议是否有相应的函数?
难道我走了这么多弯路,可是我现在就剩下一点点时间了 ,使用别的东西恐怕是没希望了。
zjqyb 2003-08-24
  • 打赏
  • 举报
回复
你说是为了安全,才不用tcp/ip,我看你是多虑了,而且是自找麻烦
对于pc间的文件传送协议有好多种,参考一下kermit,zmodem,xmodem,ymodem....
annkie 2003-08-24
  • 打赏
  • 举报
回复
谢谢,我似乎发现了一个bug,先调试一下。
zjqyb 2003-08-24
  • 打赏
  • 举报
回复
做个实验,server不用异步接收,一直处于接收状态
client 一直发数据,看一下server能否完全接收
annkie 2003-08-23
  • 打赏
  • 举报
回复
对于pc间的通信你是不是采用tcpip协议了就不用自己考虑协议了?
我现在协议要自己写,不知道怎么才好实现,想模拟udp,可能会麻烦点,有没有建议给我?
annkie 2003-08-23
  • 打赏
  • 举报
回复
简单的发送数据没有问题,比如说在一台pc发送一个字符串,另外一台也可以接收到。
现在因为要自动监听到,所以用多线程,里面有些问题,非常难搞。应该是细节问题了,理论上是没有问题的。我继续搞,有进展再告诉你。
zjqyb 2003-08-23
  • 打赏
  • 举报
回复
用单线程try 一下
annkie 2003-08-23
  • 打赏
  • 举报
回复
噢,那估计不行,我的这个目的就是避免使用tcpip协议(为安全),所以通过usb传送文件.
那你的代码是基于socket的api了?
zjqyb 2003-08-23
  • 打赏
  • 举报
回复
模拟成网卡就可用tcp/ip socket协议,do anything ok
我用过的一根桥接线,它两段都模拟了一块网卡
annkie 2003-08-23
  • 打赏
  • 举报
回复
模拟成网卡是什么意思?要做些什么才行?
annkie 2003-08-23
  • 打赏
  • 举报
回复
我也是这样阿,我直接用符号名打开的。
你直接通信采用什么办法?
zjqyb 2003-08-23
  • 打赏
  • 举报
回复
你的不能模拟成网卡吗,若能就好办了

我原来是根据GUID找到devive name,然后再use Createfile open
then read write
不知你用何种方式
annkie 2003-08-23
  • 打赏
  • 举报
回复
我是一根file transfer,是另外一种专门用于文件收发的.你有传送文件这方面的编程经验吗?
zjqyb 2003-08-23
  • 打赏
  • 举报
回复
是用一根桥接线吗,我用的可以模拟成网卡,不知你的如何

13,824

社区成员

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

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