关于指针变量的应用问题

前两天在调试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语言不扎实呀!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值