项目设计开发环境:

(1)VMware Workstation Pro软件

(2)ubuntu12 .04 (能交叉编译就行)

(3)SecureCRT 

(4)代码编译器(notepad++/Visual Studio Code)

项目功能描述:

(1)幻灯片:开始进行图片幻灯片显示,结束后进入RFID刷卡开锁界面。

(2)RFID:刷卡成功和刷卡失败两种状态(刷卡成功后进入功能选择界面 )。

(3)功能选择界面:四个功能——电子相册、游戏、音乐播放、视频播放。

(4)电子相册:手动切换图片。

(5)游戏:后续待开发。

(6)音乐播放:手动切换歌曲,控制播放和暂停功能。

(7)视频播放:播放、退出。

设计步骤:

1、使用linux创建共享文件夹

2、程序编写

3、Linux的使用(交叉编译)

4、使用SecureCRT传输图片、视频(可U盘传输)

5、程序写入开发板

6、项目成果图:

 

1、创建共享文件夹

(1)打开虚拟机->菜单->管理->虚拟机设置->选项->共享文件夹->总是启用->添加。

RFID 组网_RFID 组网

 

RFID 组网_RFID 组网_02

 (2)验证是否创建成功

    快捷键:Ctrl+ALT+T 进入命令输入窗口,然后输入cd➕空格➕/mnt/hgfs➕回车,再输入ls➕回车。

RFID 组网_linux_03

 

 2、程序编写

查看man手册:

RFID 组网_嵌入式硬件_04

 man 2 手册函数概述:

RFID 组网_RFID 组网_05

头文件:

#ifndef _MAIN_H_//头文件名字大写
#define _MAIN_H_
//看一下这个头文件有没有被重复包含

//头文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <sys/mman.h>
#include <strings.h>

#include <stdlib.h>   //man 3 system ,man手册第三本书
#include "rfid.h"    //

//全局变量
int x,y;//这是触摸屏的坐标变量
int fd;//触摸屏在文件描述符
int lcd_fd;//LCD的文件描述符
int * FB;//内存映射的起始指针
int num;
int ret;
int RD;
int yy;
int aa;
int dd;

//函数声明
int project_init();//初始化函数
void touch_init();//触摸屏函数
void project_show();//主机界面
void project_delete();//释放销毁函数
int bmp_show(char *phtname);//显示图片函数
int system(const char *command);//
//结构体定义
//定义一个结构体存储读取触摸屏的信息
struct input_event touch;
int open_serial(void);
int PiccRequest(int fd);
int init_mplayer();
//宏定义
//联合体,枚举

#endif//结束

 

部分程序:

