新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM 和Qt/E的車(chē)載HMI終端的設(shè)計(jì)方案

基于ARM 和Qt/E的車(chē)載HMI終端的設(shè)計(jì)方案

作者: 時(shí)間:2012-04-27 來(lái)源:網(wǎng)絡(luò) 收藏

3.2觸控平臺(tái)的

觸控平臺(tái)以為處理器,接7.0寸LCD觸摸屏來(lái)實(shí)現(xiàn),可取代傳統(tǒng)的(如圖2A)機(jī)械按鍵與表盤(pán)顯示的中控平臺(tái)。觸控平臺(tái)如圖2B所示,由車(chē)燈、車(chē)窗、后視鏡、多媒體、空調(diào)、導(dǎo)航以及狀態(tài)參數(shù)顯示菜單組成。將該嵌入到方向盤(pán),駕駛員可點(diǎn)擊觸控菜單進(jìn)入車(chē)燈、車(chē)窗等控制界面(如圖2C和D)實(shí)現(xiàn)車(chē)燈、車(chē)窗等設(shè)備的觸摸控制,也可實(shí)時(shí)采集與顯示設(shè)備狀態(tài)參數(shù)如:車(chē)速、故障碼等。其中,觸控與顯示數(shù)據(jù)需調(diào)用底層串口驅(qū)動(dòng)來(lái)實(shí)現(xiàn)讀寫(xiě)操作,觸控界面通過(guò)Button控件的信號(hào)與槽機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送,狀態(tài)參數(shù)的采集與顯示通過(guò)事件驅(qū)動(dòng)方式實(shí)現(xiàn)。可外接GPS模塊實(shí)現(xiàn)導(dǎo)航功能,了Qt媒體媒體播放器實(shí)現(xiàn)娛樂(lè)功能,也可接入無(wú)線(xiàn)網(wǎng)卡來(lái)實(shí)現(xiàn)無(wú)線(xiàn)上網(wǎng)功能。

圖2 車(chē)載HMI終端

圖2HMI

4HMI終端的軟件

4.1CAN/RS232網(wǎng)關(guān)軟件設(shè)計(jì)

主程序中首先要完成初始化操作,包括單片機(jī)、SJA1000、RS232通信以及中斷源的初始化。其中SJA1000的初始化是整個(gè)設(shè)計(jì)最重要的部分,也是保證CAN通信的前提??紤]車(chē)輛內(nèi)部網(wǎng)絡(luò)的兼容性,SJA1000配置為Peli模式,支持CAN2.0A和B規(guī)范,實(shí)現(xiàn)標(biāo)準(zhǔn)幀和擴(kuò)展幀兩種報(bào)文傳輸。SJA1000初始化寄存器配置流程如圖3所示。

圖3 SJA1000初始化寄存器配置流程

圖3SJA1000初始化寄存器配置流程

為保證數(shù)據(jù)實(shí)時(shí)傳輸,采用中斷方式進(jìn)行數(shù)據(jù)收發(fā)。

當(dāng)CAN總線(xiàn)有數(shù)據(jù)接收時(shí)SJA1000會(huì)跳入接收中斷函數(shù)將數(shù)據(jù)接收并存儲(chǔ)到接收緩存,根據(jù)數(shù)據(jù)幀頭來(lái)判別數(shù)據(jù)類(lèi)型和所帶數(shù)據(jù)長(zhǎng)度,最后提取CAN數(shù)據(jù)拆分為單字節(jié)通過(guò)串口發(fā)送,并在HMI終端顯示;當(dāng)HMI終端有控制字發(fā)送,串口接收中斷函數(shù)將所發(fā)送的控制字依次接收存入接收緩存,并根據(jù)首字節(jié)來(lái)判別所發(fā)數(shù)據(jù)類(lèi)型和長(zhǎng)度,組裝成CAN數(shù)據(jù)幀格式發(fā)送到網(wǎng)絡(luò)中去,以此實(shí)現(xiàn)各節(jié)點(diǎn)的控制。具體流程如圖4所示。

圖4 數(shù)據(jù)接收與發(fā)送流程圖

圖4數(shù)據(jù)接收與發(fā)送流程圖

4.2車(chē)載HMI界面的設(shè)計(jì)

HMI界面采用QtCreator2.0來(lái)設(shè)計(jì),因?yàn)镠MI終端是通過(guò)UART接口接入CAN網(wǎng)絡(luò)中,所以通信時(shí)需接上面所介紹的CAN/RS232協(xié)議轉(zhuǎn)換器來(lái)實(shí)現(xiàn)。同時(shí),還需在Linux下編寫(xiě)Qt串口通信程序。

