新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > RFID安检系统的嵌入式Linux解决方案

RFID安检系统的嵌入式Linux解决方案

作者:时间:2011-05-09来源:网络收藏

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

  为了验证sqlite3数据库在[3-4]终端下的执行效率和稳定性,为此做了一个简单的测试实验:通过上位机程序向终端的串口定时发送字符串;终端接收到字符串便立即写入到下位机的数据库中。自后查看数据中的数据,看看有没有遗漏和误码。上位机的程序使用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;//若插入不成功,则跳出循环
}

  整个测试根据上位机串口发送的频率不同做了多组实验,每组实验写入1 000个数据,最终结果分析如下:上位机在定时80 ms左右或大于80 ms的情况下发送数据时,数据库写入的误码率为零;当定时时间小于80 ms时,随着定时时间变小误码率会越来越高。通过数据分析可知原因有以下几点:一是数据库本身写入需用时几十毫秒,二是SD卡并非高速读写设备,当数据还未完全写入数据库时若有新数据发过来,则下次读写将会发生难以估计的错误。实验还得出了当把数据库文件写入到Flash上的总耗时约为50 ms,比写入SD卡中约少30 ms。不过就80 ms左右的一次读写速度而言,嵌入式数据库sqlite3执行效率和稳定性非常可观,现在一般的读写器通过串口执行一条指令的时间也需几十毫秒的时间,因而使用sqlite3数据库在执行速率和稳定性上对于读写数据的处理可以很好地达到要求,而且sqlite3还支持数据加密,安全性同样非常出色。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