粉煤灰系统ARM板RFID采集和传输程序备份
来源:互联网 发布:赵薇黑势力集团知乎 编辑:程序博客网 时间:2024/04/30 22:21
备份文档:
1通信协议:《西塞山PLC相关通信协议及规则》
下载链接:http://download.csdn.net/detail/mashang123456789/8128879
协议说明:通信协议分为两种类型,第一种类型是单向通信,ARM版通过串口采集到RFID读卡器信息,并转发给服务器即可。适用于排队读卡器和磅房的两台读卡器。
第二种类型的是双向通信,适用于灰库中的读卡器,ARM板通过串口采集到RFID读卡器信息,做相应处理并按协议转发给中心服务器,中心服务器回复是否匹配信息。
2arm版程序源代码
下面程序需要修改的是两点(已经标红):
1串口号fp=open_port(fp,4);
2中心服务器ip地址inet_pton(AF_INET, "192.168.1.6", &servaddr.sin_addr);
整个工程文件下载链接:http://download.csdn.net/detail/mashang123456789/8128905
其中的核心文件为client.c,即下面的源码,下载链接:http://download.csdn.net/detail/mashang123456789/8128917
/******************************************************************************* Copyright (C), 2014-2015, FreeTeam Lab, Wuhan University Of Technology. File name:client.c Author:LongHui Version:12.2 Date:2014-5-27 15:00:21 Description:(1)串口接收RFID读卡器数据,网口TCP发送数据,接收1-15号设备回复并保存成一条记录。 Others: Function List: 1.void *read_com( void *arg ) 2.void *socket_send( void *arg ) 3.void *socket_rece( void *arg ) History: 1.Date: Author: Modification: 2.*******************************************************************************/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <sys/stat.h>#include <fcntl.h>#include <assert.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sqlite3.h>#include <pthread.h>#include "../wrap.h"#define SERV_PORT 2000 //#define DEBUG 0pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;// 初始化互斥锁pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 初始化条件变量int sockfd;//网口文件描述符int fp;//串口文件描述符int i;int comnum=0,n_socket=0;//从串口读到的个数,socket 接收到的数据个数,必须初始化char com_buf[17]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//存储从串口读到的设备号,天线号,ID号char buf_send[18]={0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE};//向上位机发送设备号,ID号char buf_rece[14]={0xAA,0x01,0x09,66,'S','H',0X41,'2','6',0x03,0x11, //设备号,车牌号(BFHA89说明ASCII码,十六进制,字符都可以发送),灰级,匹配信息。0x00,0x00,0xEE};//上位机返回匹配信息/*sqlite数据库相关的全局声明*/sqlite3 *db;sqlite3_stmt *stmt;int rc; char *zErr; char name[7]={0};//临时存储车牌号 龙辉时间格式timestarmp 万学超时间格式timstampconst char *CREATE="create table if not exists xxs(Id integer primary key, WriterTime timestarmp not null default (datetime('now','localtime')), ReaderNo varchar(3), CarNo varchar(20), GradeCode varchar(3), IsMatch varchar(3))";/******************************************************************************* Function:(1)void *read_com( void *arg ) Description:从串口读取RFID数据 Calls: Calls By:main function Input: Output: Return: Others:*******************************************************************************/void *read_com( void *arg ) //(1)读取串口数据线程{while(1){pthread_mutex_lock( &mutex);if((comnum=read(fp,com_buf,sizeof(com_buf))) > 0){pthread_cond_signal( &cond);comnum=0;//如果不清零,串口读一次,socket会发送两次}pthread_mutex_unlock( &mutex);sleep(1);}}/******************************************************************************* Function:(2)void *socket_send( void *arg ) Description:将从串口读取到的RFID数据(12字节)经过网口发送给TCP SERVER Calls: Calls By:main function Input: Output: Return: Others:*******************************************************************************/void *socket_send( void *arg ) //(2)串口数据socket发送线程{while(1){pthread_mutex_lock( &mutex);if(comnum == 0){pthread_cond_wait( &cond, &mutex);}buf_send[2] = com_buf[1];//将从串口读到的RFID数据存储,添加设备号for(i=2; i<14; i++)buf_send[i+1] = com_buf[i]; //添加ID号/******调试:发送的数据打印到屏幕上********/printf("Sending to server:\n");for(i=0; i< 18; i++)printf("%X ",buf_send[i]);printf("\n");write(sockfd, buf_send, sizeof(buf_send));//socket发送数据pthread_mutex_unlock( &mutex);sleep(1);}}/******************************************************************************* Function:(3)void *socket_rece( void *arg ) Description:接收TCP SERVER回复的数据 Calls: Calls By:main function Input: Output: Return: Others:*******************************************************************************/void *socket_rece( void *arg ) //(3)socket接收线程和相关处理{while(1){if((n_socket=read(sockfd, buf_rece, sizeof(buf_rece))) > 0){/*********调试:收到的数据打印到屏幕上********/printf("Receving from server:\n");for(i=0;i<sizeof(buf_rece);i++){ //车牌号,灰级,匹配信息(控制台)显示部分if((i>=3)&&(i<=8)){printf("%c ",buf_rece[i]);}elseprintf("%X ",buf_rece[i]);}printf("\n");/********************************************//********************sqlite数据库存储模块**********************/if((buf_rece[2] > 0x00)&&(buf_rece[2] < 0x10)){ //4-15号设备对应的PLC才会收到数据,现在改为1-15号都生成一条记录rc = sqlite3_open("match.db", &db); //打开sqlite数据库,若没有就创建if(rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); }rc = sqlite3_exec(db, CREATE, NULL, NULL, &zErr); //在库中创建一张表,若存在就不用创建了if(rc != SQLITE_OK) { if (zErr != NULL) { fprintf(stderr, "SQL error(create): %s\n", zErr); sqlite3_free(zErr); } }strncpy(name,buf_rece+3,6);name[6]='\0';rc = sqlite3_prepare_v2(db, "insert into xxs (ReaderNo, CarNo, GradeCode, IsMatch) values (?, ?, ?, ?)", -1, &stmt, 0);if (rc != SQLITE_OK){fprintf(stderr, "sql error:%s\n", sqlite3_errmsg(db));}sqlite3_bind_int(stmt, 1, buf_rece[2]); //保存设备号sqlite3_bind_text(stmt, 2, name, strlen(name),SQLITE_STATIC);//保存车牌号sqlite3_bind_int(stmt, 3, buf_rece[9]); //保存灰等级sqlite3_bind_int(stmt, 4, buf_rece[10]); //保存匹配信息:17(0X11)匹配,34(0X22)不匹配rc = sqlite3_step(stmt);if( rc != SQLITE_DONE){ printf("%s",sqlite3_errmsg(db)); } sqlite3_reset(stmt); //复位sqlite3_bind_text绑定的语句,可重用stat,提高运行速度sqlite3_close(db); //关闭数据库}/******************************************************************/}}}int main(int argc,char ** argv){ pthread_t tid_com; //线程1:读取串口标签数据 pthread_t tid_send; //线程2:将读到的串口数据通过socket发送出去 pthread_t tid_rece; //线程3:接收socket回复的数据,独立运行struct sockaddr_in servaddr;//fp=open_port(fp,2);//接ARM11Tiny6410开发板靠近USB口和黄色视频输出线的串口, mini2440fp=open_port(fp,4); //Tiny4412只有COM0和COM3已经引出来,COM0是靠近电源的,右边是COM3 /*设置串口:波特率9600,数据位8位,无校验位,停止位1位*/if(set_opt(fp,9600,8,'N',1)<0) { perror("Set_opt error!\n"); return; }sockfd=Socket(AF_INET,SOCK_STREAM,0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; inet_pton(AF_INET, "192.168.1.6", &servaddr.sin_addr); servaddr.sin_port = htons(SERV_PORT);Connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));if(pthread_create( &tid_com, NULL, read_com, NULL ) !=0 ){ //(1)创建读取串口数据线程 printf("pthread_creat error with reading com!\n"); exit(EXIT_FAILURE );}if(pthread_create( &tid_send, NULL, socket_send, NULL ) !=0 ){ //(2)创建socket发送线程 printf("pthread_creat error with socket sending!\n"); exit(EXIT_FAILURE );}if(pthread_create( &tid_rece, NULL, socket_rece, NULL ) !=0 ){ //(3)创建读取串口数据线程 printf("pthread_creat error with socket_rece!\n"); exit(EXIT_FAILURE );}pthread_join( tid_com, NULL);pthread_join( tid_send, NULL); pthread_join( tid_rece, NULL);pthread_mutex_destroy( &mutex);//销毁自旋锁pthread_cond_destroy( &cond); //销毁条件变量Close(sockfd);return 0;}
0 0
- 粉煤灰系统ARM板RFID采集和传输程序备份
- 下个人粉煤灰
- 基于ARM的远程视频采集与传输系统
- 基于ARM的音视频采集与传输系统
- 分布式海量日志采集、聚合和传输系统:Cloudera Flume
- 本命年开工了粉煤灰,揭阳吗核桃仁美轮美奂
- 章粉煤灰研究生(土木工程)课程的学生
- 章粉煤灰研究生(土木工程)课程的学生
- 基于ARM的图像采集和数据传输系统
- 基于ARM的图像采集和数据传输系统
- 灰系统和模糊数学
- 基于VB的单片机温度数据采集与传输系统设计 下位机程序
- 基于ARM9的视频采集传输系统
- 基于ARM9的视频采集传输系统
- 基于ARM9的视频采集传输系统
- RFID应用系统通过Web服务传输数据的研究
- 基于ARM高精度数据采集及网络传输方案
- 基于ARM Linux的图像采集与蓝牙传输
- oracle_子查询
- 素数
- jqplot 常用事件
- header应用大全
- CF 276 Div2 C Bits
- 粉煤灰系统ARM板RFID采集和传输程序备份
- 编译第一个内核模块helloworld
- 字符串___回文串的判断
- oracle_常用分组函数
- 高仿威信主界面,不使用任何框架
- Linux的 head 命令详解
- iOS/iphone开发如何为苹果开发者帐号APPID续费
- Metasploit连接postgres数据库
- sql server 2008全文索引干扰词示例