VC++实现 USB 通信程序

在 VC++(Visual Studio)里写 USB 通信程序,核心取决于 USB 设备类型。下面 三种最常用、的方案


一、方案选型

设备类型 推荐方案 是否需要驱动
STM32 USB HID HIDAPI(最推荐 ) 免驱
USB 转串口(CDC) 串口 API / QtSerialPort 免驱
自定义 USB 设备 WinUSB / libusb 需要 inf

90% 的嵌入式项目用 HID(免驱、稳定、跨平台)


二、方案一:HID 设备通信(STM32 HID 最常用 )

1、准备 HIDAPI


2、 查找并打开 HID 设备

#include <stdio.h>
#include "hidapi.h"

#pragma comment(lib, "hidapi.lib")

int main()
{
    hid_device *handle;
    unsigned short VID = 0x0483;   // STM32 VID
    unsigned short PID = 0x5750;   // STM32 PID

    hid_init();

    handle = hid_open(VID, PID, NULL);
    if (!handle)
    {
        printf("未找到 HID 设备\n");
        return 1;
    }

    printf("HID 设备已连接\n");

3、向 STM32 发送数据(OUT)

    unsigned char buf[65];
    memset(buf, 0x00, sizeof(buf));

    buf[0] = 0x00;     // 报告 ID(无 ID 填 0)
    buf[1] = 0xAA;
    buf[2] = 0x55;

    int res = hid_write(handle, buf, 65);
    printf("发送 %d 字节\n", res);

4、从 STM32 接收数据(IN)

    while (1)
    {
        res = hid_read(handle, buf, 65);
        if (res > 0)
        {
            printf("收到数据:");
            for (int i = 0; i < res; i++)
                printf("%02X ", buf[i]);
            printf("\n");
        }
        Sleep(10);
    }

    hid_close(handle);
    hid_exit();
    return 0;
}

5、STM32 端对应

  • 报告描述符:64 字节 IN / OUT
  • USBD_CUSTOM_HID_SendReport()
  • EP1 OUT 回调接收

三、方案二:USB 转串口(CDC)

使用 Windows API

#include <windows.h>

HANDLE hCom = CreateFile(
    L"\\\\.\\COM3",
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    0,
    NULL
);

DCB dcb = {0};
dcb.DCBlength = sizeof(DCB);
GetCommState(hCom, &dcb);
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8;
dcb.Parity   = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(hCom, &dcb);

char buf[] = "HELLO STM32";
DWORD written;
WriteFile(hCom, buf, strlen(buf), &written, NULL);

适合 STM32 CDC / CH340 / CP210x


四、方案三:自定义 USB(WinUSB / libusb)

使用 libusb(高级)

#include <libusb.h>

libusb_device_handle *dev;
libusb_init(NULL);
dev = libusb_open_device_with_vid_pid(NULL, 0x1234, 0x5678);

libusb_claim_interface(dev, 0);
libusb_control_transfer(
    dev,
    LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT,
    0x01, 0, 0,
    (unsigned char*)"ABC", 3,
    1000
);

需要 inf 驱动签名

参考代码 USB接口编程源代码(VC) www.youwenfan.com/contentcnt/181991.html

五、调试工具

工具 用途
USBlyzer USB 抓包
Bus Hound 数据监控
Zadig 安装 WinUSB 驱动
HID Terminal HID 调试

六、常见问题排查

问题 原因
找不到设备 VID/PID 错
打开失败 权限 / 占用
收不到数据 报告描述符错
只能发一次 STM32 OUT 端点未重启
数据错位 报告 ID 未对齐
posted @ 2026-04-21 16:56  yes_go  阅读(8)  评论(0)    收藏  举报