打印
[数据传输]

新手请教,用USB进行上下位机的数据传输需要注意些什么?

[复制链接]
2885|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xialang921|  楼主 | 2015-1-19 15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下位机用的是DSP,例程里,上位机和DSP可以进行1次数据的发送和接收,可是我需要上位机能够连续地从DSP获得数据,上下位机的程序进行了改动,都改成了循环,可是运行的时候,上位机程序不响应,这里需要对USB固件做些什么修改吗,还要改动些其他的什么吗?

相关帖子

沙发
l_lin2003| | 2015-1-19 16:57 | 只看该作者
上位机永远主动发送命令。
下位机永远被动,按命令要求响应,没明白你下位机循环什么

使用特权

评论回复
板凳
xialang921|  楼主 | 2015-1-19 18:51 | 只看该作者
l_lin2003 发表于 2015-1-19 16:57
上位机永远主动发送命令。
下位机永远被动,按命令要求响应,没明白你下位机循环什么 ...

下位机循环查询指令,上位机命令到达以后执行响应,我的部分程序是

DSP:
...
for(;;)
{
   if((*FIFO_Sta2&0x0001)!=0)//接收端点不为0
   {
     send_flag=1;
     for(k=0;k<256;k++)
     b[k]=*EP2;
   }

   if((send_flag==1)&((b[0]>>8)==0))
    {
      for(k=0;k<256;k++)
      *EP6=(data<<8)+3;
      data++;
      send_flag=0;
    }
}


PC端:
while(stopb==0)
  {
    myusb->SendCommand(buf);
    Sleep(100);
    myusb->GetResponse(buf);
    Edit2->Text=IntToStr(buf[2]);
    Sleep(1000);
  }
想法是PC显示一次后循环发指令,下位机在不断查询,不知道程序是不是哪里有错

使用特权

评论回复
地板
l_lin2003| | 2015-1-20 08:51 | 只看该作者
用的什么通信协议?msd、hid、ccid还是自定义?
响应的数据时要遵循通信协议
接收、发送数据时,都有中断发生,可以在中断中置接收标志,去外面循环检测接收标志来接收数据
发送数据,只要上次写的数据已经发送了,就直接向端点buffer中写数据就可以了,等着PC自己来取数,不知道你的发送标志send_flag是用来干什么的。
你好好研读一下芯片datasheet中USB的章节吧

使用特权

评论回复
5
xialang921|  楼主 | 2015-1-20 09:20 | 只看该作者
l_lin2003 发表于 2015-1-20 08:51
用的什么通信协议?msd、hid、ccid还是自定义?
响应的数据时要遵循通信协议
接收、发送数据时,都有中断发 ...

通信协议我也不知道。。。只是在原来例程的基础上做了些改动

使用特权

评论回复
6
yubsh| | 2015-1-20 11:28 | 只看该作者
你这样做界面无疑会死掉的。上位机做个定时器,定时查询取数。或者在循环中使用下列代码增加界面交互的能力。
        MSG msg;     
        if(PeekMessage(&msg,this->m_hWnd,NULL,NULL,PM_REMOVE))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

使用特权

评论回复
7
xialang921|  楼主 | 2015-1-20 13:44 | 只看该作者
yubsh 发表于 2015-1-20 11:28
你这样做界面无疑会死掉的。上位机做个定时器,定时查询取数。或者在循环中使用下列代码增加界面交互的能力 ...

正打算加一个定时器试试,谢谢,是不是简单的发送接收功能用定时器就足够?多线程呢?

使用特权

评论回复
8
yubsh| | 2015-1-20 14:24 | 只看该作者
定时器内发一次命令收一次数据,显示,定时器退出。

线程接收的话,只要一个线程就可以了,毕竟只有一个USB设备。

使用特权

评论回复
9
xialang921|  楼主 | 2015-1-20 18:37 | 只看该作者
yubsh 发表于 2015-1-20 14:24
定时器内发一次命令收一次数据,显示,定时器退出。

线程接收的话,只要一个线程就可以了,毕竟只有一个US ...

是不是用定时器会简单些?这里定时器还需要退出?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

20

帖子

0

粉丝