<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > RFID安檢系統(tǒng)的嵌入式Linux解決方案

          RFID安檢系統(tǒng)的嵌入式Linux解決方案

          作者: 時(shí)間:2011-05-09 來(lái)源:網(wǎng)絡(luò) 收藏

            3.3 串口同sqlite3通信測(cè)試與分析

            為了驗(yàn)證sqlite3數(shù)據(jù)庫(kù)在[3-4]終端下的執(zhí)行效率和穩(wěn)定性,為此做了一個(gè)簡(jiǎn)單的測(cè)試實(shí)驗(yàn):通過(guò)上位機(jī)程序向終端的串口定時(shí)發(fā)送字符串;終端接收到字符串便立即寫入到下位機(jī)的數(shù)據(jù)庫(kù)中。自后查看數(shù)據(jù)中的數(shù)據(jù),看看有沒(méi)有遺漏和誤碼。上位機(jī)的程序使用VC6.0開(kāi)發(fā),整個(gè)程序界面只設(shè)了一個(gè)按鍵,按下按鍵,上位機(jī)就向嵌入式Linux終端不停地發(fā)送字符串?dāng)?shù)據(jù),按鍵響應(yīng)程序設(shè)計(jì)如下:

          void CSendDlg::OnButton_Click()
          {
          state=1;
          while(1)
          {
          str.Format(第%3d條記錄,state);//格式化字符串格式
          m_Port.WriteToPort(str,str.GetLength());//向串口發(fā)送字符串
          state++;
          Sleep(100);//延時(shí)100 ms
          }
            可見(jiàn)程序是個(gè)定時(shí)100 ms便發(fā)送一條字符串的循環(huán),而且發(fā)送的每一條字符串事先通過(guò)str.Format格式化為固定長(zhǎng)度,本例中是11 B。按下按鍵后發(fā)送的第一條字符串為:“第1條記錄”,每發(fā)送一條字符串里面的數(shù)字加“1”,這樣寫到數(shù)據(jù)庫(kù)中就可以很清楚地查看有沒(méi)有遺漏和誤碼,而且可以通過(guò)修改Sleep函數(shù)的延時(shí)參數(shù)檢測(cè)出嵌入式Linux終端下sqlite3數(shù)據(jù)庫(kù)操作的速度。

            下位機(jī)嵌入式Linux終端的程序設(shè)計(jì)為:先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)文件test.db,接著就是一個(gè)死循環(huán),串口不停地查找有沒(méi)有數(shù)據(jù)寫入,當(dāng)檢測(cè)到數(shù)據(jù)時(shí),便寫入到test.db中,若寫入有誤,則立即跳出循環(huán),終止程序。
          char sql[100]=create table receive(name varchar(40));
          qlite3_open(/var/sd/test.db,db); //在SD卡中創(chuàng)建
          test.db文件
          sqlite3_exec(db,sql,0,0,errmsg); //在test.db文件中插入
          表receiver
          fd=open_port(fd,1)//打開(kāi)串口1
          set_opt(fd,9600,8,'N',1)//配置串口屬性,開(kāi)始通信
          while(1)
          {
          n=0;
          i=0;
          bzero(read_buf, sizeof(read_buf));
          if( (n=read(fd, read_buf, sizeof(read_buf))) =0)
          Continue;//未讀到數(shù)據(jù)則繼續(xù)查找串口
          printf(recever %d wordsn,n);//輸出讀到的字符數(shù)
          sprintf(sql,insert into receive values(%s),read_buf);
          result =sqlite3_exec(db,sql,0,0,errmsg);//插入數(shù)據(jù)
          到數(shù)據(jù)庫(kù)中
          if(result==SQLITE_OK)
          printf(第%3d條數(shù)據(jù)寫入成功n,++i);
          //若插入成功則提示
          else break;//若插入不成功,則跳出循環(huán)
          }

            整個(gè)測(cè)試根據(jù)上位機(jī)串口發(fā)送的頻率不同做了多組實(shí)驗(yàn),每組實(shí)驗(yàn)寫入1 000個(gè)數(shù)據(jù),最終結(jié)果分析如下:上位機(jī)在定時(shí)80 ms左右或大于80 ms的情況下發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)寫入的誤碼率為零;當(dāng)定時(shí)時(shí)間小于80 ms時(shí),隨著定時(shí)時(shí)間變小誤碼率會(huì)越來(lái)越高。通過(guò)數(shù)據(jù)分析可知原因有以下幾點(diǎn):一是數(shù)據(jù)庫(kù)本身寫入需用時(shí)幾十毫秒,二是SD卡并非高速讀寫設(shè)備,當(dāng)數(shù)據(jù)還未完全寫入數(shù)據(jù)庫(kù)時(shí)若有新數(shù)據(jù)發(fā)過(guò)來(lái),則下次讀寫將會(huì)發(fā)生難以估計(jì)的錯(cuò)誤。實(shí)驗(yàn)還得出了當(dāng)把數(shù)據(jù)庫(kù)文件寫入到Flash上的總耗時(shí)約為50 ms,比寫入SD卡中約少30 ms。不過(guò)就80 ms左右的一次讀寫速度而言,嵌入式數(shù)據(jù)庫(kù)sqlite3執(zhí)行效率和穩(wěn)定性非常可觀,現(xiàn)在一般的讀寫器通過(guò)串口執(zhí)行一條指令的時(shí)間也需幾十毫秒的時(shí)間,因而使用sqlite3數(shù)據(jù)庫(kù)在執(zhí)行速率和穩(wěn)定性上對(duì)于讀寫數(shù)據(jù)的處理可以很好地達(dá)到要求,而且sqlite3還支持?jǐn)?shù)據(jù)加密,安全性同樣非常出色。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();