当前位置: 首页 > article >正文

QT调用libusb库stm32407上下位机

安富莱USB上位机教程

参考安富莱的视频,不过这里 调用是libusb最新的库
可以参考上一个文章:
QT调用最新的libusb库
https://editor.csdn.net/md/?articleId=142733711

调试结果:
在这里插入图片描述
在这里插入图片描述

资源地址:
上位机:https://download.csdn.net/download/a15236617777/89856863

对比参照:
这个是安富莱的QT工程用的库,应该不是最新的。
https://download.csdn.net/download/a15236617777/89856864

部分代码:

int OpenUSB(void)
{
    int ret;
    // 初始化 libusb
    ret = libusb_init(&m_dev_ctx);
    if (ret < 0) {
        std::cerr << "Failed to initialize libusb" << std::endl;
        return ret;
    }
    // 打开 USB 设备,替换为你的设备 VID 和 PID
    m_dev_handle = libusb_open_device_with_vid_pid(m_dev_ctx, m_dev_VENDOR, m_dev_PRODUCT);
    if (!m_dev_handle) {
        std::cerr << "Cannot open device" << std::endl;
        libusb_exit(m_dev_ctx);
        return -1;
    }

    // 申请接口(假设接口 0)
    ret = libusb_claim_interface(m_dev_handle, 1);
    if (ret < 0) {
        std::cerr << "Cannot claim interface" << std::endl;
        libusb_close(m_dev_handle);
        libusb_exit(m_dev_ctx);
        return ret;
    }
    return ret=0;
}

int ReadUsbMsg(void)
{
    int ret;
    libusb_device *newdevice=libusb_get_device(m_dev_handle);
    libusb_device_descriptor desc;
    // 获取设备描述符
    if (libusb_get_device_descriptor(newdevice, &desc) != 0) {
        std::cerr << "Failed to get device descriptor" << std::endl;
        return -1;
    }else
    {
        // 获取厂家字符串
        if (libusb_get_string_descriptor_ascii(m_dev_handle, desc.iManufacturer, usb_msg_manufacturer, sizeof(usb_msg_manufacturer)) > 0) {
            std::cout << "Manufacturer: " << usb_msg_manufacturer << std::endl;
        }
        // 获取产品字符串
        if (libusb_get_string_descriptor_ascii(m_dev_handle, desc.iProduct, usb_msg_product, sizeof(usb_msg_product)) > 0) {
            std::cout << "Product: " << usb_msg_product << std::endl;
        }

        // 获取序列号字符串
        if (libusb_get_string_descriptor_ascii(m_dev_handle, desc.iSerialNumber, usb_msg_serial, sizeof(usb_msg_serial)) > 0) {
            std::cout << "Serial Number: " << usb_msg_serial << std::endl;
        }
    }
    return ret=1;

}
int WriteBulkData() {
    int transferred; // 实际传输字节数
    int ret;
    // 发送数据
    ret = libusb_bulk_transfer(m_dev_handle, 2, Send_CmdData, sizeof(Send_CmdData), &transferred, 1000);
    if (ret < 0)
    {
        std::cerr <<libusb_error_name(ret)<< std::endl;
        return ret;
    } else
    {
        std::cout<<"Sent CMD: 0X"<<std::setw(2) << std::setfill('0') << std::hex <<(int)Send_CmdData[0]<<"("<<transferred<<"bytes)\n"<<std::endl;
    }
    return 0;
}


void display_read_data(unsigned char *buffer, int transferred) {
    std::cout << "Read " << transferred << " bytes:" << std::endl;
    for (int i = 0; i < transferred; i++) {
        if (i % 50 == 0) { // 每16个字节换行
            if (i > 0) {
                std::cout << std::dec << std::endl; // 切换回十进制
            }
            std::cout << "Line " << (i / 50) << ": ";
        }
        std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)buffer[i] << " ";
    }
    std::cout << std::dec << std::endl; // 切换回十进制
}

int ReadBulkData() {
    //unsigned char buffer[2048]; // 缓冲区大小根据需求调整
    int transferred; // 实际传输字节数
    int ret;

    // 执行 bulk 读取 RecTraData
    ret = libusb_bulk_transfer(m_dev_handle, 0x82, Rece_DATA, sizeof(Rece_DATA), &transferred, 1000);
    //ret = libusb_bulk_transfer(m_dev_handle, 0x82, buffer, sizeof(buffer), &transferred, 1000);
    if(ret<0)
    {
        std::cerr << "Bulk read failed: " << libusb_error_name(ret) << std::endl;
        return ret;
    }
    else
    {
        display_read_data(Rece_DATA,transferred);
    }
    return transferred;
}


http://www.kler.cn/news/336944.html

相关文章:

  • 数据库中,如何查询表中的所有记录?
  • RabbitMQ篇(死信交换机)
  • CSS滚动条
  • Python 工具库每日推荐【PyPDF2】
  • macOS终端配置自动补全功能
  • Linux运维01:VMware创建虚拟机
  • Docker 实践与应用举例
  • 物联网学习——IIC协议、MPU6050芯片
  • 速盾:休闲类游戏如何选择高防cdn?
  • CART回归树中的 方差减少量 计算步骤和示例
  • 【Blender Python】3.使用For循环和列表批量创建立方体
  • RL_足球教练
  • 【电力系统】基于MATLAB的储能辅助电力系统调峰的容量需求研究
  • IDEA 配置 Git 详解
  • 传感器模块编程实践(三)舵机+超声波模块融合DIY智能垃圾桶模型
  • 面试中考察栈和队列的经典算法题
  • 【鸿蒙学习】深入解析鸿蒙应用与元服务:含义、区别、应用场景及创建方法
  • OpenAI董事会主席Bret Taylor的Agent公司Sierra:专注于赋能下一代企业用户体验
  • 公开数据集网站分享
  • VLAN 和 ARP 表