阅读:1408回复:7
向下位机写数据的问题
上位机在从下位机读数据的时候,可以一次读数大于64B,由驱动进行分割,从而下位机一次次的产生中断,可是如果是上位机向下位机写数据呢?我发现如果是自己分成64B大小的包,然后一次次的调用函数向下写,这样是可以得,可是如果是一次就输入一个大于64地数(比如192),让驱动去分割发送,下位机老是丢包,只能接收到128字节,后面的一个包丢失了,有帖子讨论说是双缓冲区的问题,可是我处理了双缓冲区阿,就是在接收中断里面判断另一个缓冲区有数据,如果有就读取啊,为什么还是会丢包那?
|
|
沙发#
发布于:2003-08-07 12:59
你把读数据放在中断外试试,每进一次读数据的中断就把一个全局变量加一,读完一个包就减一,一般来说这个全局变量不会超过2的。我想问题可能是你设备读数据比较慢,错过了一个中断。
|
|
板凳#
发布于:2003-08-07 13:04
这么说来就是中断来的时候,中断交变的电平,只有数据读完了之后,中断脚的电平才变高?是这样的吗?
|
|
地板#
发布于:2003-08-07 13:13
You got it!
如果你第二个中断来的时候第一个还没处理完,那么这两个中断就会变成一个了! 另外好像有个最后状态寄存器记录吧,里面好像可以显示有几个事件的,你可以通过查询这个来确定是否还有包没有读出来,不过理论上来说如果你端点里的数据没有读出,下一个包就不会到来呀,除非你在什么地方强制清空了端点! |
|
地下室#
发布于:2003-08-07 16:41
强制清空端点?我倒是想啊,可是怎么做那?是不是用f2命令阿?在每次初始化usb的时候,我就想清空端点的,可是好像还是不行啊,我总是在下一次启动usb的时候收到上次我发送的数据,所以会引起很多的错误了
|
|
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 这个我已试验成功了 |
|
|
6楼#
发布于:2003-08-08 08:34
哦?你这是在中断里面调用的还是在主循环里面调用的?中断里面应该是不行的,因为如果丢包(没有中断来)的话,根本就没有中断啊,就不会读最后的一个包了,是不是啊?
|
|
7楼#
发布于:2003-08-08 09:10
usb_anywhere:谢谢你,如果是大批数据的发送,这种方法还真是有用,可是我得数据是断断续续的发送的,有时候又是大批量的发送的,真是麻烦,我再综合考虑一下了,谢谢你!~~
|
|