1 引言
用戶界面設(shè)計(jì)是屏幕產(chǎn)品的重要組成部分,它為人機(jī)交互構(gòu)建了一個(gè)溝通環(huán)境,。其中交互性設(shè) 計(jì)是用戶界面設(shè)計(jì)中的重要內(nèi)容之一,。交互設(shè)計(jì)的目的是讓用戶能夠簡(jiǎn)單方便地使用產(chǎn)品,任何產(chǎn)品功能的實(shí)現(xiàn)都是通過人機(jī)交互完成的?,F(xiàn)以單片機(jī)為核心的嵌入式應(yīng)用中界面交互性設(shè)計(jì)為例具 體介紹其實(shí)現(xiàn)方法,。
2 總體設(shè)計(jì)方案
總體設(shè)計(jì)方案如圖 1 所示,。
圖 1 總體設(shè)計(jì)圖
以單片機(jī)為核心的下位機(jī)主要是負(fù)責(zé)采集處理數(shù)據(jù)信息,在接到上位機(jī)的數(shù)據(jù)請(qǐng)求的時(shí)候發(fā)送 數(shù)據(jù)給上位機(jī),。編寫上位機(jī)端的串口通信程序,,用于處理串口信息并且把處理過后的消息發(fā)送給 Virtools。在Virtools 中設(shè)計(jì)消息解釋執(zhí)行行為模組,,將解釋出的相應(yīng)動(dòng)作信息發(fā)送給界面控制程序,, 最后由其完成屏幕的輸出。同時(shí)協(xié)調(diào)Virtools 中各行為模組的工作,,使之達(dá)到良好的演示效果,。
3 串口通信設(shè)計(jì)與實(shí)現(xiàn)
串口通信是指外設(shè)和計(jì)算機(jī)間,通過數(shù)據(jù)信號(hào)線,、地線,、控制線等,按位進(jìn)行傳輸數(shù)據(jù)的一種 通信方式,。這種通信方式使用的數(shù)據(jù)線少,。本文的串口通信設(shè)計(jì)包括下位機(jī)端的串口通信模塊和上 位機(jī)端的串口通信模塊。
3.1 下位機(jī)的串口通信模塊
下位機(jī)的串口通信模塊通過串口完成與上位機(jī)的通信,,在接到上位機(jī)數(shù)據(jù)請(qǐng)求后將采集的數(shù)據(jù) 信息發(fā)送給上位機(jī),。 在設(shè)計(jì)中首先設(shè)定定時(shí)器 T1 為串口波特率發(fā)生器,設(shè)定波特率為19200bps,;上位機(jī)發(fā)送數(shù)據(jù) 請(qǐng)求后觸發(fā)下位機(jī)串口中斷,,為了能夠快速的響應(yīng)上位機(jī)的請(qǐng)求,減少上位機(jī)的等待,,將串口中斷 的優(yōu)先級(jí)設(shè)置為最高,;下位機(jī)會(huì)優(yōu)先調(diào)用通信模塊響應(yīng)該中斷,通信模塊首先判斷請(qǐng)求消息是否正 確,,在確定是正確的請(qǐng)求消息后,,從緩沖區(qū)中取出數(shù)據(jù),封裝成一條消息M 消息碼R(如M01R),, 通過串口發(fā)送給上位機(jī),。通信模塊具備一定過濾及容錯(cuò)能力。
下面重點(diǎn)介紹一下串口通信模塊的處理方式,。
串口通信模塊采用中斷處理方式,,每完整地接收到一個(gè)字符或發(fā)送完一個(gè)字符都會(huì)觸發(fā)該中斷, 進(jìn)入到相應(yīng)的中斷處理函數(shù)中,。中斷處理函數(shù)涉及到接收和發(fā)送兩個(gè)部分,,因此在中斷處理函數(shù)開 始的部分就判斷是接收引發(fā)的中斷,還是發(fā)送引發(fā)的中斷,。如果是接收中斷,,在接收中斷中每接收 一個(gè)字符都要判斷,,確定是否為上位機(jī)發(fā)送過來的請(qǐng)求消息,如果不是放棄當(dāng)前接收到的內(nèi)容,,從 頭開始接收,;如果是,則響應(yīng)上位機(jī)的數(shù)據(jù)請(qǐng)求,,將接收態(tài)改為發(fā)送態(tài),,然后向上位機(jī)發(fā)送通信緩 沖區(qū)中的第一個(gè)字符,每發(fā)送一個(gè)字符會(huì)產(chǎn)生中斷,,在下次中斷中再發(fā)送下一字符,,按此過程直到 發(fā)送完畢。
3.2 上位機(jī)的串口通信模塊
上位機(jī)的串口通信模塊通過串口向下位機(jī)發(fā)送請(qǐng)求信息,,處理下位機(jī)返回的數(shù)據(jù)信息,,并將其 發(fā)送給處理這些信息的行為模組。這一過程是循環(huán)執(zhí)行的,。該程序是與下位機(jī)協(xié)同工作的唯一接口,, 是聯(lián)系界面和下位機(jī)的橋梁。它的處理流程如圖2 所示,。
圖 2 上位機(jī)串口通信模塊處理流程圖
上位機(jī)的串口通信程序是通過調(diào)用 Windows 提供的有關(guān)串口操作的API 函數(shù)完成的,。首先創(chuàng)建 了基礎(chǔ)串口類_base_com,在其中實(shí)現(xiàn)基本信息配置,、打開,、關(guān)閉串口等基礎(chǔ)功能。為了實(shí)現(xiàn)異步發(fā) 送和異步接收,,在_base_com 類的基礎(chǔ)上派生出異步串口通信類_sync_com 完成異步的數(shù)據(jù)傳輸,。
基類_base_com 的聲明如下。
class _base_com //虛基類基本串口接口
{
protected:
volatile int _port; //串口號(hào)
volatile HANDLE _com_handle;//串口句柄
DCB _dcb; //波特率,,停止位,,等
int _in_buf, _out_buf; // 緩沖區(qū)
COMMTIMEOUTS _co; // 超時(shí)時(shí)間
//虛函數(shù),用于不同方式的串口打開
virtual bool open_port() = 0;
void init(); //初始化
public:
_base_com()
{
init();
}
virtual ~_base_com();
/*基本參數(shù)設(shè)置*/
//設(shè)置串口參數(shù):波特率,停止位,,等
inline bool set_para();
//支持設(shè)置字符串 "9600, 8, n, 1"
bool set_dcb(char *set_str);
//設(shè)置內(nèi)置結(jié)構(gòu)串口參數(shù):波特率,,停止位
bool set_dcb(int BaudRate, int ByteSize = 8, int Parity = NOPARITY, int StopBits =
ONESTOPBIT);
//設(shè)置緩沖區(qū)大小
inline bool set_buf(int in_buf, int out_buf);
//打開串口缺省 9600, 8, n, 1
inline bool open(int port);
//打開串口缺省 baud_rate, 8, n, 1
inline bool open(int port, int baud_rate);
//打開串口
inline bool open(int port, char *set_str);
//關(guān)閉串口
inline virtual void close();
//判斷串口是或打開
inline bool is_open();
//獲得串口句炳
HANDLE get_handle();
};
異步串口通信類_sync_com 的聲明如下。
class _sync_com : public _base_com
{
protected:
//打開串口
virtual bool open_port();
public:
_sync_com();
//同步讀
int read(char *buf, int buf_len);
//同步寫
int write(char *buf, int buf_len)
//同步寫
inline int write(char *buf)
{
assert(buf);
return write(buf, strlen(buf));
}
};
4 Virtools 中行為模組的設(shè)計(jì)與實(shí)現(xiàn)
下位機(jī)通過串口傳輸?shù)臄?shù)據(jù),,經(jīng)過上位機(jī)串口通信程序轉(zhuǎn)換成 Virtools 可以識(shí)別的消息,,然后 交由Virtools 中的行為模組進(jìn)行處理,從而達(dá)到利用外部采集數(shù)據(jù)控制界面顯示的目的,。
4.1Virtools 消息發(fā)送行為模組
Virtools 消息發(fā)送行為模組對(duì)串口通信模塊處理得到的數(shù)據(jù)信息進(jìn)行重新封裝,,然后發(fā)送給消息 解釋執(zhí)行行為模組。消息發(fā)送行為模組是使用Virtools 提供的開發(fā)工具包中相關(guān)類的方法實(shí)現(xiàn)對(duì)信 息的重新封裝,。具體實(shí)現(xiàn)如下:
CKBeObject *beo = beh->GetTarget(); //獲取消息發(fā)送目標(biāo)
if(!beo)
return CKBR_OWNERERROR;
int *tab = (int *)beh->GetLocalParameterReadDataPtr(0); //獲得本地變量操作句柄
CKMessageManager *mm = BehContext.MessageManager; //消息管理對(duì)象
int temp = GetMessage(BehContext) - '0'; //調(diào)用串口通信模塊讀取串口消息
mm->SendMessageSingle(tab[temp],beo); //調(diào)用消息發(fā)送函數(shù)發(fā)送已經(jīng)封裝好的動(dòng)作消息
activeOutput_0 = TRUE;
4.2 消息解釋執(zhí)行行為模組
消息解釋執(zhí)行行為模組首先從當(dāng)前的消息列表中獲取消息類型,,根據(jù)消息類型屬性中指定的特 定消息類型來判斷當(dāng)前到達(dá)的消息是否為該特定消息,并根據(jù)判斷結(jié)果調(diào)用不同的處理模塊,。具體 的處理流程如圖3 所示,。
圖 3 消息解釋執(zhí)行行為模組流程圖
利用 Virtools 中行為模組的回調(diào)機(jī)制,循環(huán)調(diào)用該行為模組,。在界面切換時(shí)檢測(cè)一下消息,,判 斷是否與屬性中設(shè)定的動(dòng)作消息一致。如果一致,,則向動(dòng)作控制行為模組發(fā)送激活消息,。
4.3 動(dòng)作控制行為模組
動(dòng)作控制行為模組主要使用 Virtools 自帶的行為模組,像按鍵響應(yīng)行為模組,、腳本的控制行為 模組等,。另外為了控制外部媒體文件的播放,還利用了Virtools 中加載資源文件,、播放資源文件的 行為模組,。
動(dòng)作控制行為模組接收到消息解釋執(zhí)行行為模組發(fā)送的激活信息,就會(huì)調(diào)用相應(yīng)的行為模組完 成界面的輸出,。
5 結(jié)論
本文從工程應(yīng)用的角度,,給出了基于 Virtools 和串口通信的界面交互性的設(shè)計(jì)方法,并給出關(guān)鍵部分的設(shè)計(jì)思路和方法,。該設(shè)計(jì)方法具有一定的通用性,,可應(yīng)用于其它需要用戶界面交互設(shè)計(jì)的 應(yīng)用系統(tǒng)中。
本文作者創(chuàng)新點(diǎn):串口通信下,,采集下位機(jī)(單片機(jī))傳遞的信息,,運(yùn)用 Virtools 的行為模組 進(jìn)行實(shí)時(shí)處理,實(shí)現(xiàn)了人機(jī)界面的交互,。這一設(shè)計(jì)也為其他人機(jī)界面交互性的實(shí)現(xiàn)提供了一種新的 思路,。