OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4532|回复: 4

usb 转 vcp 中断回调函数与接收请教 ??

[复制链接]

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
发表于 2016-12-1 10:50:54 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 hpdell 于 2016-12-1 10:56 编辑


请教下,使用 usb 转 vcp 中断回调函数与接收问题 ??

具体如下:

1、现在可以使用 vcp 发送数据到 pc机上显示了,
uint8_t  USBH_Tx_Buffer[255];        //usb_printf发送缓冲区
//usb虚拟串口,printf 函数
//确保一次发送数据不超 255 字节
void USBH_printf(char* fmt,...)  
{  
        uint16_t i;

        va_list ap;
        va_start(ap,fmt);
        vsprintf((char *)USBH_Tx_Buffer,fmt,ap);
        va_end(ap);
        i = strlen((const char*)USBH_Tx_Buffer);//此次发送数据的长度

  CDC_Transmit_HS((uint8_t *) USBH_Tx_Buffer,  i);

}


int main()

{

     ..........

   USBH_printf( “USB VCP Send OK 0x%x”, 0x2e)  ;

}

// *************************************************************************************************
2、中断回调函数

/**
  * @brief  Connect callback.
  * @param  hpcd: PCD handle
  * @retval None
  */
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
{
  USB_bDeviceState = 1;     // 连接成功
  USBD_LL_DevConnected(hpcd->pData);

  printf("HAL_PCD_ConnectCallback ==== %d", USB_bDeviceState);
}

/**
  * @brief  Disconnect callback.
  * @param  hpcd: PCD handle
  * @retval None
  */
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
{
  USB_bDeviceState = 0;   // 断开连接
  USBD_LL_DevDisconnected(hpcd->pData);

  printf("HAL_PCD_DisconnectCallback ==== %d", USB_bDeviceState);
}


上面的两个中断函数始终都没有进入,是怎么个情况啊 ???   程序发送是正常的



// *************************************************************************************************
3、函数接收

static int8_t CDC_Receive_HS (uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 11 */
  USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceHS);
  return (USBD_OK);
  /* USER CODE END 11 */
}


这个函数接收 要如何处理啊,???
// *************************************************************************************************
4、测试程序
USBH_USB3300_VCP.rar (3.85 MB, 下载次数: 148)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-12-1 18:49:27 | 显示全部楼层
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2016-12-2 09:33:21 | 显示全部楼层
正点原子 发表于 2016-12-1 18:49
请参考我们的VCP例程

你好,我看了你们 的历程,跟我使用的usb库的版本不同,如果需要使用你们的历程,usb库需要更改
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2016-12-2 10:47:20 | 显示全部楼层
本帖最后由 sammy902583 于 2016-12-2 11:04 编辑

1. HAL_PCD_DisconnectCallback() 应该在Host下reset的时候会被回call, 只是在Windows底下可能不容易出现, 在Linux用libusb控制应该可以达成. ConnectCallback应该是比较容易观察到, 下断点应该會停.

2. CDC_Receive_HS() 在STM32收到资料的时候会被回call.

您要在
  USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceHS);
这两行之前处理 Buf里面的资料, 接受到的長度放在 *Len里面. 比方讲STM324xG_EVAL里面的sample里面, 呼叫
  HAL_UART_Transmit_DMA(&UartHandle, Buf, *Len);
把资料转送到UART上面.

如果还需要再收资料的话要呼叫  USBD_CDC_ReceivePacket(&hUsbDeviceHS); 如果没有跑这一行, Host将无法在送资料给STM32, 不过也不一定在要Receive里面呼叫, 端看您的应用如何使用.

USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]); 在Init的时候已经设过了, buffer没有变更, 其实这一行是不需要的.
3. APP_RX_DATA_SIZE这个值最好要設成CDC_DATA_HS_OUT_PACKET_SIZE, 因为如果Host传大小超過预设的4 byte, 程式可能会出现一些奇怪的现象.


回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2016-12-2 16:24:44 | 显示全部楼层
sammy902583 发表于 2016-12-2 10:47
1. HAL_PCD_DisconnectCallback() 应该在Host下reset的时候会被回call, 只是在Windows底下可能不容易出现,  ...

你好,我在
HAL_PCD_DisconnectCallback() 这个函数里面设置了,只要进入这个函数就会使用串口就会打印信息出来,但是始终都没有信息出来

另外 HAL_PCD_ConnectCallback() 这个里面也是


目前程序的收发都还比较正常,波特率设置为 1392400 ,工作也很稳定,


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-11 02:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表