|
楼主 |
发表于 2024-3-25 11:10:29
|
显示全部楼层
大于64字节,很容易阻塞, 虽然用事件
一次数据最大应该63 ,64 发不出去
超64个数据 很容易阻塞
如下 代码, 超64字节 ,发出去数据接收不完整, 少于63字节 偶尔不正常
- void VCOM_Transmit(uint8_t *buf, uint16_t size)
- {
- // 多次循环发送, 未成功
- int32_t i, len;
- int32_t max_one_time = EP_BULK_IN_PKSZ -1;
- int32_t tmp_size =size;
- uint8_t *tmp_buffer = buf;
-
- while(1)
- {
- if((tmp_size > 0) || RX_Timeout){
- // log_i(" tmp_size ==> %d",tmp_size);
- len = (tmp_size>max_one_time)?max_one_time:tmp_size;
- // osEventFlagsWait (vcom_EventHandle,VCOM_TRANSMIT,0,portMAX_DELAY);
- // osEventFlagsClear (vcom_EventHandle,VCOM_TRANSMIT_CPLT );
- // osEventFlagsSet (vcom_EventHandle,VCOM_TRANSMIT );
- usb_vcom_transmission_start();
- USBD_TxWrite( EP_BULK_IN_NUM, tmp_buffer, len );
- tmp_buffer += len;
- tmp_size -= len;
- usb_vcom_transmission_wait_cplt();
- // osEventFlagsWait (vcom_EventHandle,VCOM_TRANSMIT_CPLT,0,portMAX_DELAY);
- // osEventFlagsClear (vcom_EventHandle,VCOM_TRANSMIT_CPLT );
- // 清除阻塞
- if(USBD->INEP[EP_BULK_IN_NUM].TXTRSZ == max_one_time) {
- USBD_TxWrite(EP_BULK_IN_NUM, 0, 0);
- }
- // log_i(" tmp_size ==>CPLT %d TXTRSZ %d",tmp_size,USBD->INEP[EP_BULK_IN_NUM].TXTRSZ);
- }
- if(tmp_size== 0) break; // 跳出循环
- }
- }
复制代码 |
|