USB上位机开发

article/2025/9/26 16:54:38

上位机开发采用图形化界面,使用C#语言进行开发。调用C++编写的Dll动态库,实现与STM32进行USB通信的目的。

首先,编写Dll动态库。
开发环境采用VS2017,语言C++
在这里插入图片描述

将lusb0_usb.h和libusb.lib文件拷贝到工程目录下。
在这里插入图片描述
libusb-win32-bin-1.2.6.0下载地址

拷贝后,在项目属性 -》VC++目录 -》库目录添加刚才拷贝后文件路径
在这里插入图片描述
项目属性 -》链接器 -》 输入 -》附加依赖项 添加libusb.lib,如图所示
在这里插入图片描述
Dll2.cpp引入添加的头文件lusb_usb.h
在这里插入图片描述

// Dll1.cpp : 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"
#include "Dll2.h"
#include "lusb0_usb.h"#include <iostream>
#define PID 0x6668
#define VID 0x8886using namespace std;usb_dev_handle * my_device;int __stdcall Find_MyDevice()
{usb_init();usb_find_busses();usb_find_devices();struct usb_bus * bus;for (bus = usb_busses; bus; bus->next){struct usb_device * device;for (device = bus->devices; device; device->next){if (device->descriptor.idProduct == PID&& device->descriptor.idVendor == VID){//cout << "find my device" << endl;my_device = usb_open(device);int ret = usb_claim_interface(my_device, 0);//cout << "usb_claim_interface:" << ret << endl;return 1;}else{return -1;}}}}int __stdcall USB_BulkWrite(int ep, char *bytes, int size, int timeout)
{int ret = 0;ret = usb_bulk_write(my_device, ep, bytes, size, timeout);return ret;
}int __stdcall USB_BulkRead(int ep, char *bytes, int size, int timeout)
{int ret = 0;ret = usb_bulk_read(my_device, ep, bytes, size, timeout);return ret;
}

在cpp文件中,实现了三个函数,Find_MyDevice, USB_BulkWrite,USB_BulkRead
在Dll2.h文件中:

#pragma once
#ifdef DLL2_EXPORTS
#define USB_DRIVES_API __declspec(dllexport)
#else
#define USB_DRIVES_API __declspec(dllimport)
#endifextern "C"  USB_DRIVES_API int  __stdcall Find_MyDevice();
extern "C"  USB_DRIVES_API int  __stdcall USB_BulkWrite(int ep, char *bytes, int size, int timeout);
extern "C"  USB_DRIVES_API int  __stdcall USB_BulkRead(int ep, char *bytes, int size, int timeout);

声明这三个函数是用于导出的__declspec(dllexport),extern "C"是说明是以C语言格式
宏定义DLL2_EXPORTS在VS中默认已经定义好
在这里插入图片描述
然后点击生成 -》生成解决方案。在Debug文件夹下生成了Dll文件。
在这里插入图片描述
在这里插入图片描述
然后新建一个工程,编写界面,语言C#
在这里插入图片描述
在这里插入图片描述
将Dll2.dll拷贝到此工程目录下
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsUSB
{public partial class Form1 : Form{bool param_set = false;UInt32 counter = 0;float[] data = new float[100];UInt32 x = 0;[DllImport("Dll2.dll", EntryPoint = "Find_MyDevice", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]public static extern int Find_MyDevice();[DllImport("Dll2.dll", EntryPoint = "USB_BulkWrite", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]public static extern int USB_BulkWrite(int ep, ref byte bytes, int size, int timeout);[DllImport("Dll2.dll", EntryPoint = "USB_BulkRead", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]public static extern int USB_BulkRead(int ep, ref byte bytes, int size, int timeout);

将之前创建的函数导入,然后就可以使用了。
Dll文件可以用ViewDll软件查看里面的函数
在这里插入图片描述


http://chatgpt.dhexx.cn/article/0UmBH109.shtml

相关文章

Matlab上位机开发

Matlab上位机开发 1 了解上位机1.1 上位机的作用1.2 常用上位机开发方式1.2.1 Windows上位机&#xff08;基于串口通信&#xff09;1.2.2 Android上位机&#xff08;基于网络通信&#xff09; 1.3 教程概况1.3.1 C#上位机开发教程1.3.2 IoT App开发1.3.3 Matlab上位机开发 2 He…

C# | 上位机开发新手指南(一)概述

C#上位机开发新手指南&#xff08;一&#xff09;概述 文章目录 C#上位机开发新手指南&#xff08;一&#xff09;概述前言学习C#编程基础熟悉上位机开发相关知识选择合适的开发环境熟练掌握C#编程技巧掌握常用控件的使用方法学习与硬件通讯的方法最后 前言 C#&#xff0c;是微…

上位机开发流程

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;虚心受教。 文章目录 前言一、上位机是什么&#xff1f;二、开发步骤1.了解需求2.分析需求3.设计软件模块4.测试软件5.交付及维护软件 总结&#xff1a; 前言 没有人可以真正理解另一个…

上位机开发(怎么开发上位机)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 要开发上位机,主要还是看具体的用途是什么。比如说,是不是负责烧入固件;是不是调制参数;是不是监控;是不是系统控制、是不是仿真等等。当然,不管是什么样的上位机开发,有一些…

VS上位机开发——串口助手

VS上位机开发——串口助手 目录 VS上位机开发——串口助手一、新建项目二、控件布局三、编写程序1、端口更新函数2、启动窗口加载函数3、"打开串口"按键回调函数4、"清除接收"按键回调函数5、"发送"按键回调函数6、串口接收函数7、定时器中断回调…

C++刷题笔记(4)——leetcode209、904

题目1&#xff1a;209.长度最小的子数组 暴力解法 解题思路&#xff1a; 用两个for循环&#xff0c;外层for循环负责做子序列的起点&#xff0c;内层for循环负责遍历数组&#xff0c;寻找符合条件的子序列 然后外层for循环移动子序列的起点&#xff0c;继续再数组中寻找新的符…

904. 水果成篮(c++)

滑动窗口&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int max_len 0;int left 0;unordered_map<int,int>mp;for(int right 0; right < fruits.size();right){mp[fruits[right]];while(mp.size() > 2){mp[fruits[lef…

904-线程池项目死锁问题分析

死锁问题 1、在ThreadPool的资源回收&#xff0c;等待线程池所有线程退出时&#xff0c;发生死锁问题&#xff0c;导致进程无法退出 我们的资源回收代码如下&#xff1a; //线程池析构 ThreadPool::~ThreadPool() {isPoolRunning_ false;notEmpty_.notify_all();//等待线程…

ORACLE 错误 904

错误原因&#xff1a; Oracle 版本中IMP和EXP的兼容问题。 我这里是因为本机上的oracle版本高于服务器上的oracle版本 解决办法&#xff1a; 安装和服务器同版本的10g客户端&#xff0c;在命令窗口化中切换到10g客户端的bin目录下面进行导入就ok了。 为什么要切换呢&#xf…

leetcode:904. 水果成篮

题目来源 leetcode&#xff1a;904. 水果成篮 题目描述 题目解析 题意 题意从任意位置开始&#xff0c;若最多只能收集两种水果&#xff0c;问最多能收集多少个水果。 这道题目可以理解为求只包含两种元素的最长连续子序列&#xff0c;和leetcode&#xff1a;159.最多有两个…

2022-7-8 Leetcode 904.水果成篮

错误的代码&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int start 0;int end 0;set<int> myset;int len 0;for (; end < fruits.size(); end){myset.insert(fruits[end]);if (myset.size() > 2 && start &l…

【LeetCode】图解 904. 水果成篮

904. 水果成篮 904. 水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xf…

LeetCode_904 水果成篮

1、题目&#xff1a;水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c…

力扣第904题

一、题目&#xff1a;904. 水果成篮 二、题目解析&#xff1a; 题目解析&#xff1a;题目不太好理解&#xff0c;通俗解释一下&#xff0c;可以把数组中的每个元素理解成一个树&#xff0c;元素值理解成那种类型的果树&#xff0c;比如:[3,3,3,1,2,1,1,2,3,3,4] 我们可以认为1…

LeetCode 904. 水果成篮

904. 水果成篮 题目&#xff1a;你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xf…

力扣(LeetCode)904. 水果成篮(C语言)

一、环境说明 本文是 LeetCode 904题 : 水果成篮&#xff0c;使用c语言实现滑动窗口哈希集合。测试环境:Visual Studio 2019 二、代码展示 //滑动窗口哈希表&#xff0c;一次遍历O(n) //难点&#xff1a;如何用判断边界的移动时机,应该可以自己实现。 //right和left不一定相…

(解决方案) Visual Studio 2019 连接 SQL Server 2019 数据库时,数据库版本为904无法打开,此服务器支持852版及更低版本的问题

我在做课设程序时连不上数据库&#xff0c;提示数据库版本太高。即使在数据库设置里把兼容性改到2016(852版)仍然无法连接&#xff0c;网上找的解决方法也不成功&#xff0c;自己摸索了一番找到了解决方法。具体是直接连接数据库的服务器&#xff0c;而不是连接数据库本身&…

【Linux】make的工作原理和makefile文件

● makefile文件 make是一个命令&#xff0c;makefile是一个文件。make命令执行时&#xff0c;需要一个 Makefile 文件&#xff0c;以告诉make命令需要怎么样的去编译和链接程序。一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;ma…

简单的makefile文件编写

习惯了windows下ide创建工程已经代码的编写&#xff0c;然后一键运行&#xff0c;很简单&#xff0c;因为很多事ide都帮我们做了&#xff0c;但是linux下不一样&#xff0c;需要手动编译&#xff0c;执行一条条的命令&#xff0c;一般工程都是由于很多文件组成的&#xff0c;比…

如何编写一个简单的Makefile文件

在c语言学习的初级阶段&#xff0c;我们所写的代码量较少&#xff0c;分装的文件也很少&#xff0c;直接使用gcc编译便能满足我们的大部分需求&#xff0c;然而随着我们学习的深入&#xff0c;代码量越来越多&#xff0c;已经开始做一些工程项目了&#xff0c;项目中包含多个c文…