本帖最后由 Swd21ic 于 2010-3-3 15:28 编辑
因为PC软件是用串口编写的..所以仍想保持不变..但硬件上使用USB通信. CDC类.
根据官方2.2.1版(IAR5.30自带)的Vitrual_Com_Port例程修改了一个USB程序.
端点1.程序里封装了一个发送函数.并且在EP1_IN_Callback回调里做了"发送完成"标志位的处理
Bool SendOverFlag = true; // 第一次时允许发送数据的.
void EP1_IN_Callback (void)
{
SendOverFlag = ture; // 通知一次发送完成
}
void USB_SendData (UINT8 *p_data, UINT32 num)
{
UINT32 remain = num;
UINT32 index = 0;
while (remain > 64) //一次最多发送64字节
{
while (SendOverFlag != ture); //等待上一次发送完
SendOverFlag = false;
UserToPMABufferCopy(&p_data[index], ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
index += 64; //计算偏移和剩余字节数
remain -= 64;
}
while (SendOverFlag != ture);
SendOverFlag = false;
//发送最后<=64字节的数据
UserToPMABufferCopy(&p_data[index], ENDP1_TXADDR, remain);
SetEPTxCount(ENDP1, remain);
SetEPTxValid(ENDP1);
}
杯具的是... 如果发送的数据个数是64的倍数时,PC上什么都收不到.
如USB_SendData(&Data[0], 64); USB_SendData(&Data[0], 256);
但发送63/65, 255/257都可以正确的受到数据.
找了半天确定了"最后一次当remain = 64的时候就不行"..如果剩下不时64的倍数就可以发送..(而且貌似前面几次的发送都是假的,并没有发送到PC,只有最后一次非64的Valid后.串口才受到数据).
现在的改进方法是将 if (remain > 64) 改为 (remain > 63) 这样每一次Valid都可以真正的将数据发送到PC..
对USB基本搞不懂.. 对程序的更改都时做了一些假设.. 想弄清楚为什么64字节就是发不出呢??...
谢过 |