目前初步发现出错的规律:
将 APP_RX_DATA_SIZE 设为 8192
发送报文长度固定为 4106,出问题时收到的数据为 4096,缺少10个字节。
使用下面的程序,执行2048次成功发送后出现现问题,每次复位后可以重现。Len=4106
static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len) {
APP_Rx_ptr_in= (APP_Rx_ptr_in+Len) % APP_RX_DATA_SIZE;
return USBD_OK;
}
使用下面的程序,每次执行都可以重现问题, Len=4106
static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len) {
APP_Rx_ptr_in=APP_Rx_ptr_out=4096;
APP_Rx_ptr_in= (APP_Rx_ptr_in+Len) % APP_RX_DATA_SIZE;
return USBD_OK;
}
使用下面的程序,极少出错。 Len=4106
static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len) {
APP_Rx_ptr_in =Len;
APP_Rx_ptr_out =0;
return USBD_OK;
}
注: 上述过程省略了Buf数据复制到APP_Rx_Buffer的过程;
发送报文4106-4112 的表现均相同。
出错的情况与主机USB端口的忙碌程度好像有关,如果主机正在U盘访问,问题容易出现。
|