GD32 虛擬串口通訊速度測試
硬件說明:
- MCU: GD32C103 120M,128K,32k RAM.
- 輸入:USB 5V.
- OBD功能口定義:OBD(2,10)VPWM、OBD 7(K線)、OBD 6(CAN H)、OBD 14(CAN L)、OBD 15(L線).
電路圖
例程說明
約定簡單通訊協(xié)議,測試虛擬串口最大傳輸速度
測試平臺
1 WIN10 32/64位(免驅(qū)動),WIN7 32 /64 需安裝驅(qū)動
2 UsbTest.exe 測試工具,傳輸速度500K 左右
通訊協(xié)議說明
上位機發(fā)送一幀數(shù)據(jù)格式55 AA LEN(2BYTE) DATA ...
下位機發(fā)送一幀數(shù)據(jù)格式55 AA LEN(2BYTE) DATA ...
軟件設計
UsbTest 上位機軟件按5K一次循環(huán)讀取選擇的文件內(nèi)容,
按格式 55 AA LEN(2BYTE) DATA ... 發(fā)送給下位機,下位機接收完數(shù)據(jù)后按
55 AA LEN(2BYTE) DATA ... 格式發(fā)回給上位機,上位機根據(jù)接收到的DATA寫進temp.txt
文件中,當文件發(fā)送完成后對比temp.txt 和選擇的文件可知是否丟失數(shù)據(jù)。
上位機說明
- 如下圖所示,Open打開串口,GetFile 選擇文件后開始傳輸數(shù)據(jù)
2 傳輸完成后用BCompare軟件對比發(fā)送和接收的文件,如下圖所示 ,18.5M的文件并未丟失數(shù)據(jù)
(2)下位機代碼說明
1 App.c 文件代碼說明
iUsbLen=0; //接收的數(shù)據(jù)長度
i UsbFlag=0;//接收完成標記
iUsbLenPre=0;
/* main loop */
while (1)
{
if(iUsbFlag==0x80)//一幀數(shù)據(jù) 接收完畢
{
SendUsbDate(&cdc_acm,iUsbBuf,iUsbLen);//發(fā)送數(shù)據(jù)返回給下位機
iUsbLenPre=0;
iUsbLen=0; //接收的數(shù)據(jù)長度
iUsbFlag=0;//接收完成標記
iCmt++;
if(iCmt%2) gpio_bit_reset(GPIOB,GPIO_PIN_12);
else gpio_bit_set(GPIOB,GPIO_PIN_12);
}
continue;
}
2 cdc_acm_core.c文件代碼說明
USB虛擬串口接收函數(shù)
static uint8_t cdc_acm_out (usb_dev *udev, uint8_t ep_num)
{
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE];
cdc->packet_receive = 1U;
cdc->receive_length = ((usb_core_driver *)udev)->dev.transc_out[ep_num].xfer_count;
iUsbFlag=0;//接收完成標記
if(cdc->data[0]==0x55&&cdc->data[1]==0xAA)//幀開頭
{
iUsbLen=cdc->data[2]*256+cdc->data[3];
}
for(uint8_t i=0;i<cdc->receive_length;i++)
{
if(iUsbLenPre>=10239) break;
iUsbBuf[iUsbLenPre++]=cdc->data[i];
}
if(iUsbLenPre>=iUsbLen||iUsbLenPre>10239)
{
iUsbFlag=0x80;//接收完成標記
}
cdc_acm_data_receive(udev);
return USBD_OK;
}
USB虛擬串口發(fā)送函數(shù)
void SendUsbDate(usb_dev *udev,uint8_t*Buf,uint32_t len)
{
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE];
if (0U != len)
{
cdc->packet_sent = 0U;
usbd_ep_send (udev, CDC_DATA_IN_EP, (uint8_t*)(Buf), len);
cdc->receive_length = 0U;
}
}
源碼地址
單片機代碼地址
https://github.com/siyuan1644/GD32-USB_CDC-TEST.git
VS 代碼地址
https://github.com/siyuan1644/UsbSpeedTest.git