在static int wait_event (int which, fd_set *in, fd_set *out, fd_set *except,struct timeval *timeout) 函数中,参照了博创公司提供的触摸屏实验程序,编写了一个能比较正确地读出点击触摸屏的鼠标的坐标值。主要是在int wait_event (int which, fd_set *in, fd_set *out, fd_set *except,struct timeval *timeout)函数中把原来的在int wait_event()函数体中的read()函数换成了如下代码:
if (e > 0) {
if (ts >= 0 && FD_ISSET (ts, in))
{
int rs,i=0,ret=-1;
FD_CLR (ts, in);
ts_event.x=0;
ts_event.y=0;
int Xtemp=0,Ytemp=0;
int new_x ,new_y;
while(i<3)
{
ret=read(ts, &ev, sizeof(struct input_event)) ; //从设备号为ts触摸屏设备中读出sizeof(struct input_event)大少的数据填充到ev结构体中。,
if (ret < sizeof(struct input_event) ) return -1;
如果读出数据结果不等于input_event结构体大少就返回
if (ev.type == EV_ABS) {
switch (ev.code)
{
case ABS_X: 行扫描,把从触摸屏读出的X轴的值赋给变量Xtemp
{
Xtemp = ev.value;
break;
}
case ABS_Y:
{
Ytemp = ev.value;
break;
}
列扫描,把从触摸屏读出的Y轴的值赋给变量Ytemp
case ABS_PRESSURE:
{
ts_event.pressure = ev.value;
break;
点击的压力大少赋值给ts_event.pressure
}
}
}
i++;
}
ts_event.x=Xtemp;
ts_event.y=Ytemp;
if (ts_event.pressure > 0)
{
mousex = ts_event.x;
mousey = (479 - ts_event.y); //点击屏的坐标位置和LCD显示鼠标位置相反的
//mousey =ts_event.y;
}
if (ts_event.pressure > 0) {
printf ("\nmouse down: ts_event.x = %d, ts_event.y = %d\n", ts_event.x, ts_event.y);
}
ts_event.pressure = ( ts_event.pressure > 0 ? 4:0); 4代表按下了左键
retvalue |= IAL_MOUSEEVENT;
}
}
其中在代码中注释的部分就是原来网上提供的2410.c的代码。在该代码中有一个while(i<3),因为在用博创提供的串口触摸屏实验中如果第一从触摸屏读出来的数据的Y值是零,不管点击触摸屏的哪个位置Y坐标的值都是零。所以屏蔽了第一次读到的坐标的值2. PXA270平台上MiniGui触摸屏校正
在市面上触摸屏的类型按照其工作原理和传输信息的介质分为四种类型:电阻式、电容感应式、红外线式和表面声波式。其中,电阻式触摸屏的历史最早,使用最多,而且其工作原理也极其简单。在电阻式触摸屏的表面保护涂层和基层之间有两层透明导电层ITO(ITO:氧化铟,弱导电体),分别对应X、Y轴,它们之间用细微透明的绝缘颗粒绝缘,触摸产生的压力会使两导电层接通,按压不同的点时,该点到输出端的电阻值也不同,因此会输出与该点位置相对应的电压信号(模拟量),经A/D转换后即可获取X、Y的坐标值。如下5-3图为触摸屏结构图:
图5-3 触摸屏结构图
传统的鼠标是一种相对定位系统,只和前一次鼠标的坐标位置有关。触摸屏是一种绝对坐标系统,与上一次的坐标位置无关。如下图为触摸屏坐标与LCD坐标对应图:
图 5-4 触摸屏与LCD坐标对应图
线性校正原理如下:
假设LCD宽度为width,高度为height,在屏幕左上角采样的坐标值为(x1,y1),右下角采样的坐标值为(x2,y2),可以通过下列方程求出触摸屏上任意点(x,y)对应LCD的坐标(X,Y):
X=(x-x1)*width/(x2-x1)
Y=(y-y1)* height/(y2-y1)
在成功编译完PXA270平台上MinGui的输入引擎后,就可以编译MiniGui的库文件进行安装。但是有一个问题就是虽然鼠标能在PXA270上点击,可是鼠标偏移点击点比较大。这是因为在触摸屏点击的(X,Y)值的坐标是和LCD显示屏的坐标存在一定的偏差,这就是为什么要校正。在从PXA270终端上读出坐标数据发现在点击触摸屏的右上角的坐标值是(980,940),而PXA270的触摸屏的分辨率大少是640X480,按常理点击右上角的坐标值应该是(640,480),在这里就出现了一个偏差的系数,X轴的偏差系数是K1=640/980,Y轴偏差的系数是K2=480/940。所以上述的部分代码代码可以修改为:
if (ts_event.pressure > 0)
{
mousex = ts_event.x;
mousey = (479 - ts_event.y); //点解触摸屏的坐标位置和LCD显示鼠标位置相反的
//mousey =ts_event.y;
}
修改为:
if (ts_event.pressure > 0)
{
mousex = ts_event.x*K1;
mousey = (479 - ts_event.y*K2);
}
然后在重新编译MiniGui的库文件进行安装。
经过校正后触摸屏的点击精整度已经大大精确了。虽然还有点偏差,但鼠标基本已经可以定位在点击点上。
5.2无线点菜系统通讯模块实现
由于ZigBee设备很多通信机制都已经封装好了,并且ZigBee可以通过连接计算机和开发板的串口就可以实现让两台设备就行通信,所以对ZigBee的编程可以转化为对串口的编程,参照了博创试验平台提供的串口实验列子,发送端运行把数据写到串口程序,接收端运行从串口接收数据的程序。
5.2.1串口发送程序编写
无线点菜系统使用的串口都是COM1,首先通过init_serial(char* dev)函数打开串口,参数dev 为串口设备所对应的目录节点。然后通过调用set_speed(int fd,int speed)函数来设置串口的波特率(这里使用的是9600B),接着通过set_parity(int fd,int databits,int stopbits,int parity)函数来设计串口的数据位、停止位、奇偶位。在设置了串口的参数后,接着就调用write()函数,把要发送的菜的ID写到串口,通过ZigBee传送到后台PC机。
其流程如图5-5所示
5-5 串口发送流程图
5.2.2串口接受程序编写
在PC机的一端,我在接受程序中运行read()函数,把从串口发送过来的菜的ID从串口读出来,然后通过查表得到该ID对应的菜的信息,再用一个字符数组存储起来。如5-6所示:
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>