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
- 下载:https://github.com/libusb/hidapi
- 包含头文件:
hidapi.h - 链接库:
hidapi.lib
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 未对齐 |

浙公网安备 33010602011771号