# gec6818-RFID-demo **Repository Path**: rise2629/gec6818-rfid-demo ## Basic Information - **Project Name**: gec6818-RFID-demo - **Description**: gec6818开发板项目(一) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2022-11-14 - **Last Updated**: 2023-12-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RFID 停车计费系统 ## 设计要求: **智能车库系统(刷卡系统) ---- 使用触摸屏、LCD显示、RFID识别功能** **1、识别功能:刷卡时,显示车辆信息(图片表示);刷不同的卡片显示不同且对应的图片** **2、计费功能:刷第一次卡时开始计时计费,刷第二次卡时结束计费且显示收费金额** **消费功能:IC卡实现充值消费功能 ---- 先充值,显示卡内余额;进车库时开始计费,出车库时扣费,再次显示卡内余额** demo演示,随意设计的主界面。 ![](https://s3.bmp.ovh/imgs/2022/11/14/259501eb34e091ce.bmp) 具体演示视频未拍摄,与项目要求大体一致。 rfid模块通信协议为uart,需要按流程发送指令,等待模块应答。 ```C void rfid_flow() { printf("Start..............\n"); /*请求天线范围的卡*/ if (PiccRequest(fd)) //成功 ---》0 { sleep(2); printf("1 The request failed!\n"); // continue; } usleep(30 * 1000); /*进行防碰撞,获取天线范围内最大的ID*/ if (PiccAnticoll(fd)) { printf("2 RFID PiccAnticoll failed\n"); // continue; } usleep(30 * 1000); if (PiccSelect(fd)) { printf("3 PiccSelect failed\n"); // continue; } usleep(30 * 1000); if (PiccAuthKey(fd, sector, KEYA)) { printf("4 PiccAuthKey KEYA failed now try KEYB\n"); /*请求天线范围的卡*/ if (PiccRequest(fd)) { printf("5 The request failed!\n"); // continue; } /*进行防碰撞,获取天线范围内最大的ID*/ if (PiccAnticoll(fd)) { printf("6 RFID PiccAnticoll failed\n"); // continue; } if (PiccSelect(fd)) { printf("7 PiccSelect failed\n"); // continue; } if (PiccAuthKey(fd, sector, KEYB)) printf("8PiccAuthKey failed\n"); // continue; } printf("流程完成!\n"); usleep(300 * 1000); } ``` ## 具体函数 ```C #include "rfid.h" int PiccRead(int fd,unsigned char sector) { unsigned char WBuf[128], RBuf[128]; int ret, i ; fd_set rdfd; static struct timeval timeout; memset(WBuf, 0, 128); memset(RBuf,0,128); WBuf[0] = 0x07; //帧长= 7 Byte WBuf[1] = 0x02; //包号= 0 , 命令类型= 0x02 WBuf[2] = 'G'; //命令= 'g WBuf[3] = 0x01; //信息长度= 1 WBuf[4] = sector; //读哪个扇区 WBuf[5] = CalBCC(WBuf, WBuf[0]-2); //校验和 WBuf[6] = 0x03; //结束标志 timeout.tv_sec = 300; timeout.tv_usec = 0; FD_ZERO(&rdfd); FD_SET(fd,&rdfd); write(fd, WBuf, WBuf[0]); ret = select(fd + 1,&rdfd, NULL,NULL,&timeout); switch(ret) { case -1: perror("PiccRead error\n"); break; case 0: printf("PiccRead timed out.\n"); break; default: ret = read(fd, RBuf, 23); if (ret < 0) { printf("PiccRead ret = %d, %d\n", ret, errno); break; } if (RBuf[2] == 0x00) //应答帧状态部分为0 则请求成功 { usleep(10*1000); read(fd,&RBuf[ret],6); memcpy(DataReadBuf,&RBuf[4],16); //读取到该扇区的数据 // for(int i=0;i<16;i++) // { // printf("PiccRead RBuf[%d]=>%x\n",i,DataReadBuf[i]); // } return 0; } break; } return -1; } int PiccWrite(int fd,unsigned char sector) { unsigned char WBuf[128], RBuf[128]; int ret, i; fd_set rdfd; static struct timeval timeout; memset(WBuf, 0, 128); memset(RBuf,0,128); WBuf[0] = 23; //帧长= 23 Byte WBuf[1] = 0x02; //包号= 0 , 命令类型= 0x02 WBuf[2] = 'H'; //命令= 'H WBuf[3] = 0X11; //信息长度= 17 WBuf[4] = sector; //写哪个扇区 memcpy(&WBuf[5],DataWriteBuf,16); WBuf[21] = CalBCC(WBuf, WBuf[0]-2); //校验和 WBuf[22] = 0x03; //结束标志 timeout.tv_sec = 300; timeout.tv_usec = 0; FD_ZERO(&rdfd); FD_SET(fd,&rdfd); write(fd, WBuf, 23); ret = select(fd + 1,&rdfd, NULL,NULL,&timeout); switch(ret) { case -1: perror("PiccWrite error\n"); break; case 0: printf("PiccWrite timed out.\n"); break; default: ret = read(fd, RBuf, 7); if (ret < 0) { printf("PiccWrite ret = %d, %d\n", ret, errno); break; } if (RBuf[2] == 0x00) //应答帧状态部分为0 则请求成功 { printf("------写入完成!请拿开卡!------\n"); printf("PiccWrite card success\n"); return 0; } break; } return -1; } ``` ## 使用教程 此项目使用的是arm开发板,基于linux系统,所以需要使用到交叉编译 ## 开发板开发流程--交叉编译 ### 方法/步骤 1. 搭建linux虚拟机环境,使用vm新建一个Ubuntu系统。 2. 安装c语言编译环境,安装完毕执行"gcc -v"查看版本号。 3. 新建共享文件夹,在目录下编写代码并编译。 4. 将编译后的执行文件通过CRT软件传输到开发板中,赋予777权限并打开。 5. 查看效果。 其中,虚拟机中编译程序不能简单使用"gcc xxx.xx",需要使用arm库。 ``` gcc xx.c -o xx //错误 arm-linux-gcc xx.c -o xx //正确 ``` 将所有文件放到同一文件夹 ![](https://s3.bmp.ovh/imgs/2022/11/14/43eb2613079e2126.jpg) ```C //执行 arm-linux-gcc * -o main ``` 将生产的可执行文件上传至开发板 ``` chmod 777 main //赋予可执行权限 ./main //即可执行 ```