华芯微特开发论坛

 找回密码
 立即注册
搜索
热搜: SWM341 资料
查看: 107|回复: 3

USBD VCOM_serial

[复制链接]

6

主题

21

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2024-3-24 20:05:07 | 显示全部楼层 |阅读模式
这个 usbd 库, 在rtos 下太难了,阻塞点太多了
回复

使用道具 举报

12

主题

46

帖子

391

积分

超级版主

Rank: 8Rank: 8

积分
391
发表于 2024-3-24 22:29:54 | 显示全部楼层

阻塞点具体是指哪些地方??
回复

使用道具 举报

6

主题

21

帖子

90

积分

注册会员

Rank: 2

积分
90
 楼主| 发表于 2024-3-25 11:10:29 | 显示全部楼层
大于64字节,很容易阻塞, 虽然用事件

一次数据最大应该63 ,64 发不出去
超64个数据 很容易阻塞

如下 代码, 超64字节 ,发出去数据接收不完整, 少于63字节 偶尔不正常

  1. void VCOM_Transmit(uint8_t *buf, uint16_t size)
  2. {



  3.         // 多次循环发送, 未成功
  4.             int32_t i, len;
  5.             int32_t max_one_time = EP_BULK_IN_PKSZ -1;
  6.             int32_t tmp_size =size;
  7.                 uint8_t *tmp_buffer = buf;


  8.                 while(1)
  9.                 {
  10.                         if((tmp_size > 0) || RX_Timeout){
  11.                                 // log_i(" tmp_size ==>  %d",tmp_size);
  12.                                 len = (tmp_size>max_one_time)?max_one_time:tmp_size;

  13.                                 //         osEventFlagsWait (vcom_EventHandle,VCOM_TRANSMIT,0,portMAX_DELAY);
  14.                                 // osEventFlagsClear (vcom_EventHandle,VCOM_TRANSMIT_CPLT );
  15.                                 // osEventFlagsSet (vcom_EventHandle,VCOM_TRANSMIT );
  16.                                 usb_vcom_transmission_start();

  17.                                 USBD_TxWrite( EP_BULK_IN_NUM, tmp_buffer, len );
  18.                                 tmp_buffer += len;
  19.                                 tmp_size -= len;

  20.                                 usb_vcom_transmission_wait_cplt();
  21.         // osEventFlagsWait (vcom_EventHandle,VCOM_TRANSMIT_CPLT,0,portMAX_DELAY);
  22.         // osEventFlagsClear (vcom_EventHandle,VCOM_TRANSMIT_CPLT );
  23.                                 // 清除阻塞
  24.                                 if(USBD->INEP[EP_BULK_IN_NUM].TXTRSZ == max_one_time) {
  25.                                         USBD_TxWrite(EP_BULK_IN_NUM, 0, 0);
  26.                                 }
  27.                                 // log_i(" tmp_size ==>CPLT  %d TXTRSZ  %d",tmp_size,USBD->INEP[EP_BULK_IN_NUM].TXTRSZ);
  28.                         }

  29.                         if(tmp_size== 0) break;  // 跳出循环
  30.                 }


  31. }
复制代码
回复

使用道具 举报

6

主题

21

帖子

90

积分

注册会员

Rank: 2

积分
90
 楼主| 发表于 2024-3-29 11:12:30 | 显示全部楼层
超64个字符总是丢最后一个字符

  1. void VCOM_Transmit(uint8_t *buf, uint16_t size)
  2. {


  3.                 int32_t i, len;
  4.                 memcpy((void*)vcom.rx_buff, (void*)buf, size);
  5.                 vcom.rx_bytes = size;
  6.                 int32_t total_size =size;

  7.                 while(1)
  8.                 {
  9.                         if((vcom.rx_bytes > 0) || RX_Timeout){
  10.                                 len = (vcom.rx_bytes>EP_BULK_IN_PKSZ)?EP_BULK_IN_PKSZ:vcom.rx_bytes;
  11.                                 usb_vcom_transmission_start();
  12.                                 for(i = 0; i < len; i++)
  13.                                 {
  14.                                         vcom.in_buff[i] = vcom.rx_buff[total_size-vcom.rx_bytes+i];
  15.                                 }
  16.                                 vcom.in_bytes = len;
  17.                                 USBD_TxWrite( EP_BULK_IN_NUM, (uint8_t *)vcom.in_buff, vcom.in_bytes );
  18.                                 usb_vcom_transmission_wait_cplt();
  19.                                 vcom.rx_bytes -= len;
  20.                         }else{
  21.                                 if(USBD->INEP[EP_BULK_IN_NUM].TXTRSZ == EP_BULK_IN_PKSZ) {
  22.                                         USBD_TxWrite(EP_BULK_IN_NUM, 0, 0);
  23.                                 }
  24.                         }
  25.                         // 清除阻塞
  26.                         // if(USBD->INEP[EP_BULK_IN_NUM].TXTRSZ == EP_BULK_IN_PKSZ) {
  27.                         //         USBD_TxWrite(EP_BULK_IN_NUM, 0, 0);
  28.                         // }
  29.                         log_i(" tmp_size ==>CPLT rx_bytes %d      ",vcom.rx_bytes );
  30.                         if(vcom.rx_bytes  == 0) break;  // 跳出循环
  31.                 }

  32. }
复制代码



回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|华芯微特开发论坛

GMT+8, 2024-5-20 13:28 , Processed in 0.031185 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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