STC USB-CDC 虚拟串口使用

本文介绍了STC8和STC32G单片机上的USB-CDC虚拟串口功能,该功能提供比WCH单片机更快的数据传输速度和更简单的使用方式。然而,它在稳定性方面存在问题,可能会丢失端口号并重启。USB-CDC虚拟串口利用CRC校验提高数据可靠性,但存在端口丢失和通信不稳定的现象。文章提供了STCUSB-CDC虚拟串口的环境搭建步骤和示例代码,帮助开发者理解和应用这一技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STC USB-CDC 虚拟串口使用


✨目前该功能只能在STC8和STC32G单片机上实现该功能。比起WCH的单片机,这一点要远强于STC的USBCDC功能了。WCH随便一个8位单片机上都可以跑其该功能。

  • 🔰如果该功能在使用时,出现不稳定,容易丢失端口号又重启出现,请检查连接器是否可靠,特别是micro-usb连接座。

📋在实际效果测试中该功能并不是很稳定,端口易丢失重启,偶尔又正常,如果较长时间里没有数据通讯端口会消失的情况。

  • 🔖 STC MCU支持USB CDC功能的单片机型号:STC8系列型号后缀带字母U的支持USB功能,STC32系列全部支持。
  • 🍕USB-CDC功能可以节省一个串口的使用,不过付出的代价就是,使用USB CDC需要占用较多的RAM和ROM空间。

✅USB-CDC 虚拟串口概述

当单片机需要和电脑之间进行数据交换时,首选一般都是串口通讯。目前只有STC8H和STC32G 系列单片机支持此功能,当用户代码中嵌入 USB-CDC 代码后,使用 USB 线将单片机与电脑直接相连接,在电脑端就可识别出【USB-CDC 虚拟串口】。

  • 📖USB-CDC连接电路参考
    在这里插入图片描述

🌼USB-CDC虚拟串口和传统串口相比有如下优点:

  • 数据传输更快:USB-CDC虚拟串口忽略传统串口的波特率,传输速度的比特率为全速USB的通讯速度12M bps(即每秒12M位)
  • 使用更简单便捷:USB-CDC虚拟串口忽略传统串口的起始位、停止位等冗余信息
  • 数据传输更可靠:USB-CDC虚拟串口丢弃传统串口简单的软件奇偶校验机制,采用高可靠的CRC校验!
    USB-CDC虚拟串口数据传输时有USB硬件CRC校验,以及校验出错重传机制,确保数据100%正确
  • 自动缓存数据:USB-CDC虚拟串口会自动缓存数据。单片机在没有处理完成上位机下传的上一笔数据时,
    如果此时上位机又有新的数据下传,虚拟串口会自动将新的数据缓存,从而保证数据100%不会丢失或被覆盖。
  • 不管波特率,USB-CDC是12M bps的固定速度通信;
  • 不管奇偶校验位,USB-CDC通信无奇偶校验位。

🛠STC USB-CDC 虚拟串口环境搭建

  • 📌下载对应依赖库,当前下载地址:https://www.stcai.com/khs
    在这里插入图片描述
    在这里插入图片描述
  • ✨当前最新的.LIB库:提供了2种模式:查询和中断模式
    在这里插入图片描述
  • ✨ 该库集成了免冷启动,自动下载命令,可以在下载更新程序的时候,不需要手动复位单片机执行下载操作。使用此功能的前提是,需要在STC-ISP软件界面,切换到“接到用户命令后复位到ISP监控程序区”,先点击发送“发送用户自定义命令并开始下载”
    在这里插入图片描述
  • 🔨根据不同的配置选项使用不同的.lib库
  • 这里以STC8H为例:
    在这里插入图片描述
  • 🌿stc_usb_cdc_8h_data.lib对应:
    在这里插入图片描述
  • 🌿stc_usb_cdc_8h_xdata.lib对应的是:
    在这里插入图片描述
  • 🌴通用选项:将未使用的函数不启用REMOVEUNUSED
    在这里插入图片描述
  • 🍁工程架构
    在这里插入图片描述

📝主程序代码(查询方式)

  • 🔖本程序可以实现串口调试信息输出,配合STC-ISP实现免冷启动,自动进行HID模式下载。

在这里插入图片描述

#include "stc8h.h"
#include "stc32_stc8_usb.h"

