980 likes | 1.15k Views
第六章、 RFID 資訊系統開發. 本章針對 RFID 系統中 Windows Form 架構(單機版)的開發方式進行說明,內容使用 MS Visual Studio.NET 2008 為系統開發平台,配合後端 MS Access 或 MS SQL Server 資料庫及 MSCOMM 、 SerialPort 與 Winsock 等三通訊元件,介紹整合後連接 RFID 讀取器擷取資料的設計方式。本章內的所有範例程式,讀者都可以在本書光碟內的 CH6 目錄內找到並應用。. 大 綱. 6-1 MSCOMM 物件 6-2 ACCESS 資料庫 6-3 SerialPort 物件
E N D
第六章、RFID資訊系統開發 本章針對RFID系統中Windows Form架構(單機版)的開發方式進行說明,內容使用MS Visual Studio.NET 2008為系統開發平台,配合後端MS Access 或MS SQL Server資料庫及MSCOMM、SerialPort與Winsock等三通訊元件,介紹整合後連接RFID讀取器擷取資料的設計方式。本章內的所有範例程式,讀者都可以在本書光碟內的CH6目錄內找到並應用。
大 綱 • 6-1 MSCOMM物件 • 6-2 ACCESS資料庫 • 6-3 SerialPort物件 • 6-4 Winsock • 6-5 SQL Server資料庫 • 6-6 藍芽讀取器 • 6-7 POS範例再討論
RFID資訊系統開發 • 本章主要介紹使用MS Visual Studio.NET 2008(以下簡稱VS.NET 2008)開發Windows Form程式來與RFID讀取器進行溝通與讀取卡號及資料。 • 此部份程式主要是電腦與讀取器的連接溝通,溝通介面主要為RS232、USB或是Ethernet,此些部分主要是透過VS.NET 2008提供的物件來完成,以下將依不同物件的使用來介紹
MSCOMM物件 • 此物件在Visual Basic 6.0時代時已經存在,也是以往很多系統用來擷取RS232與USB設備訊號的物件 • 此物件到了VS.NET 2005與VS.NET 2008並不是預設有的物件,所以需要透過「加入工具箱」的方式來完成 • 首先,請使用VS.NET 2008建立一個新專案,專案名稱是CH6-1(圖6-1)
MSCOMM物件 • 接著,將Form1的Text屬性改成「MSCOMM物件抓取RFID卡號範例」,並在表單Form1上佈置2個Label物件與1個TextBox物件,各物件的設定如表6-1所示,完成後的畫面如圖6-2
MSCOMM物件 • 完成使用者介面設定後,再來需要將原來屬於Visual Basic 6.0的MSCOMM.OCX物件設定成可讓VS.NET 2008使用。如圖6-3所示,請選擇「工具」 「選擇工具箱項目」
MSCOMM物件 • 之後會出現圖6-4的「選擇工具箱項目」視窗,請選擇「COM元件」頁籤,請勾選「Microsoft Communications Control, version 6.0」,然後按「確定」,MSCOMM元件將會被加入到開發平台左方的「工具箱」中,此時就可以使用MSCOMM物件,如圖6-5所示
MSCOMM物件 • 請將MSCOMM元件從工具箱中拖入Form1表單內,供後續開發使用,完成後如圖6-6,畫面上將多出一個電話的圖示,這個就是MSCOMM物件,這裡我們維持它原來的物件名稱「AxMSComm1」
MSCOMM物件 • 再來,請確定已經將設定完成的RFID讀取器(設定方式請見第二章說明)連接上電腦,並透過控制台的裝置管理員確認設備可以正常使用與目前的連接埠,如圖6-7所示,本範例的連接埠在COM12。等上述ㄧ切就緒後就可以開始撰寫程式碼,透過MSCOMM元件來連接RFID讀取器取得所需要的卡號
圖6-7、RFID讀取器在裝置管理員的連接埠查詢畫面圖6-7、RFID讀取器在裝置管理員的連接埠查詢畫面
MSCOMM物件 • 針對程式開發部分,首先在Form1_Load事件中撰寫設定MSCOMM物件的通訊協定,當中包含通訊速率(Baud rate,請詢文您的硬體供應商)、通訊埠(每個人的電腦狀況都不同,這裡是COM12)、Threshold(要設定成1)等三項參數,最後將通訊埠開啟 • 執行程式後如果看到圖6-8畫面,代表程式與讀取器間訊號傳遞的通訊埠可以被正常開啟,沒有問題
MSCOMM物件 • 此時已經正常開啟程式與硬體讀取器間的通訊介面與管道,只要讀取器有讀取到標籤的資料,將會觸發MSCOMM物件的「OnComm」事件 • 所以我們必須要在MSCOMM物件的「OnComm」事件中撰寫程式接收來自讀取器的資料。其中,如果讀取狀況正常,將回傳CommEvent=2的狀態 • MSCOMM物件接收資料的方法為Input
MSCOMM物件 • 相反地,如果讀取有錯誤將回傳CommEvent=7的狀態,程式將關閉通訊介面,並提示錯誤訊息,問題可能發生在忘記將讀取器接上電腦或是讀取器有損壞的狀況 • 完成上述所有步驟與程式撰寫後,就可以實際執行本程式,但一定要先確定讀取器與電腦有正常安裝與連結,圖6-9是正常抓取卡號的畫面
ACCESS資料庫 • 本書第五章中介紹過使用VS.NET 2008開發資料庫程式的方法與步驟,當中介紹了連結ACCESS與SQL Server兩種資料庫的操作方法 • 首先請使用ACESS 2003建立一個名稱為TAG的空白資料庫(TAG.md),同時建立一個儲存卡號資訊的資料表,名稱為card_info(讀者可以在本書光碟內的CH6\CH6-2\CH6-2\bin\Debug目錄中找到該資料庫檔案)
ACCESS資料庫 • 當中包含有4個欄位,如圖6-10所示,各欄位的名稱、型態、資料長度與格式設定如表6-2所示
ACCESS資料庫 • 資料庫欄位格式設定建立完成後,請在資料庫中建立幾筆資料,例如圖6-11所示,此處建立了兩筆RFID標籤與使用者的資料,分別是卡號為AADB8176的使用者陳小明與卡號為A6CD6F62的使用者王大頭。應用時請各位讀者依這自己的卡號資料建立資料表內的「card_ID」欄位內容
ACCESS資料庫 • 為了要透過VS.NET 2008連結使用ACCESS資料庫,需要引用「System.Data.OleDb」的名稱空間 • 我們將呼叫ACCESS資料庫查詢卡號使用者的功能寫成「showmember」函數,當系統透過MSCOMM元件在OnComm事件中抓到卡號後,將呼叫showmember連結ACCESS資料庫進行卡號比對,然後顯示出正確的使用者名稱
ACCESS資料庫 • 我們仿照專案CH6-1的介面,但在CH6-2專案中另外加入兩個Label物件,分別是Label3與Label4,同時,將Label3的Text屬性設定為”使用者:”,Label4則使用程式動態將查詢到的使用者名稱(owner欄位)資料顯示出來 • 程式實際執行後刷卡的畫面如下圖6-12所示,依照前面資料庫標籤卡號的設定,卡號為AADB8176的使用者是陳小明,實際顯示結果與當初規劃預期之結果相符
圖6-12、MSCOMM元件結合ACCESS資料庫查詢卡號資料畫面圖6-12、MSCOMM元件結合ACCESS資料庫查詢卡號資料畫面
SerialPort物件 • 本節則是針對VS.NET 2008中標準內含的RS232與USB通訊埠溝通物件「SerialPort」進行介紹,請建立本章第三個專案CH6-3,如圖6-13,並依照表6-3在Forml.vb上佈置所需要的介面物件
SerialPort物件 • 與MSCOMM元件類似,SerialPort物件也需要設定通訊埠號碼,但其屬性不是「CommPort」,而是「PortName」,如圖6-14所示,本範例中延續上節設定為COM12
SerialPort物件 • SerialPort物件來抓取讀取器讀取到標籤的辨識號碼,同MSCOMM元件,SerialPort元件也是使用Open方法來開啟所設定的通訊埠,此部份希望在程式一啟動時就完成通訊埠設定與開啟,所以寫在Form1表單的Load事件中
啟動SerialPort物件 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SerialPort1.PortName = "COM12" SerialPort1.Open() If SerialPort1.IsOpen = True Then MessageBox.Show("COM開啟成功") Else MessageBox.Show("COM開啟失敗") End If End Sub
SerialPort物件 • MSCOMM元件接收資料的事件是OnComm,而SerialPort元件則是「DataReceived」事件,完成通訊埠開啟後便是在DataReceived事件中撰寫相關的程式碼。再來與MSCOMM物件不同的是,MSCOMM物件使用Input方法接收資料,而SerialPort物件則是「ReadLine」方法 • 一次直接讀取一串DATA
使用SerialPort物件 Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived inputdata = SerialPort1.ReadLine Me.Invoke(New SetTextBoxTextDelegate(AddressOf SetTextBoxText), inputdata) End Sub
使用SerialPort物件 Private Delegate Sub SetTextBoxTextDelegate(ByVal text As String) Dim whichtime As Integer = 0 Private Sub SetTextBoxText(ByVal text As String) If whichtime = 0 Then TextBox1.Text = Mid(text, 2, 8) ' 擷取卡號 whichtime = 1 Else TextBox1.Text = Mid(text, 3, 8) ' 擷取卡號 End If End Sub
SerialPort物件 • 最後,請執行專案CH6-3確認結果,如果沒有任何錯誤,將看到圖6-15的畫面,代表讀取器與程式間的通訊埠已經順利開啟,等待讀取讀卡機的資料 • 此時就可以使用讀卡機去讀取標籤,結果將在畫面上顯示出卡號資料,如圖6-16所示,但此時尚沒有比對該卡號使用者的功能
SerialPort物件 • 後續讀者可以搭配6-2節所撰寫的showmember函式來串接ACCESS資料庫進行讀卡後查詢使用者的功能 • 執行結果如圖6-17所示,詳細說明請見6-2節,在此將不再贅述