引言
随着LED技术的不断发展和价格的不断下降,其应用越来越广泛。目前,娱乐场所、展会、特定旅游点、主题公园、广告业等市场对此类LED屏产品有较大的需求,为此全国有许多厂家在研发和生产各种LED显示屏和相关产品,市场竞争非常激烈。针对这一情况,笔者开发一种实用的、可组合成多样形式的、具有互动功能LED显示“屏”及与之配套的操作控制软件,提高了LED产品的市场竞争力。
本文要介绍的是在FSEP9315硬件开发平台上,基于WinCE.net 4.2嵌入式操作系统,运用eMbedded Visual C++4.0软件开发的通过串口远程接收到特定数据实现对多媒体播放器控制的过程。
1 系统概述
整个系统分为三个模块: 互动模块、主控模块、分控模块。互动模块通过红外传感器进行信号采集、传送到主控模块的CPU。CPU经过信号分析控制播放器播放,并将视频数据传送给分控模块的FPGA。FPGA通过数据转换传送到LED面板,实现视频文件在LED屏上的播放显示。
1.1互动模块
将若干个红外传感器按特定的需要布局,通过对人体红外传感器输出信号的采集,用无线传输的方式,把该信号传给主控单元;主控单元根据所接收到的信号,控制LED显示单元的显示内容,从而达到LED显示内容与现场环境有互动的效果。互动式模块结构如图1所示。

图1 互动式模块结构
1.2 主控模块
ARM9内核EP9315的CPU通过串口接收到来自互动模块的控制信号,经过分析转换成控制命令,对WinCE操作系统下的多媒体播放器进行播放控制,并将媒体数据传送给分控板的PFGA。主控模块如图2所示。

图2 主控模块
1.3 分控模块
以EP2C20的FPGA芯片为核心,将主控模块传送过来的视频数据经过处理,存储到显存SRAM_A和SRAM_B中。SRAM_A、SRAM_B在换组信号的控制下,轮流存储NiosⅡ软核处理器送来的显示数据,并将扫描信息发送到屏体面板,由面板进行驱动显示。分控模块如图3所示。

图3 分控模块
2 远程控制多媒体播放器的软件开发
在主控机上主要实现的功能是通过串口接收到来自互动模块的控制信号,对WinCE操作系统下的多媒体播放器进行播放控制。下面介绍利用eMbedded Visual C++工具开发这一套控制软件的过程。
应用程序的开发分成串口通信和多媒体播放两部分,最终再将这两部分结合实现串口信号对播放器控制的功能。应用程序开发使用的软件是eMbedded Visual C++4.0。该软件简称为“EVC”,是用于创建WinCE应用程序的一个集成开发环境,与VC较为类似。
2.1 多媒体播放部分
2.1.1 在EVC中添加Windows Media Player控件
由于WinCE4.2操作系统自带的 Windows Media Player控件是6.4版本的,所以必须先修改注册表,卸载掉PC上Windows Media Player 9.0版本,注册Windows Media Player 6.4版本控件。使用两条命令:“regsvr32 c:\\windows\\system32\\wmp.dll /u”和“regsvr32 c:\\windows\\system32\\msdxm.ocx”,就可以在Registered ActiveX Controls文件夹下为EVC添加多媒体控件了。
2.1.2 自动获取CF卡中的多媒体文件
在主对话框中添加列表框控件,并定义变量m_slist,用于显示CF卡中搜索到的多媒体文件名。注意,在这里显示文件名的同时也添加了文件所在路径,是为了简化后面对播放控制的程序代码。搜索并显示文件名的函数代码如下:
void CSPlayerDlg::SearchFile() {
WCHARtmp[128];
WCHARtemp[128];
int j=0;
file=FindFirstFile(_T("\\存储卡\\*.wmv"),&lpFileData);
if(file==INVALID_HANDLE_VALUE) {
AfxMessageBox(_T("无法打开指定路径"));
}
for(inti=0;i<128;i++){
tmp[i]=0;
}
wcscat(tmp, L"\\\\存储卡\\\\");
wcscat(tmp, lpFileData.cFileName);
//显示文件路径和文件名
m_slist.AddString(tmp);//添加到列表框中
BOOL FileEnd=FindNextFile(file,&lpFileData);
while (FileEnd!=0) {
//循环将所有多媒体文件名添加到列表框中
for(int i=0;i<128;i++){
temp[i]=0;
}
wcscat(temp, L"\\\\存储卡\\\\");
wcscat(temp, lpFileData.cFileName);
m_slist.AddString(temp);
FileEnd=FindNextFile(file,&lpFileData);
}
}
2.1.3 多个文件循环播放的实现
利用定时器函数SetTimer来定时测试播放状态。当状态为零停止时,表明一文件播放完毕,将进行下一个文件的播放。考虑到播放WMV格式文件一开始会有几秒钟的缓冲延时,而在此时播放状态也为零将被误判断为停止状态,因此采用开新线程的方法实现播放后延时10 s后再调用SetTimer函数。部分代码如下:
UINT ShowTimeProc(LPVOID lParam) {//线程函数
CSPlayerDlg* pDlg = (CSPlayerDlg*)lParam;
Sleep(10000);//10 s后检测
pDlg->SetTimer(1,1000,NULL);//调用定时器
AfxEndThread(0);//关闭线程
return 0;
}
2.2 串口通信部分
WinCE不支持Windows下常用的串行通信重叠I/O方式,笔者将串口操作封装为一个类,类中使用线程来持续接收。这样,直接用回调函数就可以在主程序中进行实时接收。当接收到字符1、2、3、4、5时,分别控制
播放、停止、暂停、上一首、下一首。部分程序代码如下:
switch(m_strDataReceived) {
case '1':
OnPlay();
break;
case '2':
OnStop();
break;
case '3':
OnPause();
break;
case '4':
OnLast();
break;
case '5':
OnNext();
break;
default:
AfxMessageBox("无效操作");
}
结语
通过PC的串口调试助手发送数据到FSEP9315开发板上,可以正常对播放器进行控制,测试通过,运行稳定。通过互动式LED系统的研发,可形成具有广泛用途的衍生产品,如直线型人体感应器、建筑轮廓条灯、广告类互动显示牌等相关产品,具有良好的市场前景。