串口触摸屏的设计与实现
2023-08-23吴艳玲周岩王志刚章良芳
吴艳玲,周岩,王志刚,章良芳
(河北汉光重工有限责任公司,河北邯郸,056017)
0 引言
可编程触摸键盘在多功能标准显控台上的应用已经非常普遍,且可编程触摸键盘的销售情况比较乐观,为拓展产品的功能、打破产品中的技术壁垒,在原来型号可编程触摸键盘的结构尺寸基础上,通过更换软件运行平台、调整设备的通讯方式等手段满足不同条件下用户要求,并在一定条件下替代原来型号可编程触摸键盘应用于各标准台上,销售前景良好。
1 产品组成和工作原理
■1.1 产品组成
可编程触摸键盘的组成包括结构组件、液晶盒组件、控制板组件和接口器件等。
(1)液晶盒组件部分包含前面板、液晶屏、屏蔽丝网玻璃组成;
(2)控制板组件包括核心控制板卡组成;
(3)接口器件包括电源接口和信号接口插座;
(4)结构件包含面板、后框架组成。
■1.2 产品工作原理
产品工作原理图如图2所示。
图2 可编程触摸键盘工作原理图
图1 可编程触摸键盘分解图
图3 可编程触摸键盘软件工作流程
该设备具备两组对外接口,分别为RS232串口信号及电源接口、USB调试接口。当调试时,可编程触摸键盘通过USB调试接口进行调试。当正常工作时,可编程触摸键盘通过RS232通信方式控制显示传输的图形、文字或按键等信息。W1线缆:核心主板输出接口XP1的LVDS信号线缆与LED显示屏的输入接口相连接,实现显示功能;W2线缆:核心主板输出接口XP1的供电线缆与LED显示屏输入接口相连接,给LED显示屏提供电压;W3线缆:通过对外接口的XS1外部电源与核心主板的输入接口XP2相连接,实现外部供电;W4线缆:通过对外接口的XS1外部电源与电阻屏的主控板相连,实现外部供电;W5线缆:电阻屏主板的输出接口与五线电阻屏输入口相连,实现通信功能;W6线缆:核心主板输出接口XP5与五线电阻屏输入接口XP4相连接 实现串口通讯;W7线缆:外部主机与核心主板XP6相连,实现通信;W8线缆:核心主板接口XP7与对外接口的XS1相连接 ,实现复位。
液晶盒组件由屏蔽丝网和液晶原屏粘接组成,主要作用为:
(1)图形显示功能;
(2)屏面板加固功能;
(3)电磁屏蔽功能;
(4)减小镜面反射率。
核心控制板主要作用如下:
(1)接收上位机发送的控制指令,解析报文并将报文中的图形、文字等信息转化为显示信号;
(2)接收触摸屏指令,并判定触摸位置是否符合要求;
(3)与上位机进行实时交互,完成设备的在线诊断等故障诊断功能。
2 软件设计
软件驱动设计支持Vxworks、道系统版本6.0、中标麒麟操作系统4.0、Vxworks及Windows XPE操作系统。
可编程触摸键盘可通过RS232接口与主机相连,主机通过应用程序发送指令,指令通过可编程触摸键盘的驱动程序传递报文至核心控制板,核心控制板解析主机发送的报文,并将报文中的图形与文字信息显示在显示屏上。
■2.1 软件配置列表
(1)可编程触摸键盘底层应用程序;
(2)设备驱动程序;
(3)中间件程序;
(4)上位机应用程序。
■2.2 协议要求
(1)以通用软件开发规范为准则;
(2)采用容错、冗余等措施,确保软件的可靠性、安全性和健壮性;
(3)采用由顶向下、层次化、模块化结构设计方法。
■2.3 开发工具的选用
应用QT4.8.4开发平台,遵循RS232通用协议。编程语言采用C、C++语言实现可编程触摸键盘的嵌入式应用软件开发。
■2.4 底层应用软件的开发
可编程触摸键盘的软件开发采用基于优先级的抢占式多任务调度策略;使用二进制信号量来实现任务间的同步与互斥;使用消息队列和管道来实现任务间的通讯;编程语言使用C/C++程序设计语言,采用双缓存技术进行图形绘制、图片处理功能的开发;应用软件可以根据需要进行扩充修改。
3 底层应用软件的实现
可编程触摸键盘具有强大的作图和显示功能,能够实时、直观、准确地获取丰富的系统状态和目标信息;能够实时进行故障定位,并向用户实时反馈可编程触摸键盘的运行状态。它将兼容了原有可编程触摸键盘应用软件的所有功能。其软件框图如图4所示。
图4 可编程触摸键盘软件框图
TPKCore:触摸屏核心类,目前包含TPKPage类、PConnet类、Graphic类的实例,及通信线程的具体实现;
TPKPage:页面处理类,包含页面的各种参数,背景颜色、是否使用、是否显示等等;实现其功能的部分函数定义如下所示:
private:
bool m_bIsUsed;
bool m_bIsShow;
bool m_bIsClear;
unsigned int m_unRGB;
CPTKButton m_PTKMapBtn[ARY_BTN_MAX];
public:
QImage m_image;
void SetRGB(unsigned int unColor);
unsigned int GetRGB(void);
void SetUsed(bool bUsed = TRUE);
bool GetUsed(void);
void SetShow(bool bShow);
bool GetShow(void);
void SetClear(void);
bool GetClear(void);
void SetBTN(CPTKButton PTKBtn);
void DelBTN(int &nID);
void CreateBtmp(const int &nWidth , const int&nHigh);
CPTKButton* GetBTNByID(int nID);
CPTKButton* GetBTNAdr();
CPTKPage(void);
~CPTKPage(void);
像获取按键ID设置按键等功能的部分代码在QT开发环境下具体实现如下代码所示:
CPTKButton* CPTKPage::GetBTNByID(int nID)
{
CPTKButton tmpBtn;
if (nID < 0 || nID >= ARY_BTN_MAX)
{
return NULL;
}
else
return &m_PTKMapBtn[nID];
}
void CPTKPage::SetBTN(CPTKButton PTKBtn)
{ CPTKButton tmpBtn;
int nID = PTKBtn.GetID();
m_PTKMapBtn[nID]= PTKBtn;
}
PConnect类:通讯管理,主要包括报文的解释;
在QT中并没有特定的串口控制类,使用第三方写的qextserialport类。首先设置串口参数,如:波特率,数据位,奇偶校验位,停止位,数据控制流控制,再设置串口号,打开串口等功能。实现其部分功能代码如下所示:
PortSettings m_set,m_set1;
m_set.BaudRate = BAUD115200;
m_set1.BaudRate = BAUD9600;
m_set.DataBits = DATA_8;
m_set1.DataBits = DATA_8;
m_set.Parity = PAR_NONE;
m_set1.Parity = PAR_NONE;
m_set.StopBits = STOP_1;
m_set1.StopBits = STOP_1;
m_set.FlowControl = FLOW_OFF;
m_set1.FlowControl = FLOW_OFF;
m_set.Timeout_Millisec = 2;
m_set1.Timeout_Millisec = 2;
m_pPort=new QextSerialPort("\\.\com2",m_set,QextSerialPort::Polling);
m_pPort1=new QextSerialPort("\\.\com7",m_set1,QextSerialPort::Polling);
qDebug(" m_set1.Timeout_Millisec = %d ", m_set1.Timeout_Millisec);
m_pPort->open(QIODevice::ReadWrite);
m_pPort1->open(QIODevice::ReadWrite);
报文解析,例如:根据可编程触摸键盘通信协议要求创建按键报文解析部分代码如下所示:
int CPConnect::ML_SOCM_CreateCommnKey (char*pchBuf, int &nPage, CPTKButton &tpkBtn ,const int&nlen)
{ QRect rect;
nPage = pchBuf[10];
tpkBtn.SetID(pchBuf[11]);
rect.setLeft(GetInt(pchBuf+12));
rect.setTop(GetInt(pchBuf+14));
rect.setWidth(GetInt(pchBuf+16));
rect.setHeight(GetInt(pchBuf+18));
tpkBtn.SetPTKBtnRect(rect, GetRGB(pchBuf+21) ,GetRGB(pchBuf+24) , GetRGB(pchBuf+27));
tpkBtn.SetLightRGB(GetRGB(pchBuf+30));
tpkBtn.SetStrMsg(pchBuf+37,(int)pchBuf[36],GetRGB(pchBuf+33));
tpkBtn.SetKeyAttr((int)pchBuf[20]);
return N_PT_CRTBTN;
}
Graphic类:绘图类,这些函数主要完成触屏的图形绘制的所有工作。
完成触摸屏绘制工作的部分函数定义程序如下所示:例如 int is_chinese(char p)实现输入的字符是否是中文;void TouchKey_CharShow(QPainter *p,CPTKButton*pPTKBtn)实现按键字符在哪个页码上显示按键。
int is_chinese(char p);
void TouchKey_CharShow(QPainter*p,CPTKButton* pPTKBtn);
void CharPosition(short CharRows,short CharRow,short clength,CPTKButton *pPTKBtn , short&stCharX , short &stCharY);
void ShowChar(QPainter *p,short sALLlen,short clength,unsigned char *ShowCharSz,short cleft,short chigh,CPTKButton *pPTKBtn);
void InitDashVal(const int &nVal = 0);
void Int2Bin(unsigned int unValue, float fArray[]);
void DrawTransparentRect(QPainter *p , const QRect &rect , const unsigned int &color);
void DrawTransparentEllipse(QPainter *p , const QRect &rect, const unsigned int &color);
void DrawTransparentPolygon(QPainter *p ,QPointF * ptAry , const int &nLen, const unsigned int&color);
void DrawTransparentArc(QPainter *p , const QRect&rect ,const int &nStartAngle ,const int &nEndAngle,const unsigned int &color);
void DrawEllipse(QPainter *p ,const QRect &rect,const unsigned int &colorEdge ,const unsigned int&colorFill); //画椭圆
void DrawLine(QPainter *p , const QPoint &ptA ,const QPoint &ptB , const unsigned int &color);
void DrawPolygon(QPainter *p , QPoint * ptAry ,const int &nLen, const unsigned int &colorEdge , const unsigned int &colorFill);
void DrawPie(QPainter *p, const QRect &rect , const QPoint &ptStart ,const QPoint &ptEnd, const unsigned int &colorEdge , const unsigned int &colorFill);
void DrawCommKey(QPainter *p , CPTKButton*pPTKBtn);
void DrawPicKey(QPainter *p ,CPTKButton*pPTKBtn );
void DrawUniteKey(QPainter *p ,CPTKButton*pPTKBtn );
PTKBTN类:按键处理类,包含按键的颜色、形状、ID值和区域等属性的设置,实现其功能的部分函数定义如下所示:
void SetPTKBtn(const QRect &rcBtn ,const unsigned int &unBtnRGB ,const unsigned int &unBtnLTRGB ,const unsigned int &unBtnRBRGB ,const int &nID );
void ChgPTKBtn(const int &nKeyAttr ,const unsigned int &unLightRGB ,char chBuf[], int nLen);
void SetPTKBtnRect(const QRect &rcBtn,const unsigned int &unBtnRGB ,const unsigned int&unBtnLTRGB ,const unsigned int &unBtnRBRGB);
void SetStrMsg(char chBuf[], int nLen , const unsigned int &unRGB);
void SetKeyAttr(const int &nKeyAttr);
void ChnKeyAttr(const char &chValue);
int GetKeyAttr();
void SetLightRGB(const unsigned int &unLightRGB);
unsigned int GetLightRGB();//获取指示灯的颜色
unsigned int GetStrRGB(); //获取字符颜色
char* GetStrPoint(); //获取字符串指针
int GetStrLen(); //获取字符串长度
void SetFont(const int &nSize , const int &nType);
float GetFontPound(void);
int GetFontSize(void);
int GetFontType(void);
void SetPTKPicBtn(const QRect &rcBtn ,const short &sUpPicID ,const short &sDnPicID ,const short&sInPicID);
bool GetPicFlag();
btnCLASS GetBtnClassFlag();
void SetBtnClassFlag(btnCLASS classBtn);
short GetUpPicID();
short GetDnPicID();
4 结论
可编程触摸键盘在日常生产生活中已经推广使用了很多年,随着触摸屏技术的日趋完善, 其可靠性和寿命都得到了大幅提高,在船舶自动化领域中具有触摸功能的人机界面类产品数量及种类也在增多。本文首先介绍了可编程触摸键盘的硬件组成及工作原理,详细讲解了该模块开发的软件设计,对软件的设计原则、软件环境、软件组成和软件功能,对每一个实现的类进行一一分析研究。在原JW06105型可编程触摸键盘的结构尺寸基础上,通过更换软件运行平台、调整设备的通讯方式等手段满足不同条件下用户要求,并在一定条件下替代JW06105型可编程触摸键盘应用于各标准台上,销售前景良好。本文采用串口通信接口方式,在 Qt环境下实现了可编程触摸键盘应用程序的开发。