#define FOSC        24000000UL  //定义主时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //不停电自动 ISP 下载命令
void main()
{
    P_SW2 |= 0x80;
    P0M1 = 0x00;
    P0M0 = 0x00;
    P1M1 = 0x00;
    P1M0 = 0x00;
    P2M1 = 0x00;
    P2M0 = 0x00;
    P3M1 = 0x00;
    P3M0 = 0x00;
    P4M1 = 0x00;
    P4M0 = 0x00;
    P5M1 = 0x00;
    P5M0 = 0x00;
    P6M1 = 0x00;
    P6M0 = 0x00;
    P7M1 = 0x00;
    P7M0 = 0x00;
    P3M0 &= ~0x03; //P3.0/P3.1 和 USB 的 D-/D+共用 PIN 脚,
    P3M1 |= 0x03; //需要将 P3.0/P3.1 设置为高阻输入模式
    IRC48MCR = 0x80; //使能内部 48M 的 USB 专用 IRC
    while (!(IRC48MCR & 0x01));
    USBCLK = 0x00; //设置 USB 时钟源为内部 48M 的 USB 专用 IRC
    USBCON = 0x90; //使能 USB 功能
    usb_init(); //调用 USB CDC 初始化库函数
    IE2 |= 0x80; //使能 USB 中断
    EA = 1;
         while (DeviceState != DEVSTATE_CONFIGURED); //等待 USB 完成配置
    while (1)
    {
        if (bUsbOutReady) //当硬件接收完成上位机通过串口助手发送数据后
//会自动将 bUsbOutReady 置 1
//接收的数据字节数保存在 OutNumber 变量中
//接收的数据保存在 UsbOutBuffer 缓冲区
        {
            USB_SendData(UsbOutBuffer, OutNumber); //使用 USB_SendData 库函数可向上位机发送数据
//这里的测试代码为将接收数据原样返回
            usb_OUT_done(); //处理完成接收的数据后
//调用 usb_OUT_done 准备接收下一笔数据
        }
    }
}

📚程序源码(包含所需库文件包)
复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/1n3S3xXluBCXFSC5gakM29Q
提取码: mhi3

⛳中断方式说明

  • 切换所包含的对应头文件,之外,主程序中添加了中断换掉函数,用于处理接收到的数据。
/************************************************
函数功能:USB-CDC串口接收数据的回调函数
函数描述:回调函数由USB中断在接收到串口数据时自动调用
          回调函数处理完成串口数据后需要返回1
函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
          返回0:USB会暂停接收串口数据,直到用户自行调用
                 usb_OUT_done()函数后USB才会重新恢复接收数据
注意事项:当函数返回1时用户无需调用usb_OUT_done()
          只有返回0时才需要调用usb_OUT_done()进行手动收尾
          强烈建议usb_OUT_callback返回1
************************************************/
BOOL usb_OUT_callback()   //USB CDC中断模式
{
    USB_SendData(UsbOutBuffer, OutNumber);//转发接收,发送数据缓冲区,长度
    return 1;
}
  • 🌿如果需要对接收的数据进行处理利用,可以在其回调函数中新增标志位,在主循环中添加对应标志位的判断,然后进行数据的处理。
volatile bit USBCDC_RECE_FLAG = 0;//USB CDC接收到数据标志位
/************************************************
函数功能:USB-CDC串口接收数据的回调函数
函数描述:回调函数由USB中断在接收到串口数据时自动调用
          回调函数处理完成串口数据后需要返回1
函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
          返回0:USB会暂停接收串口数据,直到用户自行调用
                 usb_OUT_done()函数后USB才会重新恢复接收数据
注意事项:当函数返回1时用户无需调用usb_OUT_done()
          只有返回0时才需要调用usb_OUT_done()进行手动收尾
          强烈建议usb_OUT_callback返回1
************************************************/
BOOL usb_OUT_callback()   //USB CDC中断模式
{
	USBCDC_RECE_FLAG = 1;
//    USB_SendData(UsbOutBuffer, OutNumber);//转发接收,发送数据缓冲区,长度
    return 1;
}


......
while(1){
				if(USBCDC_RECE_FLAG) //中断转查询方式,数据在这里处理
        {
					USBCDC_RECE_FLAG =0;
            USB_SendData(UsbOutBuffer, OutNumber);
            usb_OUT_done();					
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值