智能车库

该博客介绍了一个智能车库管理系统,包括初始化数据库、串口设置、计算校验和、读取卡片ID、随机生成车牌号等功能。系统使用SQLite存储数据,并通过UART进行通信。主要涉及串口操作、数据库交互和数据校验等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include “myhead.h”
#define BEEP_ON 0 //蜂鸣器响
#define BEEP_OFF 1 //蜂鸣器灭

#define DEV_PATH3 “/dev/ttySAC3”
#define DEV_PATH1 “/dev/ttySAC1” // CON2
#define DEV_PATH2 “/dev/ttySAC2”
sqlite3 db = NULL;
volatile unsigned int cardid ;
char license[100];
char pic_name[100];
static struct timeval timeout;
/
int init_sql()
{
int ret;
char *sql = “create table if not exists data(cardid integer primary key not null,license text,picpaht text);”;
ret=sqlite3_open("./data.db", &db);
if(ret!=0)
{
perror(“sqlite3_open is fail\n”);

}	
ret=sqlite3_exec(&db,sql,NULL,NULL,NULL);
if(ret!=0)
{
	perror("sqlite3_exec is fail\n");
}
return 0;

} */
int callback(void *p, int num_col, char **text, char **name)
{
int cnt = 0;

while(cnt<num_col)
{
	printf("%-10s\t|", *(text+cnt));
	cnt++;
}

printf("\n_______________________________________________\n");

printf("\n");

return 0;

}
unsigned char CalBCC(unsigned char *buf, int n)
{
int i;
unsigned char bcc=0;
for(i = 0; i < n; i++)
{
bcc ^= *(buf+i); //buf[i]
}
return (~bcc);
}
int callback1(void *p, int num_of_col, char **text, char **name)
{
printf(“出库车辆车牌号是:%s\n”,text[1]);
printf(“卡号:%#x\n”,text[0]);
printf(“图片路径:%s\n”,text[2]);
int ret = remove(text[2]);
if(ret == 0)
{
printf(“success\n”);
}
else
{
printf(“error\n”);
}
return 0;
}

int uart_set(int uartfd)
{

struct termios  myios;
bzero(&myios,sizeof(myios));
//设置串口工作在本地模式
myios.c_cflag  |=  CLOCAL | CREAD; 
cfmakeraw(&myios);
//波特率
cfsetispeed(&myios, B115200); 
cfsetospeed(&myios, B115200);
//8位数据位
myios.c_cflag &= ~CSIZE; /* 用数据位掩码清空数据位设置 */
myios.c_cflag |= CS8; //CS5   CS6  CS7  CS8
//无奇偶校验
myios.c_cflag &= ~PARENB;
//1位停止位
myios.c_cflag &= ~CSTOPB; /* 将停止位设置为一个比特 */
//设置最小等待时间和最少字符数量
myios.c_cc[VTIME] = 0;
myios.c_cc[VMIN]  = 1;
//刷新串口
tcflush(uartfd,TCIOFLUSH);
//配置生效
tcsetattr(uartfd,TCSANOW,&myios);
return 0;

}

void init_tty(int fd)
{
//声明设置串口的结构体
struct termios termios_new;

//先清空该结构体
bzero( &termios_new, sizeof(termios_new));

cfmakeraw(&termios_new);

//设置波特率
cfsetispeed(&termios_new, B9600);
cfsetospeed(&termios_new, B9600);

// CLOCAL和CREAD分别用于本地连接和接受使能
// 首先要通过位掩码的方式激活这两个选项。    
termios_new.c_cflag |= CLOCAL | CREAD;

//通过掩码设置数据位为8位
termios_new.c_cflag &= ~CSIZE;
termios_new.c_cflag |= CS8; 

//设置无奇偶校验
termios_new.c_cflag &= ~PARENB;

//一位停止位
termios_new.c_cflag &= ~CSTOPB;

// 可设置接收单词和等待时间,无特殊要求可以将其设置为0
termios_new.c_cc[VTIME] = 0;
termios_new.c_cc[VMIN] = 1;

// 用于清空输入/输出缓冲区
tcflush (fd, TCIFLUSH);

//完成配置后,可以使用以下函数激活串口设置
if(tcsetattr(fd, TCSANOW, &termios_new))
	printf("Setting the serial1 failed!\n");

}

char get_bcc(char *buf,int n)
{
char bcc = 0;
int i;
for(i=0;i<n;i++)
{
bcc ^= buf[i];
}

return (~bcc);

}
int read_card(char *tty)
{
int fd = open(tty, O_RDWR | O_NOCTTY);
init_tty(fd);

timeout.tv_sec = 1;
timeout.tv_usec = 0;

char WBuf[8], RBuf[128];

bzero(WBuf, 8);
WBuf[0] = 0x07;	//帧长= 7 Byte
WBuf[1] = 0x02;	//包号= 0 , 命令类型= 0x02:ISO14443A命令
WBuf[2] = 0x41;	//命令= 'A',请求附近卡片信息
WBuf[3] = 0x01;	//信息长度 = 1
WBuf[4] = 0x52;	//请求模式:  ALL=0x52
WBuf[5] = CalBCC(WBuf, WBuf[0]-2); //校验和
WBuf[6] = 0x03; //结束标志

fprintf(stderr, "正在检测卡片");
int count = 0;
while(1)
{
	// 向串口发送指令
	tcflush (fd, TCIFLUSH);
	write(fd, WBuf, 7);

	bzero(RBuf, 128);
	read(fd, RBuf, 128);

	//应答帧状态部分为0 则请求成功
	if(RBuf[2] == 0x00)	
	{
		printf("\n获取RFID卡信息成功[%d]: ", RBuf[3]);

		int i;
		for(i=0; i<RBuf[3]; i++)
		{
			printf("%c", RBuf[4+i]);
		}
		printf("\n");
		break;
	}
	else
	{
		if(count%10 == 0)
		{
			fprintf(stderr, ".");
		}
		count++;
		usleep(100*1000);
	}
}

// =======================================

bzero(WBuf, 8);
WBuf[0] = 0x08;	//帧长= 8 Byte
WBuf[1] = 0x02;	//包号= 0 , 命令类型= 0x02
WBuf[2] = 0x42;	//命令= 'B'
WBuf[3] = 0x02;	//信息长度= 2
WBuf[4] = 0x93;	//防碰撞0x93: 一级防碰撞
WBuf[5] = 0x00;	//位计数0
WBuf[6] = CalBCC(WBuf, WBuf[0]-2); //校验和
WBuf[7] = 0x03;	//结束标志

// 向串口发送指令
tcflush (fd, TCIFLUSH);
write(fd, WBuf, 8);

bzero(RBuf, 128);
read(fd, RBuf, 128);

//应答帧状态部分为0 则成功
int cardid;
if(RBuf[2] == 0x00) 
{
	int i, j;
	for(i=RBuf[3]-1, j=0; i>=0; i--, j++)
	{
		memcpy((char *)&cardid+j, &RBuf[4+i], 1);
	}
}
else
{
	printf("获取卡号失败.\n");
	exit(0);
}

printf("卡号: %#x\n", cardid);

close(fd);
return cardid;

}

char *province[]={“粤”, “赣”, “湘”, “鄂”, “贵”,
“黑”, “沪”, “京”, “蒙”, “藏”,
“甘”, “豫”, “鲁”, “晋”, “桂”,
“云”, “滇”, “辽”, “川”, “闵”,
“徽”, “苏”, “津”, “吉”, “冀”,
“陕”, “宁”, “浙”, “渝”, “琼”,
“港”, “澳”, “台”

};

char character[]={ ‘A’, ‘B’, ‘C’, ‘D’, ‘E’,
‘F’, ‘G’, ‘H’, ‘I’, ‘J’,
‘K’, ‘L’, ‘M’, ‘N’, ‘O’,
‘P’, ‘Q’, ‘R’, ‘S’, ‘T’,
‘U’, ‘V’, ‘W’, ‘X’, ‘Y’,
‘Z’, ‘0’, ‘1’, ‘2’, ‘3’,
‘4’, ‘5’, ‘6’, ‘7’, ‘8’,
‘9’

};

char *get_license()//随机获取一个数据
{
char num[6];
bzero(num,6);
bzero(license,100);
srand(time(NULL));
num[0]=character[rand()%36];
num[1]=character[rand()%36];
num[2]=character[rand()%36];
num[3]=character[rand()%36];
num[4]=character[rand()%36];
num[5]=character[rand()%36];

sprintf(license,"%s%s",province[rand()%33],num);
return license;

}

void *check_in(void * arg)
{
int beep_fd,cardid,ret;
char sql_1[100]=“insert into data values”;
char sql_2[100];
char *errmsg;
int i=0;

while(1)//循环读卡
{
	//show_jpeg_share(0,0,1,"./getcard.jpg");
	show_fullbmp("./getcard.bmp");  
	
	bzero(sql_2,100);
	cardid=read_card("/dev/ttySAC3");
	get_license();
	//get_picture();
	sprintf(sql_2,"%s(%#x,'%s','%s');",sql_1,cardid,license,pic_name);
	ret = sqlite3_exec(db,sql_2,NULL,NULL,&errmsg);
	printf("%s",sql_2);
	/* if(ret!=0)
	{
		beep_fd=open("/dev/beep",O_RDWR);
		for(i=0;i<5;i++)
		{
			ioctl(beep_fd,BEEP_ON,1);  //蜂鸣器响
			usleep(30000);
			ioctl(beep_fd,BEEP_OFF,1); 	//蜂鸣器灭
			usleep(30000);
		}
		close(beep_fd);
	}
	else{
		beep_fd = open("/dev/beep",O_RDWR);
		ioctl(beep_fd,BEEP_ON,1);  //蜂鸣器响
		sleep(1);
		ioctl(beep_fd,BEEP_OFF,1);   //蜂鸣器灭
		close(beep_fd);
		//system("madplay welcome.mp3 &");
		
	} */
	char *sql = "select license from data;";
	ret = sqlite3_exec(db,sql,callback,NULL,NULL);
	if(ret != 0)
	{
		printf("error2\n");
	}
	
}

}

void *check_out()
{
int ret,beep_fd,k,cardid;
char sql_1[100]=“delete from data where cardid=”;//删除
char sql_2[100]=“insert into data values”;//添加
char sql_3[100]=“select * from data where cardid=”;//查询
char sql_4[100];
char sql_5[100];
char sql_6[100];

while(1)
{
	show_fullbmp("./getcard.bmp");  
	bzero(sql_4,100);
	bzero(sql_5,100);
	bzero(sql_6,100);
	
	cardid=read_card("/dev/ttySAC3");
	
	sprintf(sql_4,"%s(%#x,'%s','123')",sql_2,cardid,license);
	sprintf(sql_5,"%s%#x",sql_3,cardid);
	sprintf(sql_6,"%s%#x;",sql_1,cardid);
	ret=sqlite3_exec(db,sql_4,NULL,NULL,NULL);
	if(ret!=0)
	{
		//show_jpeg_share(0,0,1,"./parking.jpg");
		show_fullbmp("./parking.bmp");  
		ret = sqlite3_exec(db,sql_5,callback1,NULL,NULL);
		if(ret != 0)
		{
			printf("sqlite3_exec error3\n");
		}
		ret = sqlite3_exec(db,sql_6,NULL,NULL,NULL);
		if(ret==0)
		{
			printf("停车结束\n");
			sleep(2);
		}
	}
	else
	{
		ret = sqlite3_exec(db,sql_6,NULL,NULL,NULL);
		printf("cardid no existence in sql!\n");
		sleep(2);
	}	
	
}

}

void init_led_beep()
{
system(“rmmod led”);
system(“rmmod gec6818_beep”);
system(“insmod led.ko”);
system(“insmod gec6818_beep.ko”);
return ;
}

int main()
{

pthread_t tid1,tid2; 
int ret;
char *errmsg;
char *sql = "create table if not exists data(cardid integer primary key not null,license text,picpaht text);";
//init_led_beep();
	

ret = sqlite3_open("data.db",&db);
if(ret != 0)
	printf("sqlite3_open error!\n");

ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(ret != 0)
{
	printf("sqlite3 exec error!\n");
	printf("%s\n",errmsg);
}
printf("****\n");

//初始化数据库(打开数据和创建表)
//init_sql();//cardid integer primary key,license,picpath

//入场例程
pthread_create(&tid1, NULL, check_in, NULL);


//出场例程
pthread_create(&tid1, NULL, check_out, NULL);

	getchar();

sqlite3_close(db);
	
return 0;

}

#include "accesscontrolsystem.h" AccessControlSystem::AccessControlSystem(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags) { ui.setupUi(this); initialization(); validateUserLogin(); } AccessControlSystem::~AccessControlSystem() { } /*------------------------------------------- * * 初始化 * ---------------------------------------------*/ void AccessControlSystem::initialization() { this->showFullScreen(); this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); verifcation = new VerificationDlg(0); /*------------------------------------------- * 固定窗口大小 ---------------------------------------------*/ this->setFixedSize(this->geometry().size()); switchUser = new SwitchUserDlg(this); systemSetting = new SystemSettingDlg(this); cardIssuer = new CardIssuerDlg(this); rechargePostponed = new RechargePostponedDlg(this); cardDownload = new CardDownloadDlg(this); rateSetting = new RateSettingDlg(this); onlineMonitoring = new OnlineMonitoringDlg(this); ui.rightLogoLabel->setPixmap(QPixmap("Resources\\rightLogo.png")); } /*------------------------------------------- * * 验证用户登录 * ---------------------------------------------*/ void AccessControlSystem::validateUserLogin() { /*------------------------------------------- * 密码狗验证 ---------------------------------------------*/ //codeValidate.startValidate(); if (verifcation->exec() == QDialog::Accepted) { this->show(); this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); }else { exit(1); } } /*------------------------------------------- * * 退出系统 * ---------------------------------------------*/ void AccessControlSystem::on_close_clicked() { //写退出对话框 exit(1); } /*------------------------------------------- * * 最小化 * ---------------------------------------------*/ void AccessControlSystem::on_min_clicked() { this->showMinimized(); } /*------------------------------------------- * * 最大化 * ---------------------------------------------*/ void AccessControlSystem::on_max_clicked() { this->showNormal(); } /*------------------------------------------- * * 切换用户 * ---------------------------------------------*/ void AccessControlSystem::on_switchUserButton_clicked() { switchUser->exec(); } /*------------------------------------------- * * 系统设置 * ---------------------------------------------*/ void AccessControlSystem::on_systemSettingButton_clicked() { systemSetting->exec(); } /*------------------------------------------- * * 卡片发行 * ---------------------------------------------*/ void AccessControlSystem::on_cardIssuerButton_clicked() { cardIssuer->exec(); } /*------------------------------------------- * * 充值延期 * ---------------------------------------------*/ void AccessControlSystem::on_rechargePostponedButton_clicked() { rechargePostponed->exec(); } /*------------------------------------------- * * 卡片下载 * ---------------------------------------------*/ void AccessControlSystem::on_cardDownloadButton_clicked() { cardDownload->exec(); } /*------------------------------------------- * * 费率计算 * ---------------------------------------------*/ void AccessControlSystem::on_rateSettingButton_clicked() { rateSetting->exec(); } /*------------------------------------------- * * 在线监控 * ---------------------------------------------*/ void AccessControlSystem::on_onlineMonitoringButton_clicked() { this->hide(); onlineMonitoring->showFullScreen(); if (onlineMonitoring->exec() == QDialog::Rejected) { this->show(); } } /*------------------------------------------- * * 人事信息 * ---------------------------------------------*/ void AccessControlSystem::on_personnelQueryButton_clicked() { } /*------------------------------------------- * * 提取记录 * ---------------------------------------------*/ void AccessControlSystem::on_extractRecordButton_clicked() { }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值