首先,在Linux下利用open函數(shù)打開(kāi)串口設(shè)備,用tcsetattr函數(shù)來(lái)設(shè)置串口屬性。打開(kāi)驅(qū)動(dòng)設(shè)備UART0進(jìn)行讀寫(xiě)操作:constchar*devName=/dev/ttySAC0;fd=::

open(devName,O_RDWR|O_NONBLOCK);設(shè)置波特率等參數(shù):serialAttr.c_cflag=B115200|HUPCL|CS8|CREAD|CLOCAL;serialAttr.c_cc[VMIN]=1;其中串口設(shè)備可使用Linux下I/O函數(shù)進(jìn)行Read和Write操作。但是,在數(shù)據(jù)接收時(shí)當(dāng)數(shù)據(jù)量過(guò)大會(huì)導(dǎo)致界面被阻塞(造成界面假死),于是創(chuàng)建了一個(gè)線(xiàn)程通過(guò)事件驅(qū)動(dòng)實(shí)現(xiàn)數(shù)據(jù)接收。

Qt中可采用QSocketNotifier類(lèi)來(lái)實(shí)現(xiàn)設(shè)備事件驅(qū)動(dòng)的設(shè)計(jì)要求。QSocketNotifier類(lèi)關(guān)聯(lián)Signal/Slot機(jī)制,當(dāng)有數(shù)據(jù)可讀時(shí)會(huì)觸發(fā)Ativated信號(hào),LCDNumber控件Slot會(huì)被調(diào)用來(lái)連接到該信號(hào)并顯示,從而實(shí)現(xiàn)數(shù)據(jù)采集與顯示功能。在數(shù)據(jù)發(fā)送時(shí),可通過(guò)Button控件Signal/Slot調(diào)用QObject對(duì)象的connect()函數(shù)來(lái)實(shí)現(xiàn)[3].當(dāng)按鍵被按下時(shí)觸發(fā)Signal信號(hào),Slot會(huì)調(diào)用pressed()函數(shù)將定義好的數(shù)據(jù)通過(guò)串口Write函數(shù)發(fā)送到總線(xiàn)上。函數(shù)實(shí)現(xiàn)如下:

voidGlass::on_lu_pressed(){charmsg[]={160,34,16,0};//定義所發(fā)送數(shù)據(jù)myserial->myCom->write(msg,4);//寫(xiě)發(fā)送數(shù)據(jù)}

通過(guò)QPainter類(lèi)進(jìn)行對(duì)窗體界面和按鍵圖像界面進(jìn)行設(shè)計(jì),達(dá)到美觀的人機(jī)界面。最后將設(shè)計(jì)好的程序通過(guò)交叉編譯,生產(chǎn)二進(jìn)制文件移植到中,然后在文件系統(tǒng)中調(diào)用執(zhí)行,最終在LCD觸摸屏上顯示,如圖2所示。

5系統(tǒng)集成與測(cè)試

首先將設(shè)計(jì)好的HMI終端通過(guò)交叉串口線(xiàn)與PC機(jī)連接,進(jìn)行相互通信,測(cè)試是否能夠進(jìn)行數(shù)據(jù)收發(fā),測(cè)試成功后通過(guò)CAN/RS232網(wǎng)關(guān)接入Polo車(chē)CAN試驗(yàn)臺(tái)進(jìn)行綜合測(cè)試。試驗(yàn)臺(tái)設(shè)備節(jié)點(diǎn)可通過(guò)觸摸方式控制,同時(shí)可實(shí)時(shí)采集與顯示運(yùn)行狀態(tài)信息,經(jīng)過(guò)多次實(shí)驗(yàn)測(cè)試,運(yùn)行穩(wěn)定可靠,達(dá)到了設(shè)計(jì)要求。

6結(jié)束語(yǔ)

本文所設(shè)計(jì)的車(chē)載HMI終端集車(chē)身控制、儀表顯示、導(dǎo)航、多媒體和無(wú)線(xiàn)上網(wǎng)為一體,簡(jiǎn)化了車(chē)載中控平臺(tái),降低了車(chē)輛控制系統(tǒng)操作的復(fù)雜性。經(jīng)實(shí)驗(yàn)測(cè)試實(shí)現(xiàn)了車(chē)身設(shè)備的觸摸控制,能夠?qū)Ω髟O(shè)備運(yùn)行狀態(tài)信息進(jìn)行采集與顯示。為車(chē)載HMI開(kāi)發(fā)提供了一種可行的設(shè)計(jì)思路與性?xún)r(jià)比更合理的解決

c++相關(guān)文章:c++教程



上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