Windows下USB虚拟串口通讯有一定几率延迟数据
Windows下USB虚拟串口通讯有一定几率延迟数据在使用MCU发送64 、128、 256字节的这种整包的数据时候(发送以后等待),
Windows在接收以后不会立即交给串口助手,会缓存起来,这个时候需要
在MCU端触发,比如发送一个空包或者一个字节的包,Windows才会把数据
给到串口助手,Mac下没这个问题,Windows下偶然发现的
send_bulk(buf, 64);
调小BULK_SIZE小于64不再出现,比如63
void send_bulk(char* buf, u16 count)
{
uart_send("Bulk Send Start:");
while (count > 0) {
if (count>BULK_SIZE) {
USB_BULK_SendData(buf, BULK_SIZE);
buf += BULK_SIZE;
count -= BULK_SIZE;
} else {
USB_BULK_SendData(buf, count);
count=0;
}
}
uart_send("Bulk Send End:");
}
void USB_BULK_SendData(BYTE* dat, BYTE size)
{
uart_send("Send Start:");
uart_send_char(size);
while(UsbInBusy);
IE2 &= ~0x80; //EUSB = 0;
usb_write_reg(INDEX, 1);
for (i=0; i< size; i++)
{
usb_write_reg(FIFO1, dat);
}
UsbInBusy = 1;
usb_write_reg(INCSR1, INIPRDY);
IE2 |= 0x80; //EUSB = 1;
uart_send("Send DONE");
}使用USBTrace抓包与表象一致,下个包到以后,前一个包会和下一个包一起被处理, 似乎与确认回传机制有关
(UART是调试用的,打印数据正常,显示已经发送完毕了)
USB Endp0~Endp3端点缓冲区是64字节,
使用CDC串口发送时,如果传输的数据长度是64整数倍字节,
传输完成数据后是要继续发一个空包触发完成数据传输。
官方封装的usb cdc lib文件也有进行相关处理,
所以不管发送多少字节数据,都能正常通信。
烧录屠龙刀例程包里面的例子“23-通过USB CDC协议虚拟串口收发数据”到芯片里,
通过串口助手发送数据跟MCU进行收发测试:
乘风飞扬 发表于 2024-9-27 18:11
USB Endp0~Endp3端点缓冲区是64字节,
使用CDC串口发送时,如果传输的数据长度是64整数倍字节,
传输完成数 ...
感谢解答 乘风飞扬 发表于 2024-9-27 18:11
USB Endp0~Endp3端点缓冲区是64字节,
使用CDC串口发送时,如果传输的数据长度是64整数倍字节,
传输完成数 ...
最近刚好遇到这个问题,请教下这里说的“相关处理”是不是如下处理,发送空包?
ercircle 发表于 2025-1-7 11:53
最近刚好遇到这个问题,请教下这里说的“相关处理”是不是如下处理,发送空包?
超过64字节需要分包发送,类似这样:
void USB_SendData(BYTE *dat, int size)
{
BYTE cnt;
int addr;
IE2 &= ~0x80; //EUSB = 0;
usb_write_reg(INDEX, 1);
addr = 0;
do
{
cnt = size > 64 ? 64 : size;
while (usb_read_reg(INCSR1) & INIPRDY);
usb_bulk_intr_in(&dat, cnt, 1);
addr += cnt;
size -= cnt;
} while (cnt >= 64);
IE2 |= 0x80; //EUSB = 1;
} 乘风飞扬 发表于 2025-1-7 14:38
超过64字节需要分包发送,类似这样:
好的,还要考虑分包,多谢{:4_196:}
页:
[1]