//主要程序
void project_show()
{
	//幻灯片
	bmp_show("/cry/hzw1.bmp");//刷海贼王1图片
	sleep(2);
	bmp_show("/cry/hzw2.bmp");//刷海贼王2图片
	sleep(2);
	bmp_show("/cry/hzw3.bmp");//刷海贼王3图片
	sleep(2);
	bmp_show("/cry/hzw4.bmp");//刷海贼王4图片
	sleep(2);
	bmp_show("/cry/hzw5.bmp");//刷海贼王5图片
	sleep(2);
    bmp_show("/cry/hzw6.bmp");//刷海贼王6图片
    sleep(2);
	bmp_show("/cry/skks.bmp");//刷刷卡开锁图片
    sleep(2);
	while(1)
	{ 
        ret = PiccRequest(RD);
		if(ret == -1)  //若是请求超时退出,必须要关闭串口后,重新打开才能再次读取数据
		{
			usleep(500000);
			close(RD);
			//打开串口文件
			RD = open_serial();
			/*初始化串口*/
			init_tty(RD);
			timeout.tv_sec = 1;
			timeout.tv_usec = 0;
			continue;
		}	

		else//(ret == 0)
		{
			printf("ok!\n");
		}

		//发送B命令 和获取卡号
		ret = PiccAnticoll(RD);

		//若获取的cardid为0,或获取id超时,则需重新发送'A'命令
		if(cardid == 0 || ret == -1) continue; 

		else if(ret == 0)
		{
			printf("card ID = %x\n", cardid);  //打印cardid号
			usleep(500000);
			//break;
		}
	    //close(RD);
	    if (cardid==0x6333f3ad)  //选择固定卡号
		{
            printf("刷卡成功\n");
			bmp_show("/cry/skcg.bmp");//刷卡成功
			sleep(3);
			bmp_show("/cry/xuanzhe.bmp");//刷卡成功
			while (1)
			{
		             touch_init();//触摸屏在初始化
		             if(touch.type == EV_KEY && touch.code == BTN_TOUCH && touch.value == 0)
		             {
			          printf("(%d,%d)\n",x,y);
			         //界面选择、界面跳转

                     //图片切换
		             if(x>25&&x<340&&y>70&&y<180)
					 {
						while(1)
						{
						touch_init();//触摸屏在初始化
		                if(touch.type == EV_KEY && touch.code == BTN_TOUCH && touch.value == 0)
		                    {
			                       printf("(%d,%d)\n",x,y);

		                    if(x > 615 && x < 800 && y > 390 && y < 480)
			                    {
				                     num++;
				                      printf("触碰左边屏幕");
			                    }
			                if(x > 0 && x < 185 && y > 390 && y < 480)
			                    {
				                  num--;
                                  printf("触碰右边屏幕");
			                    }
								if (num==0)
								{
									bmp_show("/cry/hzw11.bmp");//显示图片 
								}
					        if(num==1)
					            {
									printf("(%d,%d)\n",x,y);
						           bmp_show("/cry/hzw22.bmp");//显示图片
					            }
					        if (num==2)
					            {
									printf("(%d,%d)\n",x,y);
						           bmp_show("/cry/hzw33.bmp");//显示图片
					            }
					        if(num==3)
					            {
									printf("(%d,%d)\n",x,y);
						           bmp_show("/cry/hzw44.bmp");//显示图片
					            }
				            if(num==4)
					            {
									printf("(%d,%d)\n",x,y);
					             	bmp_show("/cry/hzw55.bmp");//显示图片
					            }
					        if(num==5)
					            {
									printf("(%d,%d)\n",x,y);
					            	bmp_show("/cry/hzw66.bmp");//显示图片
					            }
								if (num<0){num=5;}
								if (num>5){num=0;}

					        }
					        if(x > 310 && x < 500 && y > 390 && y < 480)  
					            {
					               printf("退出头像显示界面");
					               bmp_show("/cry/xuanzhe.bmp");//退出至选择界面图片
					               break;
					            }
					    }  
					}

					//播放音乐
					if (x > 450 && x < 730 && y > 290 && y < 400)
					{
						bmp_show("/cry/bofangyingyue.bmp");//显示播放界面
                         while (1)
						 {
							touch_init();//触摸屏在初始化
							num=0;
		                if(touch.type == EV_KEY && touch.code == BTN_TOUCH && touch.value == 0)
		                    {
			                 printf("(%d,%d)\n",x,y);
						    
                       if(x > 620 && x < 800 && y > 390 && y <475)
			            {
				                     yy++;
									 printf("触碰右上角屏幕");
			            }
                         if(x > 29 && x < 190 && y > 390 && y < 475)
			             {
				                  yy--;
                                  printf("触碰左上角屏幕");
			            }
                         if(yy==1)
					    {
							       system("killall -9 madplay");
						           system("madplay yanyuxingzhou.mp3 &");
					    }
						if (yy==2)
						{
							system("killall -9 madplay");
						    system("madplay GuitarType.mp3 &");
						}
                        if (yy==3)
						{
							system("killall -9 madplay");
							system("madplay dongmian.mp3 &");
						}
                        if (yy<0){yy=3;}
						if (yy>3){yy=0;}

						 if(x > 230 && x < 380 && y >390&& y < 475)//暂停
			              {
		                     system("killall -19 madplay");
			              }

                         if(x > 430 && x < 580 && y > 390 && y < 475)//继续
			              {
		                     system("killall -18 madplay");
			              }
						 if(x > 630 && x < 780 && y > 15 && y < 80)//退出
			              {
		                     system("killall -9 madplay");
							 bmp_show("/cry/xuanzhe.bmp");//退出至选择界面图片
							 break;
			              } 
					    }
						 }
					}

                   //播放视频有bug
					if (x > 25 && x < 340 && y > 290 && y < 400)
					{
						int dd =init_mplayer();
                        bmp_show("/cry/chupeng.bmp");//退出至选择界面图片
						   while (1)
						 {
							touch_init();//触摸屏在初始化
		                    if(touch.type == EV_KEY && touch.code == BTN_TOUCH && touch.value == 0)
		                        {
			                        printf("(%d,%d)\n",x,y);
						          if (x > 0 && x < 800 && y > 0 && y < 480)
						           {
					        		 system("mplayer -slave -quiet -input file=/fifo -geometry 0:0 -zoom -x 800 -y 480 sp2.avi &");
						           }
						          if(x > 600 && x < 800 && y > 410 && y < 480)//左下角
			                       {
                                     //write(dd,"quit\n",5);
		                             system("killall -9 mplayer");
							         bmp_show("/cry/xuanzhe.bmp");//退出至选择界面图片
							          break;
			                       }
					            }
						 }
					} 

					//游戏假的界面
                     if (x > 450 && x < 730 && y > 70 && y < 180)
					 {
                          //bmp_show("/cry/yxjm.bmp");//游戏开始界面
						  //sleep(2);
						  bmp_show("/cry/.bmp");//游戏界面
                             while (1)
						 {
							touch_init();//触摸屏在初始化
		                if(touch.type == EV_KEY && touch.code == BTN_TOUCH && touch.value == 0)
		                    {
			                 printf("(%d,%d)\n",x,y);
						     

						 if(x > 600 && x < 800 && y > 410 && y < 480)//左下角
			              {
		                           printf("退出头像显示界面");
					               bmp_show("/cry/xuanzhe.bmp");//退出至选择界面图片
					               break;
			              }
					        }
						 }

					 }

                     if (x > 25 && x < 340 && y > 410 && y < 480)
					 {
						printf("退出头像显示界面");
						bmp_show("/cry/skks.bmp");//刷卡开锁照片
                        break;  
					 }
					 }
					}
					
		}
		else
		{
			  printf("刷卡失败\n");
			  bmp_show("/cry/sksb.bmp");//刷卡失败
			  while (1)
			  {
			     touch_init();//触摸屏在初始化
		           if(touch.type == EV_KEY && touch.code == BTN_TOUCH && touch.value == 0)
		            {
			              printf("(%d,%d)\n",x,y);
			              //界面选择、界面跳转
		
			            if(x > 600 && x < 800 && y > 410 && y < 480)  
			             {
					         printf("退出头像显示界面");
					          bmp_show("/cry/skks.bmp");//退出至刷卡开锁图片
					          break;
				         }
		            }
		       }
		}
    }
}

