Qt在工業上的使用場景包括工業自動化、嵌入式系統、汽車行業、航空航天、醫療設備、制造業和物聯網應用。Qt被用來開發工業設備的用戶界面、控制系統、嵌入式應用和其他工業應用,因其跨平臺性和豐富的功能而備受青睞。
Qt能夠為工業領域帶來什么好處:
- - Qt提供了強大的圖形引擎,使開發人員能夠創建具有吸引力和高性能的用戶界面。
- - Qt允許開發人員根據具體需求定制用戶界面和功能。這對于滿足不同行業和項目的獨特需求至關重要,使工業應用能夠實現個性化的解決方案
- - Qt提供了豐富的庫和工具,涵蓋了各種應用程序開發需求,包括圖形、網絡通信、多媒體處理、數據存儲等。這簡化了工業應用程序的開發流程
- - Qt可以輕松與各種硬件設備和通信協議集成,這對于工業自動化和控制系統來說非常重要,因為它們需要與各種傳感器、執行器和其他工業設備進行通信
本次開發教程的測試板卡來自創龍科技的TLT113-EVM國產工業評估板,基于全志科技T113-i雙核ARM Cortex-A7 + 玄鐵C906 RISC-V + HiFi4 DSP異構多核處理器設計,ARM Cortex-A7處理器單元主頻高達1.2GHz。
評估板由核心板和評估底板組成,核心板CPU、ROM、RAM、電源、晶振等所有元器件均采用國產工業級方案,國產化率100%。同時,評估底板大部分元器件亦采用國產工業級方案。核心板經過專業的PCB Layout和高低溫測試驗證,穩定可靠,可滿足各種工業應用環境。
T113-i國產工業評估板硬件資源圖解
此外,T113-i國產工業開發板的接口資源豐富,能夠支持引出雙路網口、雙路CAN、雙路USB、雙路RS485、RS232等通信接口,同時引出LVDS LCD、TFT LCD、MIPI LCD、HDMI OUT、CVBS IN/OUT、LINE IN、MIC IN、H/P OUT等音視頻多媒體接口,板載WIFI、4G(選配)模塊,支持1080P@60fps JPEG/MJPEG視頻硬件編碼,支持4K@30fps H.265、4K@24fps H.264視頻硬件解碼,方便用戶快速進行產品方案評估與技術預研。
創龍科技的這款T113-i國產工業開發板它提供了Qt的運行環境,可以讓我們快速的部署工業領域的用戶交互界面,控制系統。
接下來我們來聊聊如何在創龍科技T113-i工業開發板上部署Qt應用。
開發板Qt運行環境
開發板SDK準備
- 創龍科技的資料中提供了開發板的SDK-T113-i_v1.0.tar.gz,需要解壓ubuntu中解壓出來:
rice@rice:~$mkdirt113//創建t113工作目錄,然后將壓縮包拷貝到此目錄
rice@rice:~$cdt113
....
rice@rice:~/t113$tar-zxvfSDK-T113-i_v1.0.tar.gz
rice@rice:~/t113$cdT113-i_v1.0/
rice@rice:~/t113/T113-i_v1.0$ls
brandybuildrootdeviceinstall_tools.shoutrtos-dsptools
buildbuild.shkernelplatformtest
- 安裝依賴軟件,創龍科技提供了安裝腳本:install_tools.sh,我們執行該腳本即可完成依賴工具的安裝:
rice@rice:~/t113/T113-i_v1.0$./install_tools.sh
[sudo]passwordforrice:
Readingpackagelists...Done
Buildingdependencytree
Readingstateinformation...Done
texinfoisalreadythenewestversion(6.5.0.dfsg.1-2).
0upgraded,0newlyinstalled,0toremoveand121notupgraded.
Readingpackagelists...Done
Buildingdependencytree
Readingstateinformation...Done
pkg-configisalreadythenewestversion(0.29.1-0ubuntu2).
0upgraded,0newlyinstalled,0toremoveand121notupgraded.
Readingpackagelists...Done
......
- 解壓Buildroot dl--dl.tar.gz,其為 Buildroot dl 目錄壓縮包,用于存放從官網下載的開源軟件包:
rice@rice:~/t113$tar-xvfdl.tar.gz-C~/t113/buildroot/buildroot-201902/
構建Qt固件
- 在編譯固件前,先清理一下SDK的編譯和配置生成文件:
rice@rice:~/t113/T113-i_v1.0$./build.shdistclean
rice@rice:~/t113/T113-i_v1.0$./build.shconfig
Welcometomkscriptsetupprogress
Allavailableplatform:
0.linux
Choice[linux]:0
Allavailablelinux_dev:
0.bsp
1.dragonboard
2.longan
3.tinyos
Choice[longan]:2
Allavailablekern_ver:
0.linux-5.4
Choice[linux-5.4]:0
Allavailableic:
0.t113
1.t113_i
Choice[t113_i]:1
Allavailableboard:
0.evb1
1.evb1_auto
2.evb1_auto_nand
3.evb1_auto_nor
4.tlt113-evm-emmc
5.tlt113-evm-nand
6.tlt113-minievm-emmc
7.tlt113-minievm-nand
Choice[tlt113-evm-nand]:5
Allavailableoutput_configs:
0.hdmi
1.lvds-lcd
2.mipi-lcd
3.tft-lcd
4.cvbs
Choice[hdmi]:0
Allavailableflash:
0.default
1.nor
Choice[default]:0
Allavailablebuild_root:
0.buildroot-201902
1.ubuntu
Choice[buildroot-201902]:0
Allavailablegnueabi:
0.gnueabi
1.gnueabihf
Choice[gnueabi]:0
- 設置編譯的環境變量:
rice@rice:~/t113/T113-i_v1.0$source./build/envsetup.sh
- 我們采用一鍵編譯 SPL、U-Boot、Linux 內核和 buildroot文件系統。
rice@rice:~/t113/T113-i_v1.0$./build.sh
ACTIONList:mklichee;========
Executecommand:mklichee
INFO:----------------------------------------
INFO:buildlichee...
INFO:chip:sun8iw20p1
INFO:platform:linux
INFO:kernel:linux-5.4
INFO:board:tlt113-evm-nand
INFO:output:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan
INFO:----------------------------------------
INFO:buildbuildroot...
Preparebrtoolchaingcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi.tar.xz...
make:Enteringdirectory'/home/rice/t113/T113-i_v1.0/buildroot/buildroot-201902'
...
- 編譯Qt庫,使其開發板固件支持Qt應用運行環境:
rice@rice:~/t113/T113-i_v1.0$./build.shqt
ACTIONList:mkqt;========
Executecommand:mkqt
INFO:buildQt...
INFO:buildarm-linux-gnueabiversion'sQt
/home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5
Usingbuilt-inspecs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target:x86_64-linux-gnu
Configuredwith:../src/configure-v--with-pkgversion='Ubuntu7.5.0-3ubuntu1~18.04'--with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++--prefix=/usr--with-gcc-major-version-only--program-suffix=-7--program-prefix=x86_64-linux-gnu---enable-shared--enable-linker-build-id--libexecdir=/usr/lib--without-included-gettext--enable-threads=posix--libdir=/usr/lib--enable-nls--enable-bootstrap--enable-clocale=gnu--enable-libstdcxx-debug--enable-libstdcxx-time=yes--with-default-libstdcxx-abi=new--enable-gnu-unique-object--disable-vtable-verify--enable-libmpx--enable-plugin--enable-default-pie--with-system-zlib--with-target-system-zlib--enable-objc-gc=auto--enable-multiarch--disable-werror--with-arch-32=i686--with-abi=m64--with-multilib-list=m32,m64,mx32--enable-multilib--with-tune=generic--enable-offload-targets=nvptx-none--without-cuda-driver--enable-checking=release--build=x86_64-linux-gnu--host=x86_64-linux-gnu--target=x86_64-linux-gnu
Threadmodel:posix
.....
- 打包系統鏡像文件,執行之后,可以看到生成的固件文件,它默認生成兩個版本的固件,分別是:nand固件和SD卡固件,我們是采用SD卡啟動,所以使用SD卡固件。
rice@rice:~/t113/T113-i_v1.0$./build.shpack
ACTIONList:mkpack;========
Executecommand:mkpack
INFO:packingfirmware...
INFO:UseBIN_PATH:/home/rice/t113/T113-i_v1.0/device/config/chips/t113_i/bin
copyingtoolsfile
copyingconfigsfile
copyingproductconfigsfile
/home/rice/t113/T113-i_v1.0/out/pack_out/aultls32.fex
/home/rice/t113/T113-i_v1.0/out/pack_out/aultools.fex
/home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.cfg
/home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.fex
......
dsp0.fexLen:0x3fc78
Vdsp0.fexLen:0x4
BuildImg0
Dragonexecuteimage.cfgSUCCESS!
----------imageisat----------
size:613M/home/rice/t113/T113-i_v1.0/out/t113_i_linux_tlt113-evm-nand-sdboot_uart0.img
packfinish
運行環境驗證
下載運行實例
- 將編譯打包后的固件(t113_i_linux_tlt113-evm-nand-sdboot_uart0.img)放到windows上,通過工具PhoenixCard.exe燒錄到SD卡上。將SD卡插到讀卡器上,然后插進電腦:
- 創龍科技提供了qt的demo,我們將led_control的實例拷貝到板子上:
rice@rice:~/t113/qt-demos/led_control/bin$scpled_controlroot@ip:~/
創龍T113-i上運行實例
- 關閉默認的Qt運行程序,設置qt的環境變量
root@T113-Tronlong:~#killallLauncher
root@T113-Tronlong:~#source/etc/qtenv.sh
add/dev/input/event1toQtApplication.
findqt5installeddone
- 運行實例驗證Qt功能,運行效果如圖:
root@T113-Tronlong:~#./led_control
Qt開發環境
開發環境下載
- Qt開發環境下載,作者是使用Qt 5.12.0,下載鏈接:https://download.qt.io/archive/qt/5.12/5.12.0/,Ubuntu需要下載:qt-opensource-linux-x64-5.12.0.run
開發環境交叉編譯環境配置
-
配置Debuggers
- 點擊菜單欄"Tools -> Options"
- 擊"Kits -> Debuggers -> Add -> Browse…"
- 選擇目標平臺的GDB,路徑:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-gdb
-
配置交叉工具鏈
- 點擊菜單欄"Tools -> Options"
- 擊"Kits -> Compilers -> Add -> GCC -> C++ -> Browse…"
- 選擇目標平臺的交叉工具鏈,路徑:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-g++
-
配置Qt Versions
- 點擊菜單欄"Tools -> Options"
- 擊"Kits -> Qt Versions -> Add -> GCC -> C++ -> Browse…"
- 選擇目標平臺的Qt Versions,路徑:/home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5/Qt_5.12.5/bin/qmake
-
配置Kits
- 點擊菜單欄"Tools -> Options"
- 擊"Kits -> Kits"
- 將 Name 修改為"T113",Device type 選擇"Generic Linux Device",Compiler 的 C++選擇"T113-GCC",Debugger 選擇"T113-Debugger",Qt version 選擇"T113-qt5",點擊 Apply,然后點擊 OK 完成配置
開發Qt應用
- 作者開發了一個快速驗證硬件功能的,主要功能包含:
- 板載LED燈控制,代碼實現:
staticQStringledPath="/sys/class/leds/user-led0";
voidrice::ledInit()
{
setLedStatus(0);
ui->ledPushButton->setText("LEDOFF");
ui->ledPushButton->setStyleSheet("border-width:1px;"
"border-style:solid;"
"border-color:white;"
"background-color:rgba(88,88,88,200)");
}
voidrice::ledDeinit()
{
}
boolrice::setLedStatus(intstatus)
{
QStringcmd="echo"+QString::number(status)+">"+ledPath+"/brightness";
if(system(cmd.toStdString().c_str())==-1){
printf("setledstatusfailed!n");
returnfalse;
}
returntrue;
}
intrice::getLedStatus(void)
{
QStringcmd="cat"+ledPath+"/brightness";
FILE*fp=popen(cmd.toStdString().c_str(),"r");
if(fp==nullptr){
return-1;
}
charled_status[32];
if(fgets(led_status,sizeof(led_status),fp)==nullptr){
printf("fgetserror:%sn",cmd.toStdString().c_str());
pclose(fp);
return-1;
}
pclose(fp);
returnatoi(led_status);
}
voidrice::on_ledPushButton_clicked()
{
intledStatus=getLedStatus();
if(ledStatus==0){
setLedStatus(1);
ui->ledPushButton->setText("LEDON");
ui->ledPushButton->setStyleSheet("border-width:1px;"
"border-style:solid;"
"border-color:white;"
"background-color:rgba(00,205,00,255)");
}
else{
setLedStatus(0);
ui->ledPushButton->setText("LEDOFF");
ui->ledPushButton->setStyleSheet("border-width:1px;"
"border-style:solid;"
"border-color:white;"
"background-color:rgba(88,88,88,200)");
}
}
- 板載按鍵檢測,代碼實現:
voidrice::keyInit()
{
keyFd=open(keyPath.toUtf8().data(),O_RDONLY);
if(keyFd==-1)
{
printf("Cannotopenfile(%s)",keyPath.toUtf8().data());
return;
}
ui->keyTextEdit->append("KeyMonitor!n");
ui->keyTextEdit->append("Keyuser0pressed!");
keyNotify=newQSocketNotifier(this->keyFd,QSocketNotifier::Read,this);
connect(this->keyNotify,SIGNAL(activated(int)),this,SLOT(keyHandler()));
}
voidrice::keyDeinit()
{
}
voidrice::keyHandler()
{
structinput_eventbuf;
if(read(keyFd,&buf,sizeof(structinput_event))>0)
{
if(buf.code==KEY_PROG1&&buf.value==1)
{
ui->keyTextEdit->append("Keyuser0pressed!");
}
}
}
- RTC時鐘獲取并顯示,代碼實現:
voidrice::dateInit()
{
structrtc_timertc_tm_temp;
dateFd=open(datePath.toUtf8().data(),O_RDONLY);
if(dateFd==-1)
{
printf("Cannotopenfile(%s)",keyPath.toUtf8().data());
return;
}
if(ioctl(dateFd,RTC_RD_TIME,&rtc_tm_temp)0)
{
printf("Getdatefailed");
return;
}
ui->yearLineEdit->setText(QString::number(rtc_tm_temp.tm_year+1900));
ui->monthLineEdit->setText(QString::number(rtc_tm_temp.tm_mon+1));
ui->dayLineEdit->setText(QString::number(rtc_tm_temp.tm_mday));
}
voidrice::dateDeint()
{
}
- 網絡調試助手,代碼實現:
voidrice::netInit()
{
server=newQTcpServer();
socket=newQTcpSocket();
}
voidrice::netDeint()
{
}
voidrice::netNewClientConnect()
{
socket=server->nextPendingConnection();
connect(socket,&QTcpSocket::readyRead,this,&rice::netNewRcve);
}
voidrice::on_netPushButton_clicked()
{
intport=ui->portLineEdit->text().toInt();
if(ui->netPushButton->text()==tr("Open"))
{
if(ui->typeComboBox->currentText()==tr("Server"))
{
connect(server,&QTcpServer::newConnection,this,&rice::netNewClientConnect);
if(!server->listen(QHostAddress::Any,port))
{
printf("Listenfailedn");
return;
}
}
elseif(ui->typeComboBox->currentText()==tr("Client"))
{
QStringip=ui->ipComboBox->currentText();
socket->abort();
socket->connectToHost(ip,port);
if(!socket->waitForConnected(3000))
{
printf("Connectserverfailed");
return;
}
connect(socket,&QTcpSocket::readyRead,this,&rice::netNewRcve);
}
ui->netPushButton->setText("Close");
}
elseif(ui->netPushButton->text()==tr("Close"))
{
if(ui->typeComboBox->currentText()==tr("Server"))
{
socket->abort();
server->close();
}
elseif(ui->typeComboBox->currentText()==tr("Client"))
{
socket->disconnectFromHost();
}
ui->netPushButton->setText("Open");
}
}
voidrice::on_sendPushButton_clicked()
{
if(socket->isOpen())
{
socket->write(ui->sendLineEdit->text().toUtf8().data());
}
}
voidrice::netNewRcve()
{
ui->recvTextEdit->append(socket->readAll());
}
voidrice::on_typeComboBox_currentIndexChanged(constQString&arg1)
{
if(arg1==tr("Server"))
{
ui->ipComboBox->setEditable(false);
}
else
{
ui->ipComboBox->setEditable(true);
}
}
Qt應用驗證
- 板載LED燈控制驗證,當點擊開關LED按鈕時,LED燈會根據狀態亮滅:
- 當應用運行起來時,會獲取RTC時間,并顯示:
- 當板載按鍵按下時,窗口會顯示按鍵按下:
- 網絡調試助手支持TCP客戶端和TCP服務器兩種類型,下面演示服務器驗證。開發板上設置板子的IP,和端口號,然后通過PC上網絡調試助手連接上板子,并克實現數據的收發:
- 客戶端往服務器發送數據
- 服務器往客戶端發送數據
關于創龍科技
創龍科技(Tronlong)始創于2013年,是國內領先的嵌入式產品平臺提供商,業務主要涵蓋工業核心板、工業評估板、工業單板機、項目服務,總部位于廣州科學城,下設獨立運營的教儀事業部,在北京、天津、上海、南京、深圳、西安、成都等地設有業務及技術服務中心。
創龍科技10多年來一直專注于ARM、FPGA、DSP異構多核技術開發,堅持“國產 + 進口”雙引擎產品戰略,是全志、瑞芯微金牌合作伙伴,以及TI、NXP、Xilinx、紫光同創中國官方合作伙伴,為實時系統、現場總線、物聯網、人工智能等技術提供應用平臺,產品廣泛應用于工業自動化、能源電力、儀器儀表、醫療、通信、安防等行業。
? ?-
開發板
+關注
關注
25文章
4758瀏覽量
96126 -
Qt
+關注
關注
1文章
300瀏覽量
37596 -
Cortex-A7
+關注
關注
0文章
34瀏覽量
16427 -
全志科技
+關注
關注
4文章
94瀏覽量
16010 -
創龍科技
+關注
關注
2文章
130瀏覽量
7644 -
全志T113
+關注
關注
0文章
44瀏覽量
177
發布評論請先 登錄
相關推薦
評論