A. 如何在linux下利用Libusb与HID USB设备通信
由于公司的产品,导致我在Linux下写usb通信的代码出现了许多的问题,最后发现这些设备只能通过控制传输来操作设备,所以后面的问题就迎刃而解了。现在贴上当时在QT下写的代码,以防日后再碰到此类问题的时候翻查。
还有在QT下使用libusb库的时候一定要在(项目名.pro)文件加上:
[cpp] view plain
INCLUDEPATH += /usr/include/libusb-1.0
LIBS += -L"/usr/lib/x86_64-linux-gnu" -lusb-1.0
否则程序无法找到该库的路径。
[cpp] view plain
libusb_device **devs;
libusb_device_handle *dev_handle;
libusb_context *ctx=NULL;
struct libusb_device_descriptor desc;
int r;
ssize_t cnt;
r=libusb_init(&ctx);
if(r<0)
{
//printf("init error");
QMessageBox::about(this,"haha","initialerror");
return ;
}
libusb_set_debug(ctx,3);
//cnt=libusb_get_device_list(ctx,&devs);
dev_handle=libusb_open_device_with_vid_pid(ctx,VID,PID);
if(dev_handle==NULL)
QMessageBox::about(this,"haha","open my dev error");
else
QMessageBox::about(this,"haha","open my dev success");
//libusb_free_device_list(devs,1);
if(libusb_kernel_driver_active(dev_handle,0)==1)
{
QMessageBox::about(this,"haha","kernel driver active");
if(libusb_detach_kernel_driver(dev_handle,0)==0)
QMessageBox::about(this,"haha","kernel driver detached");
}
r=libusb_claim_interface(dev_handle,0);
if(r<0)
{
QMessageBox::about(this,"haha","cannot claim interface");
return ;
}
QMessageBox::about(this,"haha","claimed interface");
// start use this usb
unsigned char dataOut[0x30]={0};
dataOut[0]=0x00;
dataOut[1]=0x02;
dataOut[2]=0x08;
dataOut[3]=0x00;
dataOut[4]=0x02;
dataOut[5]=0x00;
dataOut[6]=0xb2;
dataOut[7]=0x30;
dataOut[8]=dataOut[2]^dataOut[3]^dataOut[4]^dataOut[5]^dataOut[6]^dataOut[7];
//r=libusb_interrupt_transfer(dev_handle,LIBUSB_ENDPOINT_OUT, dataOut,9, &actual_length, 0);
//r=libusb_bulk_transfer(dev_handle,LIBUSB_ENDPOINT_OUT,dataOut,9,&actual_length,5000);
//此设备必须用控制传输
r=libusb_control_transfer(dev_handle, 0x21, 0x09, 0x0300, 0x00, dataOut+1, 0x20, 1000);
unsigned char dataRead[0x30]={0};
r=libusb_control_transfer(dev_handle, 0xa1, 0x01, 0x0300, 0x00, dataRead, 0x20, 1000);
if(r<0)
{
QMessageBox::about(this,"haha","transfer data error");
}else
{
QMessageBox::about(this,"haha","transfer data success");
}
//release everything
r=libusb_release_interface(dev_handle,0);
libusb_attach_kernel_driver(dev_handle,0);
libusb_close(dev_handle);
libusb_exit(ctx);
B. 如何用qt在linux中编写并使用动态链接库
先写好实现动态链接库的libmy.cpp文件和libmy.h文件,如下:
// libmy.cpp
#include"libmy.h"
#include<iostream>
using namespace std;
MyLib::MyLib()
{
}
MyLib::~MyLib()
{
}
void MyLib::hello()
{
cout << "hello world~!" << endl;
}
// libmy.h文件
#ifndef LIBMY_H
#define LIBMY_H
class MyLib
{
public:
MyLib();
~MyLib();
void hello();
};
#endif /*LIBMY_H*/
然后写好pro文件,如下:
TEMPLATE = lib
TARGET =DllTest
HEADERS += libmy.h
SOURCES += libmy.cpp
保存关闭,文件名命名为MyDll.pro
在Shell里执行qmake MyDll.pro,在没有错误的情况下,然后执行make ,可以看到生成了几个后缀名为so的文件,如下图:
C. mac版visual+studio怎么用
摘要 c_cpp_properties.json
D. Qt Linux 下 <QWidget> <QSystemTrayIcon> <QLabel> 等头文件包含时 No such file or directory
5.0.1我倒没装,我用的是4.8
不过,很明显这个路径配置出问题了,include path配置不对,或者你的文件权限不对,以至于你甚至没有权限去读取这些头文件,
第一个情况:
你是用Qt Creater工具写代码的吗?
可以试一下这样:
在打开的项目中,编辑 标签下,左侧栏右键对应的工程,添加新文件,选择C++,C++头文件,
将Qt的include目录及其所有子目录添加一遍
确实比较麻烦,不过你还可以修改项目的pro文件,前提是你要知道这个文件是干嘛用的,每个项表示什么意思,然后再linux下,用ls -l对include 所有子目录列出重定向到一个临时文件,然后对这个文件编辑一下,在复制过去,各种办法吧,看你怎么用了
第二个情况:
权限不够,这就得用include目录的所有者,对include目录及其所有子目录的所有文件chmod a+r -R include
这些东西一般安装之后基本的变量都应该配置好的,至于为什么,估计安装不对吧
除了includepath,其他一些变量也要相应改,确实难搞
搞不定的话,建议你重新装个4.x的吧
E. linux下QT4自带的sqlite驱动不可用该怎么解决
我告诉你个方法,绝对管用,你这种情况是没有安装mysql的驱动,提示只有sqlite的驱动。在命令行下安装libqt4-sql-mysql(sudoapt-getinstalllibqt4-sql-mysql),然后将/usr/lib/qt4/plugins/sqldrivers/libqsqlmysql.so拷贝到你的QtSDKsqldrivers目录下,我的是在/QtSDK/Desktop/Qt/481/gcc/plugins/sqldrivers,里面同时还有qsqlite.so,所以刚才会说只能找到qsqlite
F. 跪求大神指导:linux下使用gsoap生成C++代码访问WebService编译出错
找人来帮助你解决问题,这将是帮助吧!