描述
- USB 的功能还是比较的复杂,这里主要了解USB CDC类(Communication Device Class)实现的虚拟串口 【Virtual Port Com】
- 学习的思路依旧是先用起来,再去针对性的熟悉USB相关的协议
- USB转串口,是的,本篇就是实现这个功能
平台搭建
- STM32平台:STM32L475,当然其他的STM32系列拥有USB接口的依旧可以拿来验证
- 这里使用
STM32CubeMX
快速搭建USB的学习环境 - 这里主要为:USB Device, 选择USB组件:【Virtual Port Com】
- 这里生成Keil MDK5的功能,不用改代码,就可以编译成功,下载到开发板,发现枚举了一个USB的虚拟串口出来
功能验证
- 既然是串口,我就使用串口助手,打开这个【虚拟串口】,发送数据,没响应,通过看代码,发现,接收串口数据的API为:
usbd_cdc_if.c
中的:CDC_Receive_FS
- 在:
CDC_Receive_FS
函数打上【断点】,进入调试模式,看看是否可以接收到 PC端通过串口助手发送的串口数据
- 实测发现接收到了全局的数组:
UserRxBufferFS
中了,并且,PC端波特率随便设置,发送的数据,都能正确的接收到
验证发送
- 看代码,STM32端发送串口数据的函数为:
CDC_Transmit_FS
,这里不需要设置波特率之类的
#include "main.h"
#include "usb_device.h"
#include "usbd_cdc_if.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
#define VCP_BUF_MAX_LEN 128
void vcp_send_test(uint8_t ch)
{
uint8_t temp_buf[VCP_BUF_MAX_LEN];
for (uint16_t i = 0; i < VCP_BUF_MAX_LEN; i++)
{
temp_buf[i] = 0x41;
}
temp_buf[0] = ch;
CDC_Transmit_FS(temp_buf, sizeof(temp_buf));
}
int main(void)
{
uint8_t ch = 0x00;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
while (1)
{
HAL_Delay(5000);
vcp_send_test(ch);
ch++;
}
}
- 验证发现,STM32 虚拟串口发送出来的数据,是正确的
小结
- 初步通过ST官方提供的
STM32CubeMX
,快速搭建了USB【虚拟串口】工程,但是CDC类的使用细节,还需要进一步了解 - USB协议比较的庞大,需要不断的学习研究,加上不断的【使用】与【实践】,才能真正的掌握起来
标签:ch,USB,CDC,void,串口,buf 来源: https://blog.csdn.net/tcjy1000/article/details/122815543
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。