[VB6] การเชื่อมต่อคอมพิวเตอร์กับ RFID ภาค 3 (ติดต่อกับฐานข้อมูล)
http://www.g2gnet.com/webboard/images/vb6/RFID-DB-Run.pngหากท่านพึ่งเข้ามาอ่านในภาค 3 ทันที หากยังไม่เข้าใจหลักการการทำงานของ RFID (Radio Frequency IDentification) ก็ควรกลับไปยังจุดเริ่มต้นก่อนนะครับ โดยที่สามารถอ่านรายละเอียดต่างๆได้ตามลิ้งค์เหล่านี้ ... การเชื่อมต่อคอมพิวเตอร์กับ RFID ภาค 1 (ทฤษฎี และ รูปแบบข้อมูล) ... การเชื่อมต่อคอมพิวเตอร์กับ RFID ภาค 2 (ปฏิบัติแบบไม่ต้องมีอุปกรณ์ก็ได้) ...
และแน่นอนว่าแอดมินจะไม่ขอกล่าวถึงการเชื่อมต่อฐานข้อมูล MS Access ด้วย VB6 เพราะเคยเขียนโค้ดแจกจ่ายไปเยอะแยะแล้ว ท่านสามารถหาอ่านได้ที่แหล่งต้นฉบับที่แอดมินโพสต์เอาไว้ ... คลิ๊กไปอ่านบทความเก่าได้ที่นี่ ...
http://www.g2gnet.com/webboard/images/vb6/RFID-DB-Data.png
หลักการการทำงาน ... แอดมินจำลองการป้อนค่าข้อมูลจำนวน 16 หลัก (ไบต์) เช่น x1234567890ABxxx โดยที่ค่า x จะแทนค่าส่วนหัวท้ายของชุดข้อมูล โค้ดโปรแกรมจะทำการแยกมันออกมาให้ได้เฉพาะ Data จำนวน 12 หลักเท่านั้น เมื่อได้ค่า TAG ID มาครบ 12 หลัก ก็จะทำการตรวจสอบกับฐานข้อมูลว่ามีข้อมูลอยู่หรือไม่ หากไม่มีก็จบ แต่ถ้าหากมีก็จะแสดง TAG ID และรูปภาพออกมาแสดงผล ... จบ ...
การเรียกใช้งาน Microsoft ActiveX Data Objects 2.8 Library เพื่อทำการติดต่อกับไฟล์ฐานข้อมูล
http://www.g2gnet.com/webboard/images/vb6/RFID-DB-Ref.png
มาดูโค้ดฉบับเต็มกันเลย ...
Option Explicit
Private Sub Form_Load()
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
' / Connect DataBase
Call OpenDataBase
' / ตั้งค่าเพื่อทดสอบ ID ขนาดข้อมูลความยาว 16 หลัก กรณีที่ไม่มีชุด RFID ทดสอบ
' / หรือ พิมพ์ชุดข้อมูลใน Notepad ก่อน แล้ว Copy ไปวางใส่ในช่อง TextBox ก็ได้ครับ
txtTagID.Text = "x1234567890ABxxx"
' / กรณีมีชุดทดสอบ ต้องเคลียร์ค่าว่างเปล่าน่ะครับ
' / txtTagID.Text = ""
' / เริ่มต้นตั้งค่าพอร์ทก่อน หากผิดพลาดให้ออกไปจากโปรแกรม
If Not InitializePort Then End
' /หรือ
'Call InitializePort
' / เมื่อ 1000 millisecond = 1 second
' / ตั้งเวลา Timer ให้กระตุ้นการทำงานทุกๆ 100 millisecond.
' / นั่นก็คือ ทุกๆ 100 ms. จะมีการกระตุ้นการทำงานในส่วนการรับข้อมูล MSComm1_OnComm
Timer1.Interval = 100
' / ตั้งรูปแบบ ListView
With lvwData
.ListItems.Clear
.View = lvwReport
' / ตั้งค่า ListView แสดงผล
.ColumnHeaders.Add 1, , "Item", 800
.ColumnHeaders.Add 2, , "Tag ID", .Width \ 2 - 630
.ColumnHeaders.Add 3, , "วันที่ - เวลา การอ่านข้อมูล", .Width \ 2 - 500
End With
End Sub
' / --------------------------------------------------------------------------------
' / ตั้งค่าเริ่มต้นให้กับ Port ก่อน
Function InitializePort() As Boolean
' / ผมทำเป็นฟังค์ชั่น (เสมอ) เพราะบางครั้งก่อนทำงานจริงต้องตรวจสอบความพร้อม ...
' / ของพอร์ทที่ใช้งานด้วย หาก Return ค่ากลับเป็น False ก็ต้องหยุดการทำงานไว้ก่อน
' / --------------------------------------------------------------------------------
On Error GoTo ErrHandler
With MSComm1
' / ทดสอบก่อนว่า Port เปิดใช้งานหรือไม่ หากเปิดไว้ก็ให้ปิด Port ก่อน
If .PortOpen Then .PortOpen = False
' / ตั้งค่า Port ที่ต้องการ
.CommPort = 1
' / ตั้งค่า Baud Rate, Parity, Data Bits, Stop Bits (Standard)
.Settings = "9600,N,8,1"
' / ตั้งสถานะในการ Hand Shaking ของ DTR and RTS (การตรวจสอบความถูกต้องการรับ - ส่ง)
'.DTREnable = True
'.RTSEnable = True
' / ========================================
' / สั่งให้ Enabled เหตุการณ์ในการรับข้อมูลทุกๆ Character
.RThreshold = 1
' / ========================================
' / Disable เมื่อส่ง Characters
'.SThreshold = 0
' / เปิด Port
.PortOpen = True
InitializePort = True
End With
ExitProc::
Exit Function
ErrHandler:
MsgBox Err.Number & " : " & Err.Description
InitializePort = False
End Function
' / --------------------------------------------------------------------------------
' / เหตุการณ์เกิดการรับข้อมูลเข้ามาผ่านทาง Serial Port - COM ในลักษณะของ Interrupt
Private Sub MSComm1_OnComm()
' / --------------------------------------------------------------------------------
With MSComm1
' / ทดสอบเกิดเหตุการณ์เข้ามาของข้อมูล (Received)
Select Case .CommEvent
Case comEvReceive ' หรือ มีค่าเท่ากับ 2
' / แสดงข้อมูล เมื่อมีการรับข้อมูลเข้ามา
txtTagID.Text = txtTagID.Text & MSComm1.Input
End Select
End With
End Sub
' / --------------------------------------------------------------------------------
' / การนำมาใช้ใน Timer เพราะจังหวะของการอ่านมันคงที่กว่าครับ
Private Sub Timer1_Timer()
' / --------------------------------------------------------------------------------
' ตัวแปรรับค่า Tag ID จาก TextBox
Dim TagID As String
' ประกาศตัวแปรสำหรับ ListItem ที่ต้องใช้งานใน ListView
Dim LV As ListItem
' ดัก Error กรณีการอ่านผิดพลาด จะทำให้อ่านข้อมูลเข้ามาไม่ครบ ก็ให้จบออกไปก่อน
'If Len(txtTagID.Text) < 16 Then
' txtTagID.Text = ""
' Exit Sub
'End If
' เริ่มต้นนำข้อมูลไปแสดงลงใน ListView
If Len(txtTagID.Text) > 0 And Len(txtTagID.Text) = 16 Then
TagID = txtTagID.Text
' / ตรวจสอบค่า Tag ID จากตารางข้อมูล
Set RS = New Recordset
Statement = "SELECT * FROM tblContact WHERE RFID = " & "'" & Mid$(Trim(TagID), 2, Len(TagID) - 4) & "'"
RS.CursorLocation = adUseClient
' / กำหนดให้อ่านเดินหน้าอย่างเดียว
RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
' / หากพบข้อมูล Tag ID
If RS.RecordCount > 0 Then
'/ ตรวจสอบว่ามีการเก็บตำแหน่งภาพหรือไม่
'/ กรณีนี้ ไม่มีข้อมูล
If IsNull(RS("PictureName")) Or Trim(RS("PictureName")) = "" Then
'/ นำภาพอะไรก็ได้ มาแสดงให้ผู้ใช้งานเห็นว่าข้อมูลนี้ไม่มีการจัดเก็บภาพไว้
Image1.Picture = LoadPicture(App.Path & "\Images\" & "NoPicture.jpg")
' / นำตำแหน่งภาพมาทำการแสดงผล
' / แต่ปัญหามันจะเกิดขึ้นในวันข้างหน้า หากหาไฟล์ภาพที่ระบุไม่เจอ ทางแก้ก็คือเขียนโค้ดดัก Error
Else
If Dir(App.Path & "\Images\" & Trim(RS("PictureName"))) <> "" Then
Image1.Picture = LoadPicture(App.Path & "\Images\" & RS("PictureName"))
Else
Image1.Picture = LoadPicture(App.Path & "\Images\" & "NoPicture.jpg")
End If
End If
RS.Close: Set RS = Nothing
' / เริ่มต้นนำข้อมูลไปแสดงผลลงใน ListView
' / ให้เกิดมีลำดับที่ สำหรับหลักแรก (Index = 0)
Set LV = lvwData.ListItems.Add(, , lvwData.ListItems.Count + 1)
' รูปแบบที่ปรากฏใน TextBox ===> [1C006082946A[ <===
' แต่แท้จริงแล้ว ข้อมูลจะอยู่ในรูปแบบรหัส ASCII ดังนี้
' <02>1C006082946A<0D><0A><03>
' <02> บ่งบอกจุดเริ่มต้นของข้อมูล (STX - Start of Text)
' <0D> หรือ 13 (ฐาน 10) คือ กดปุ่ม Enter (Carriage Return)
' <0A> หรือ 10 (ฐาน 10) คือ Line Feed (ขึ้นบรรทัดใหม่)
' <03> บ่งบอกจุดสิ้นสุดของข้อมูล (ETX - End of Text)
' / ผมใช้วิธีการนับเริ่มจากหลักที่ 2 และนับไปตามความยาวของ TagID (16 ตัว) - 4
LV.SubItems(1) = Mid$(TagID, 2, Len(TagID) - 4)
' / เก็บค่าวันที่ และ เวลา
LV.SubItems(2) = Now()
' ===================== ตำแหน่งนี้ ==================
' ====== สามารถบันทึกลงฐานข้อมูลได้ หรือ สั่งให้อุปกรณ์ทำงาน ====
'/ เมื่อไม่พบข้อมูล
Else
' / เคลียร์ภาพ
Set Image1 = Nothing
End If
End If
' เคลียร์ค่าการรับข้อมูล
txtTagID.Text = ""
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen Then MSComm1.PortOpen = False
Call CloseDataBase
Set frmRFID = Nothing
End
End Sub
Private Sub cmdClear_Click()
lvwData.ListItems.Clear
txtTagID.Text = ""
txtTagID.SetFocus
Set Image1.Picture = Nothing
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub Form_Resize()
On Error Resume Next
If Me.WindowState = vbMinimized Then Exit Sub
' ความกว้าง
If Me.Width < 8730 Then
Me.Width = 8730
Exit Sub
End If
' ความสูง
If Me.Height < 5865 Then
Me.Height = 5865
Exit Sub
End If
' การคำนวณหาระยะการย่อ ขยายของฟอร์ม
fraData.Move 0, 0, Me.ScaleWidth - cmdClear.Width - cmdExit.Width - 60, Me.ScaleHeight
lvwData.Move 30, 870, fraData.Width - 60, fraData.Height - 930
cmdClear.Move fraData.Width + 15, 90
cmdExit.Move cmdClear.Left + cmdClear.Width + 30, 90
Image1.Left = fraData.Width + 15
End Sub
ดาวน์โหลดโค้ดต้นฉบับแบบเต็มได้ที่นี่ ...
หน้า:
[1]