QT 上下调用 libusb 库 stm32407
最编程
2024-10-08 11:48:28
...
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;
}
推荐阅读
-
QT 上下调用 libusb 库 stm32407
-
.NET高级面试指南 Topic XVIII [ 介绍外观模式(Appearance Pattern),该模式提供了一个隐藏系统复杂性的简化界面 ]。- 简化复杂系统:当系统具有复杂的子系统结构时,可以使用外观模式来简化界面。提供统一界面:当客户端需要访问多个子系统时,可以使用外观模式提供统一界面。 外观模式在现代软件开发中得到广泛应用,尤其是在复杂系统中。例如 图形用户界面库:许多图形用户界面库(如 Qt、GTK+ 等)都使用外观模式来隐藏底层的复杂性,并为开发人员提供简单的界面来创建用户界面。 操作系统接口:操作系统中的系统调用和应用程序接口通常也使用外观模式来隐藏底层硬件和系统的复杂性,为应用程序提供访问系统资源的简单接口。企业应用程序:在可能涉及多个子系统的大型企业应用程序中,外观模式可用于封装这些子系统,并为客户端提供统一的使用界面。 网络框架:许多网络框架(如 ASP.NET MVC、Spring MVC 等)也使用外观模式来隐藏底层的复杂性,并为开发人员提供简单的接口来处理 HTTP 请求和响应。 集成开发环境(IDE):集成开发环境通常包含代码编辑器、编译器、调试器等多种功能。外观模式可用于封装这些功能,并为开发人员提供开发软件的简单界面。 代码示例:
-
在Linux系统中使用Qt调用动态库的三种方法
-
Qt创建动态库给C#调用,通过回调完成交互