zoukankan      html  css  js  c++  java
  • USB虚拟串口(VCP)收发数据

    首先进行USB的配置,时钟配置USB为48Hz,usb选择device,usb_device选择VCP,最后在manager中更改heap size为0x600


    先对vcp初始化

    void USB_Status_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
    
        /* GPIO Ports Clock Enable */
        __HAL_RCC_GPIOA_CLK_ENABLE();
    
        /*Configure GPIO pin Output Level */
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11 | GPIO_PIN_12, GPIO_PIN_RESET);
    
        /*Configure GPIO pin : W25Q256_CS_Pin */
        GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        HAL_Delay(10);
    }

    初始化区域写入

      USB_Status_Init();

    使用CDC_Transmit_FS进行发送数据

     CDC_Transmit_FS(TXT, sizeof(TXT));

    (TXT也为u8)

     CDC_Transmit_FS函数位置为usbd_cdc_if.c

    优化后

    uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
    {
      uint8_t result = USBD_OK;
      /* USER CODE BEGIN 7 */
      uint32_t TimeStart = HAL_GetTick();
      USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
      //if (hcdc->TxState != 0) return USBD_BUSY;
      while(hcdc->TxState)
      {
          if(HAL_GetTick()-TimeStart > 10)
        return USBD_BUSY;
          else
        break;
      }
      USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
      result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
      TimeStart = HAL_GetTick();
      while(hcdc->TxState)
        {
            if(HAL_GetTick()-TimeStart > 10)
              return USBD_BUSY;
        }
      /* USER CODE END 7 */
      return result;
    }

    虚拟串口接收

    使用CDC_Receive_FS函数

    注意:CDC_Receive_FS()是接收函数。这个函数不需要调用。直接在函数中添加代码把接受到的数据和数据长度复制到自己定义的接收缓存。


    uint8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
    {
      /* USER CODE BEGIN 6 */
        p1=(Buf[0]-'0')*1000+(Buf[1]-'0')*100+(Buf[2]-'0')*10+(Buf[3]-'0');
        p2=(Buf[5]-'0')*1000+(Buf[6]-'0')*100+(Buf[7]-'0')*10+(Buf[8]-'0');
      //USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
      USBD_CDC_ReceivePacket(&hUsbDeviceFS);
      //CDC_Transmit_FS(Buf, sizeof(Buf));
      return (USBD_OK);
      /* USER CODE END 6 */
    }

    此外,不同.c文件中变量互相使用,在A文件中声明p变量,在B文件中使用时用extern定义

  • 相关阅读:
    团队开发5
    团队开发4
    团队开发3
    团队开发2
    团队开发1
    团队计划会议
    寒假学习进度---完结篇
    寒假学习进度十七
    寒假学习进度十六
    python后续学习
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/14018770.html
Copyright © 2011-2022 走看看