stm32制作CAN适配器5--WinUsb上位机编写

server/2024/12/24 3:59:40/
  • 上次我们要stm32制作了一个基于winusb有canfd适配器,今天我们来制作一个上位机程序来进行报文收发。
    上位机还是用以前写好的,只是更改下dll文件。

项目链接器,输入,附加依赖项中增加winusb.lib
在这里插入图片描述

winusb初始化:
#include "zlgcan.h"#ifdef WIN32
#include <windows.h>
#endif#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <fstream>
#include <winusb.h>
#include <setupapi.h>
#include <devguid.h>#pragma connent(lib,"winusb.lib")
#pragma connent(lib,"setupapi.lib")GUID guid = { 0x13eb360b, 0xbc1e, 0x46cb, { 0xac ,0x8b,0xef,0x3d,0xa4,0x7b,0x40,0x62 } };
HDEVINFO deviceInfoSet;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA  deviceInterfaceDetailData = NULL;
HANDLE deviceHandle = INVALID_HANDLE_VALUE;
WINUSB_INTERFACE_HANDLE winusbHandle = NULL;DEVICE_HANDLE FUNC_CALL  ZCAN_OpenDevice(UINT device_type, UINT device_index, UINT reserved)
{// 初始化设备信息集deviceInfoSet = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);if (deviceInfoSet == INVALID_HANDLE_VALUE){		//file << "SetupDiGetClassDevs failed" << std::endl;	return 0;}// 枚举设备接口deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);if (!SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &guid, 0, &deviceInterfaceData)){//file << "SetupDiEnumDeviceInterfaces failed" << std::endl;SetupDiDestroyDeviceInfoList(deviceInfoSet);return 0;}// 获取设备路径DWORD requiredLength = 0;SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &requiredLength, NULL);deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredLength);deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, deviceInterfaceDetailData, requiredLength, NULL, NULL)){//file << "SetupDiGetDeviceInterfaceDetail failed" << std::endl;		free(deviceInterfaceDetailData);SetupDiDestroyDeviceInfoList(deviceInfoSet);return 0;}// 打开设备句柄deviceHandle = CreateFile(deviceInterfaceDetailData->DevicePath,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);if (deviceHandle == INVALID_HANDLE_VALUE){//file << "CreateFile failed" << std::endl;free(deviceInterfaceDetailData);SetupDiDestroyDeviceInfoList(deviceInfoSet);return 0;}// 初始化WinUSBif (!WinUsb_Initialize(deviceHandle, &winusbHandle)){//file << "WinUsb_Initialize failed" << std::endl;CloseHandle(deviceHandle);free(deviceInterfaceDetailData);SetupDiDestroyDeviceInfoList(deviceInfoSet);return 0;}return (void*)winusbHandle;
}

WinUsb读写

int winusb_write(WINUSB_INTERFACE_HANDLE winusbHandle,const BYTE* buffer,DWORD size)
{BOOL result = FALSE;ULONG byteswritten = 0;result = WinUsb_WritePipe(winusbHandle, EP0ADDR, (PUCHAR)buffer, size, &byteswritten, NULL);return byteswritten;
}int winusb_read(WINUSB_INTERFACE_HANDLE winusbHandle, BYTE* buffer, DWORD size)
{BOOL result = FALSE;DWORD bytesRead = 0;result = WinUsb_ReadPipe(winusbHandle, EP1ADDR, buffer, size, &bytesRead, NULL);return bytesRead;
}

http://www.ppmy.cn/server/152659.html

相关文章

【CSS in Depth 2 精译_085】14.2:CSS 蒙版的用法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 14 章 蒙版、形状与剪切】 ✔️ 14.1 滤镜 14.1.1 滤镜的类型14.1.2 背景滤镜 14.2 蒙版 ✔️ 14.2.1 带渐变效果的蒙版特效 ✔️14.2.2 基于亮度来定义蒙版 ✔️14…

【NVIDIA】启动ubuntu后显卡驱动丢失

前言 启动后分辨率变成800*600&#xff0c;而且不能改&#xff0c;nvidia-smi 显示 这种情况可以先不用着急重装&#xff1b; 执行 ls /usr/src | grep nvidia显示英伟达驱动版本 nvidia-565.57.01再 sudo dkms install -m nvidia -v 565.57.01就好了&#xff5e;&#xf…

cocos creator制作2dTop-down游戏(虚拟摇杆、地图加载)

《不被遗忘的时光》第一期 1、游戏的形式&#xff1a;横板&#xff1b;2d的顶视角&#xff08;Top-down&#xff09;&#xff1b;射击&#xff1b;ARPG&#xff1b;益智解谜。 2、画风&#xff1a;类似手游《伊洛纳》。 3、故事背景&#xff1a;以中元节的爷孙阴阳交流作为故…

鸿蒙NEXT游戏|Cocos参展2024华为开发者年度盛典

代码改变世界 2024华为开发者年度盛典在松山湖基地进行&#xff0c;来自各行各业的华为生态开发者相聚在一起&#xff0c;交流总结、探讨新的机遇。 开发者&#xff0c;用代码改变世界的人&#xff01; 这句 SLOGAN&#xff0c;引起了在场程序员的深度共鸣&#xff0c;持续热烈…

深度学习从入门到精通——图像分割实战DeeplabV3

DeeplabV3算法 参数配置关于数据集的配置训练集参数 数据预处理模块DataSet构建模块测试一下数据集去正则化模型加载模块DeepLABV3 参数配置 关于数据集的配置 parser argparse.ArgumentParser()# Datset Optionsparser.add_argument("--data_root", typestr, defa…

252-8路SATAII 6U VPX高速存储模块

8路SATAII 6U VPX高速存储模块主要包括存储模块母卡和SATA SSD&#xff0c;母卡上包括8个SATAII接插件&#xff0c;可并联挂载8块SATAII SSD组成存储阵列。单个SATAII SSD可配置容量为128GB-512GB&#xff08;SLC存储介质&#xff09;或256GB-1TB&#xff08;MLC存储介质&#…

RK3568平台(Kbuild篇)vmlinux 编译过程

一.vmlinux是什么 vmlinux 是 Linux 操作系统的内核映像文件,它包含了 Linux 内核的所有功能代码和必要的数据结构。这个文件通常是没有经过压缩和符号表去除的原始可执行文件。 具体来说,vmlinux 文件是编译后的 Linux 内核的最终产物,通常是 ELF(可执行和可链接格式)格…

【多模态】swift-3框架使用

swift-3框架使用 前言swift3安装swift训练swift cli推理swift vllm python推理 前言 接前面&#xff0c;swift3相比于swift2做了大升级&#xff0c;很多swift2能使用的在3里面error改改改…但是效率确实大升级&#xff0c;推理速度快了很多&#xff5e;&#xff5e;&#xff5e…