4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1408回复:7

向下位机写数据的问题

楼主#
更多 发布于:2003-08-07 12:34
上位机在从下位机读数据的时候,可以一次读数大于64B,由驱动进行分割,从而下位机一次次的产生中断,可是如果是上位机向下位机写数据呢?我发现如果是自己分成64B大小的包,然后一次次的调用函数向下写,这样是可以得,可是如果是一次就输入一个大于64地数(比如192),让驱动去分割发送,下位机老是丢包,只能接收到128字节,后面的一个包丢失了,有帖子讨论说是双缓冲区的问题,可是我处理了双缓冲区阿,就是在接收中断里面判断另一个缓冲区有数据,如果有就读取啊,为什么还是会丢包那?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-07 12:59
你把读数据放在中断外试试,每进一次读数据的中断就把一个全局变量加一,读完一个包就减一,一般来说这个全局变量不会超过2的。我想问题可能是你设备读数据比较慢,错过了一个中断。
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-07 13:04
这么说来就是中断来的时候,中断交变的电平,只有数据读完了之后,中断脚的电平才变高?是这样的吗?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-07 13:13
You got it!
如果你第二个中断来的时候第一个还没处理完,那么这两个中断就会变成一个了!
另外好像有个最后状态寄存器记录吧,里面好像可以显示有几个事件的,你可以通过查询这个来确定是否还有包没有读出来,不过理论上来说如果你端点里的数据没有读出,下一个包就不会到来呀,除非你在什么地方强制清空了端点!
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-07 16:41
强制清空端点?我倒是想啊,可是怎么做那?是不是用f2命令阿?在每次初始化usb的时候,我就想清空端点的,可是好像还是不行啊,我总是在下一次启动usb的时候收到上次我发送的数据,所以会引起很多的错误了
usb_anywhere
驱动小牛
驱动小牛
  • 注册日期2003-07-29
  • 最后登录2005-11-22
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-07 19:09
你若使用的是Bulk方式传输的化,上位机不需要考虑大小的,跟我们普通的通信协议差不多,可以传输任意大小的数据。
下位机使用中断方式中的异步传输(模式0)时,最大封包大小为64Byte
i = 0;
do{
len = D12_ReadEndpoint_Xdata(D12_ENDP2OUT,pdbuf,BULK_BLOCK);
   pdbuf = pdbuf+BULK_BLOCK;
   i = i+1;
      }
   while(len==BULK_BLOCK);
其中BULI_BLOCK=64

这个我已试验成功了
驱网是你们的,也是我们的,归根结底还是大家的!
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-08 08:34
哦?你这是在中断里面调用的还是在主循环里面调用的?中断里面应该是不行的,因为如果丢包(没有中断来)的话,根本就没有中断啊,就不会读最后的一个包了,是不是啊?
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-08 09:10
usb_anywhere:谢谢你,如果是大批数据的发送,这种方法还真是有用,可是我得数据是断断续续的发送的,有时候又是大批量的发送的,真是麻烦,我再综合考虑一下了,谢谢你!~~
游客

返回顶部