3、Linux的使用(交叉编译)

编译命令:

arm-linux-gcc *.c -std=c99   (默认生成a.out文件)

arm-linux-gcc *.c -o a.out -std=c99 (指定生成a.out文件)

arm-linux-gcc *.c -I../inc -o../bin/main -std=c99 (指定生成main文件并存在共享文件夹中的bin文件夹中)

arm-linux-gcc *.c  -std=gnu99

RFID 组网_音视频_06

 项目框架:

RFID 组网_linux_07

RFID 组网_嵌入式硬件_08

 

 4、使用SecureCRT传输图片、视频(可U盘传输)

绿勾表示连接成功:

RFID 组网_音视频_09

 

可以将图片或者文件拖到CRT里面选择Xmodem发送:

RFID 组网_音视频_10

 

查看开发板有没有mplayer:

RFID 组网_linux_11

 

传输文件命令:

rx+空格+你想传输的图片(修改图片宽度像素800x480,后缀为.bmp格式)

rx+空格+你想传输的视频或者音乐(音频格式.mp3、视频格式.avi)

 

U盘传输:

默认路径为:cd + 空格+/mnt/udisk:

RFID 组网_notepad++_12

 

cp+U盘中想传输的文件+/想要存在的路径:

下图意思是拷贝hzw1.bmp文件到根目录文件中的cry文件夹中

RFID 组网_notepad++_13

 查看当前路径或文件夹下有什么文件命令: ls

RFID 组网_linux_14

 

调成中文字符:

RFID 组网_RFID 组网_15

 

5、程序写入开发板

把交叉编译生成的a.out文件或main等文件拖到 SecureCRT中点击发送即可。

RFID 组网_音视频_16

 

6、项目成果图:

RFID 组网_RFID 组网_17

RFID 组网_嵌入式硬件_18

RFID 组网_音视频_19

RFID 组网_RFID 组网_20