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線).
電路圖
例程說明
約定簡單通訊協議,測試虛擬串口最大傳輸速度
測試平臺
1 WIN10 32/64位(免驅動),WIN7 32 /64 需安裝驅動
2 UsbTest.exe 測試工具,傳輸速度500K 左右
通訊協議說明
上位機發送一幀數據格式55 AA LEN(2BYTE) DATA ...
下位機發送一幀數據格式55 AA LEN(2BYTE) DATA ...
軟件設計
UsbTest 上位機軟件按5K一次循環讀取選擇的文件內容,
按格式 55 AA LEN(2BYTE) DATA ... 發送給下位機,下位機接收完數據后按
55 AA LEN(2BYTE) DATA ... 格式發回給上位機,上位機根據接收到的DATA寫進temp.txt
文件中,當文件發送完成后對比temp.txt 和選擇的文件可知是否丟失數據。
上位機說明
- 如下圖所示,Open打開串口,GetFile 選擇文件后開始傳輸數據
2 傳輸完成后用BCompare軟件對比發送和接收的文件,如下圖所示 ,18.5M的文件并未丟失數據
(2)下位機代碼說明
1 App.c 文件代碼說明
iUsbLen=0; //接收的數據長度
i UsbFlag=0;//接收完成標記
iUsbLenPre=0;
/* main loop */
while (1)
{
if(iUsbFlag==0x80)//一幀數據 接收完畢
{
SendUsbDate(&cdc_acm,iUsbBuf,iUsbLen);//發送數據返回給下位機
iUsbLenPre=0;
iUsbLen=0; //接收的數據長度
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虛擬串口接收函數
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虛擬串口發送函數
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






