- UID
- 1029342
- 性别
- 男
|
这里使用了一个变量记录应该发送第几个数据包,当程序的其它部分准备好数据后只要设置
这个变量 packetN=0,上述发送操作就会启动,程序的其它部分只需检测 packetN==3 即可
知道 MyBuffer 是否已经腾空,程序的其它部分可以使用 MyBuffer 继续其它操作,注意这时
数据不一定已经全部发送完毕。
你的另一个问题在于这一行:SetEPTxAddr(ENDP1,ENDP1_TXADDR+i*64);
ENDP1_TXADDR 是专门的发送缓冲区,它的长度是有限的,而且是每 32 位编址中只有低
16 位有效;所以需要使用函数 UserToPMABufferCopy()操作这个发送缓冲区,这个函数已经
在 USB 库的手册中说明。
最后一个问题是:如果你的程序中使用了 ENDP1_RXADDR,因为你改变了 ENDP1 包的长
度,即改变了发送缓冲区的长度,需要在 usb_conf.h 中重新定义以下 ENDP1_RXADDR 的
地址。
//、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
下面是我的部分程序 是在官方USB模拟串口程序上改的,专门用于测试发送状态下连续发送数据
u8 my_string[]={"2013我们希望\r\n"};
u16 myint=0;
inc_my_string()
{
myint++;
if(myint>9999)myint=0;
my_string[0]=myint/1000+'0';
my_string[1]=(myint00)/100+'0';
my_string[2]=(myint0)/10+'0';
my_string[3]=(myint)+'0';
}
//通过电脑发送的数据在EP3_OUT_Callback中可以获取到
//发向电脑的数据可以在USB_Send_Data函数中传送
int main(void)
{
Init_System();//系统初始化
Set_USBClock();//设置USB时钟
USB_Interrupts_Config(); //配置USB中断
USB_Init();//初始化USB
while (1)
{
if (GetEPTxStatus(ENDP1) !=EP_TX_VALID)
//奇怪,我把这句换成if(GetEPTxStatus(ENDP1)== EP_TX_NAK)就会漏掉一些递增的数据搞不懂?没时间深究
{
inc_my_string();
USB_Send_Data(my_string,14);//发送递增计数 看模拟的串口数据有没有漏掉的
}
}
} |
|