基于Virtools 和串口通信的界面交互性的设计与实现
2011年01月18日 21:25 发布者:designer
本文介绍了一种采用Virtools 和串口通信实现人机界面交互的设计方法。下位机通过 串口通信的方式将采集的数据传给上位机,上位机通过Virtools 的行为模组对这些数据进行处理, 并根据处理结果做出响应,从而实现人机界面的交互。1 引言
用户界面设计是屏幕产品的重要组成部分,它为人机交互构建了一个沟通环境。其中交互性设 计是用户界面设计中的重要内容之一。交互设计的目的是让用户能够简单方便地使用产品,任何产 品功能的实现都是通过人机交互完成的。现以单片机为核心的嵌入式应用中界面交互性设计为例具 体介绍其实现方法。
2 总体设计方案
总体设计方案如图 1 所示。
图 1 总体设计图
以单片机为核心的下位机主要是负责采集处理数据信息,在接到上位机的数据请求的时候发送 数据给上位机。编写上位机端的串口通信程序,用于处理串口信息并且把处理过后的消息发送给 Virtools。在Virtools 中设计消息解释执行行为模组,将解释出的相应动作信息发送给界面控制程序, 最后由其完成屏幕的输出。同时协调Virtools 中各行为模组的工作,使之达到良好的演示效果。
3 串口通信设计与实现
串口通信是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种 通信方式。这种通信方式使用的数据线少。本文的串口通信设计包括下位机端的串口通信模块和上 位机端的串口通信模块。
3.1 下位机的串口通信模块
下位机的串口通信模块通过串口完成与上位机的通信,在接到上位机数据请求后将采集的数据 信息发送给上位机。 在设计中首先设定定时器 T1 为串口波特率发生器,设定波特率为19200bps;上位机发送数据 请求后触发下位机串口中断,为了能够快速的响应上位机的请求,减少上位机的等待,将串口中断 的优先级设置为最高;下位机会优先调用通信模块响应该中断,通信模块首先判断请求消息是否正 确,在确定是正确的请求消息后,从缓冲区中取出数据,封装成一条消息M 消息码R(如M01R), 通过串口发送给上位机。通信模块具备一定过滤及容错能力。
下面重点介绍一下串口通信模块的处理方式。
串口通信模块采用中断处理方式,每完整地接收到一个字符或发送完一个字符都会触发该中断, 进入到相应的中断处理函数中。中断处理函数涉及到接收和发送两个部分,因此在中断处理函数开 始的部分就判断是接收引发的中断,还是发送引发的中断。如果是接收中断,在接收中断中每接收 一个字符都要判断,确定是否为上位机发送过来的请求消息,如果不是放弃当前接收到的内容,从 头开始接收;如果是,则响应上位机的数据请求,将接收态改为发送态,然后向上位机发送通信缓 冲区中的第一个字符,每发送一个字符会产生中断,在下次中断中再发送下一字符,按此过程直到 发送完毕。
3.2 上位机的串口通信模块
上位机的串口通信模块通过串口向下位机发送请求信息,处理下位机返回的数据信息,并将其 发送给处理这些信息的行为模组。这一过程是循环执行的。该程序是与下位机协同工作的唯一接口, 是联系界面和下位机的桥梁。它的处理流程如图2 所示。
图 2 上位机串口通信模块处理流程图
上位机的串口通信程序是通过调用 Windows 提供的有关串口操作的API 函数完成的。首先创建 了基础串口类_base_com,在其中实现基本信息配置、打开、关闭串口等基础功能。为了实现异步发 送和异步接收,在_base_com 类的基础上派生出异步串口通信类_sync_com 完成异步的数据传输。
基类_base_com 的声明如下。
class _base_com //虚基类基本串口接口
{
protected:
volatile int _PORT; //串口号
volatile HANDLE _com_handle;//串口句柄
DCB _dcb; //波特率,停止位,等
int _in_buf, _out_buf; // 缓冲区
COMMTIMEOUTS _co; // 超时时间
//虚函数,用于不同方式的串口打开
virtual bool open_PORT() = 0;
void init(); //初始化
public:
_base_com()
{
init();
}
virtual "_base_com();
/*基本参数设置*/
//设置串口参数:波特率,停止位,等
inline bool set_para();
//支持设置字符串 "9600, 8, n, 1"
bool set_dcb(char *set_str);
//设置内置结构串口参数:波特率,停止位
bool set_dcb(int BaudRate, int ByteSize = 8, int Parity = NOPARITY, int StopBits =
ONESTOPBIT);
//设置缓冲区大小
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);
//关闭串口
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 中行为模组的设计与实现
下位机通过串口传输的数据,经过上位机串口通信程序转换成 Virtools 可以识别的消息,然后 交由Virtools 中的行为模组进行处理,从而达到利用外部采集数据控制界面显示的目的。
4.1Virtools 消息发送行为模组
Virtools 消息发送行为模组对串口通信模块处理得到的数据信息进行重新封装,然后发送给消息 解释执行行为模组。消息发送行为模组是使用Virtools 提供的开发工具包中相关类的方法实现对信 息的重新封装。具体实现如下:
CKBeObject *beo = beh->GetTarget(); //获取消息发送目标
if(!beo)
return CKBR_OWNERERROR;
int *tab = (int *)beh->GetLocalParameterReadDataPtr(0); //获得本地变量操作句柄
CKMessageManager *mm = BehContext.MessageManager; //消息管理对象
int temp = GetMessage(BehContext) - '0'; //调用串口通信模块读取串口消息
mm->SendMessageSingle(tab,beo); //调用消息发送函数发送已经封装好的动作消息
activeOutput_0 = TRUE;
4.2 消息解释执行行为模组
消息解释执行行为模组首先从当前的消息列表中获取消息类型,根据消息类型属性中指定的特 定消息类型来判断当前到达的消息是否为该特定消息,并根据判断结果调用不同的处理模块。具体 的处理流程如图3 所示。
图 3 消息解释执行行为模组流程图
利用 Virtools 中行为模组的回调机制,循环调用该行为模组。在界面切换时检测一下消息,判 断是否与属性中设定的动作消息一致。如果一致,则向动作控制行为模组发送激活消息。
4.3 动作控制行为模组
动作控制行为模组主要使用Virtools 自带的行为模组,像按键响应行为模组、脚本的控制行为模组等。另外为了控制外部媒体文件的播放,还利用了Virtools 中加载资源文件、播放资源文件的 行为模组。
动作控制行为模组接收到消息解释执行行为模组发送的激活信息,就会调用相应的行为模组完 成界面的输出。
5 结论
本文从工程应用的角度,给出了基于Virtools 和串口通信的界面交互性的设计方法,并给出关键部分的设计思路和方法。该设计方法具有一定的通用性,可应用于其它需要用户界面交互设计的应用系统中。
本文作者创新点:串口通信下,采集下位机(单片机)传递的信息,运用 Virtools 的行为模组 进行实时处理,实现了人机界面的交互。这一设计也为其他人机界面交互性的实现提供了一种新的思路。