微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > 基于Linux的RFID安检系统的设计

基于Linux的RFID安检系统的设计

时间:03-19 来源:互联网 点击:

ib这两个目录下,命令如下:
  Cp result/bin/sqlite3 /arm-linux/usr/bin
  Cp –l result/lib/libsqlite3.so* /arm-linux/usr/lib

  (6)为了能在开发机上编译,调用了sqlite3数据库的API的应用程序,需要将动态库libsqlite3.so.0.8.6及其2个软链接、2个头文件拷贝到交叉编译工具链所在目录的适当位置,至此sqlite3数据库的移植和开发环境的配置已完成。只要输入SQL语言便可以进行相关操作。

  3.2 Linux下sqlite3的C语言开发

  sqlite3里最常用到的是sqlite3 *类型。从数据库打开时开始,sqlite3就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。数据库打开时起,这个类型的变量就代表了所要操作的数据库。
  (1)打开数据库API接口函数
  int sqlite3_open(文件名, sqlite3 *);
  用这个函数开始数据库操作。需要传入两个参数,其中之一是数据库文件名,例如:/home/test.db文件名不需要一定存在,如果此文件不存在,sqlite3会自动建立;如果存在,就尝试把它当数据库文件打开。
  sqlite3 * 参数即前面提到的关键数据结构。函数返回值表示操作是否正确,如果是SQLITE_OK则表示操作正常。相关的返回值sqlite3定义了一些宏,具体这些宏的含义可以参考sqlite3.h文件。

  (2)关闭数据库API接口函数
  int sqlite3_close(sqlite3 *);
  如果前面用sqlite3_open开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。

  (3)执行SQL语句API接口
  由于嵌入式sqlite3数据库支持SQL语言,因而调用C中相关执行函数就如同在终端下操作数据库一样方面快捷,下面是具体的API函数:
  这就是执行一条sql语句的函数。
  Int sqlite3_exec(sqlite3 * db, const char *sql,sqlite3_callback,Void * ,char ** errmsg);
  参数1是调用打开数据库函数sqlite3_open()打开的数据库对象。
  参数2 是一条待执行的SQL语句,其语法格式同标准SQL语言规范一样,如创建 table时插入的记录如下:
  create table student(id varchar(10) primary key, age smallint);
  此语句创建了名为student的表,表中定义了id(学号)和年纪两个变量,其中id是主键。
  Insert into student values(12345678,21);
  此语句向student表中插入一组数据(12345678,21),其中学号为12345678,学生年龄为21。
  对于数据库的其他操作,如数据库更新、修改、查找等用法同上。
  参数3 sqlite3_callback是自定义的回调函数,对执行结果的每一行都执行一次这个函数。
  参数4 void *是调用者所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里,如果不需要传递指针给回调函数,可以填NULL。
  参数5 char ** errmsg是错误信息。sqlite3里面有很多固定的错误信息。执行sqlite3_exec之后,如果执行失败则可以查阅这个指针,即可知道执行过程中错误发生的位置。

  3.3 串口同sqlite3通信测试与分析

  为了验证sqlite3数据库在嵌入式Linux[3-4]终端下的执行效率和稳定性,为此做了一个简单的测试实验:通过上位机程序向嵌入式Linux终端的串口定时发送字符串;嵌入式Linux终端接收到字符串便立即写入到下位机的数据库中。自后查看数据中的数据,看看有没有遗漏和误码。上位机的程序使用VC6.0开发,整个程序界面只设了一个按键,按下按键,上位机就向嵌入式Linux终端不停地发送字符串数据,按键响应程序设计如下:

void CSendDlg::OnButton_Click()
{
state=1;
while(1)
{
str.Format("第%3d条记录",state);//格式化字符串格式
m_Port.WriteToPort(str,str.GetLength());//向串口发送字符串
state++;
Sleep(100);//延时100 ms
}
  可见程序是个定时100 ms便发送一条字符串的循环,而且发送的每一条字符串事先通过str.Format格式化为固定长度,本例中是11 B。按下按键后发送的第一条字符串为:“第1条记录”,每发送一条字符串里面的数字加“1”,这样写到数据库中就可以很清楚地查看有没有遗漏和误码,而且可以通过修改Sleep函数的延时参数检测出嵌入式Linux终端下sqlite3数据库操作的速度。

  下位机嵌入式Linux终端的程序设计为:先创建一个数据库文件test.db,接着就是一个死循环,串口不停地查找有没有数据写入,当检测到数据时,便写入到test.db中,若写入有误,则立即跳出循环,终止程序。
char sql[100]="create table receive(name varchar(40))";
qlite3_open("/var/sd/test.db",db); //在SD卡中创建
test.db文件
sqlite3_exec(db,sql,0,0,errmsg); //在test.db文件中插入
表receiver
fd=open_port(fd,1)//打开串口1
set_opt(fd,9600,8,'N',1)//配置串口属性,开始通信
while(1)
{
n=0;
i=0;
bzero(read_buf, sizeof(read_buf));
if( (n=read(fd, read_buf, sizeof(read_buf))) =0)
Continue;//未读到数据则继续查找串口
printf("recever %d wordsn",n);//输出读到的字符数
sprintf(sql,"insert into receive values(%s)",read_buf);
result =sqlite3_exec(db,sql,0,0,errmsg);//插入数据
到数据库中
if(result==SQLITE_OK)
printf("第%3d条数据写入成功n",++i);
//若插入成功则提示
else break;//若插入不成功,则跳出循环
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top