前两天在调试USB HID类双向通讯的时候遇见这样一个问题:
在usb_endp.c文件中编写EP1_OUT_Callback函数程序用于读取USB设备端收到的数据。然后在main.c主函数中将数据通过USB发送出去。
程序如下
usb_endp.c中的程序
uint32_t DataLen=0;
<span style="color:#ff0000;">uint8_t *p;</span>
void EP1_OUT_Callback(void)
{
DataLen = USB_SIL_Read(ENDP1,<span style="color:#ff0000;">p</span>);
SetEPRxValid(ENDP1);
}
main.c中的程序、
extern uint32_t DataLen;
<span style="color:#ff0000;">extern uint8_t *p;</span>
int main(void)
{
u8 key;
u8 i=0,k=0;
delay_init(72);
NVIC_Configuration();
uart_init(USART2,115200);
LED_Init();
KEY_Init();
delay_ms(500);
USB_Interrupts_Config();
Set_USBClock();
USB_Init();
while (1)
{
if(GetEPTxStatus(ENDP1)==EP_TX_NAK)//判断USB是否发送完成
{
if(DataLen !=0)//如果收到数据
{
USB_SIL_Write(ENDP1,<span style="color:#ff0000;">p</span>,DataLen);//发送数据
SetEPTxValid(ENDP1);//使能发送端点
DataLen=0;//将收到数据的数目清零
}
}
}
}
出现的问题就是:我用上位机通过主机给USB设备发数据,结果USB设备收到数据存到*p里,通过主函数里在把*p里数据发到USB主机上位机上,显示发送的数据与接收的数据不符。
经过研究发现问题出在指针变量上(上面程序标红的地方)。
查看C语言书籍,发现了问题的所在:
定义一个指针变量 int *p,则指针变量名是p,而不是*p,即“*”不是指针变量名的一部分,在定义变量时,在变量名前加一个“*”表示该变量是指针变量。*p是指针变量p所指向的变量。在上面的程序中,我们声明uint8_t *p,但是没有的对p赋值,因此p并无确定的值(它的值是不可预见的),也就是说p所指向的单元是不可预见的,在这种情况下,对*temp赋值是一件很危险的事情(即 USB_SIL_Read(ENDP1,p);将数据放入到指针变量p指向的位置,实际上是未知的)可能会破坏系统的正常工作。由此可见我们出现问题的原因就是未对*p做一个初始化。
所以要改正这个问题就是需要用另外一个变量对*p做初始化。比如
int *p;
int a=10;
p=&a;
或者是用数组来完成这个工作。本次我使用的是数组来完成这个工作,修改后的程序如下
usb_endp.c中的程序
uint32_t DataLen=0;
<span style="color:#ff0000;">uint8_t kk[64];</span>
void EP1_OUT_Callback(void)
{
DataLen = USB_SIL_Read(ENDP1,<span style="color:#ff0000;">kk</span>);
SetEPRxValid(ENDP1);
}
main.c中的程序、
extern uint32_t DataLen;
<span style="color:#ff0000;">extern uint8_t kk[64];</span>
int main(void)
{
u8 key;
u8 i=0,k=0;
delay_init(72);
NVIC_Configuration();
uart_init(USART2,115200);
LED_Init();
KEY_Init();
delay_ms(500);
USB_Interrupts_Config();
Set_USBClock();
USB_Init();
while (1)
{
if(GetEPTxStatus(ENDP1)==EP_TX_NAK)//判断USB是否发送完成
{
if(DataLen !=0)//如果收到数据
{
USB_SIL_Write(ENDP1,<span style="color:#ff0000;">kk</span>,DataLen);//发送数据
SetEPTxValid(ENDP1);//使能发送端点
DataLen=0;//将收到数据的数目清零
}
}
}
}
C语言不扎实呀!!!