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編譯出錯
找人來幫助你解決問題,這將是幫助吧!