前两天在调试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); }
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;//将收到数据的数目清零 } } } }
经过研究发现问题出在指针变量上(上面程序标红的地方)。
查看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); }
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语言不扎实呀!!!