错误 [Pe167]:类型为"uint16_t *"的参数与类型为"无符号字符 *"的参数不兼容

Error[Pe167]: argument of type "uint16_t *" is incompatible with parameter of type "unsigned char *"

本文关键字:类型 参数 不兼容 字符 无符号 uint16 Pe167 错误      更新时间:2023-10-16

我想通过usb在平板电脑和stm32之间建立通信,为此我在代码中添加了usb库。在代码中添加库时,我遇到了这个错误。

错误[Pe167]:类型为"uint16_t*"的参数与类型为"unsigned char*"的参数不兼容

我使用IAR嵌入式工作台EWARM工具进行stm32编码。下面显示的函数返回线上出现错误。

static USBH_Status USBH_ADK_getProtocol ( USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)
{
phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_TYPE_VENDOR | USB_REQ_RECIPIENT_DEVICE;
phost->Control.setup.b.bRequest = ACCESSORY_GET_PROTOCOL;
phost->Control.setup.b.wValue.w = 0;
phost->Control.setup.b.wIndex.w = 0;
phost->Control.setup.b.wLength.w = 2;
 abc= ADK_Machine.protocol;
/* Control Request */
return USBH_CtlReq(pdev, phost, &ADK_Machine.protocol , 2 );
}

函数USBH_CtlReq是

USBH_Status USBH_CtlReq     (USB_OTG_CORE_HANDLE *pdev, 
                         USBH_HOST           *phost, 
                         uint8_t             *buff,
                         uint16_t            length)
{
USBH_Status status;
status = USBH_BUSY;
switch (phost->RequestState)
{
case CMD_SEND:
/* Start a SETUP transfer */
USBH_SubmitSetupRequest(phost, buff, length);
phost->RequestState = CMD_WAIT;
status = USBH_BUSY;
break;
case CMD_WAIT:
 if (phost->Control.state == CTRL_COMPLETE ) 
{
  /* Commands successfully sent and Response Received  */       
  phost->RequestState = CMD_SEND;
  phost->Control.state =CTRL_IDLE;  
  status = USBH_OK;      
}
else if  (phost->Control.state == CTRL_ERROR)
{
  /* Failure Mode */
  phost->RequestState = CMD_SEND;
  status = USBH_FAIL;
}   
 else if  (phost->Control.state == CTRL_STALLED )
{
  /* Commands successfully sent and Response Received  */       
  phost->RequestState = CMD_SEND;
  status = USBH_NOT_SUPPORTED;
}
break;
default:
break; 
}
return status;
}

有谁能帮我解决这个问题吗。提前谢谢。

AFAICT,在行中:

return USBH_CtlReq(pdev, phost, &ADK_Machine.protocol , 2 );

1是CCD_ 2。如果这是真的,则获取其地址将生成uint16_t *,该CCD_3不能转换为USBH_CtlReq所期望的uint8_t*

C中的许多低级"发送"函数都将参数声明为uint8_t*unsigned char*,以表明它们期望的是"字节"。原则上,他们也可以声明void*

但是,在这种情况下,唯一要做的就是铸造,比如:

return USBH_CtlReq(pdev, phost, (uint8_t*)&ADK_Machine.protocol , 2 );

当然,您需要注意的是,这不会解决端序问题。