|
หากท่านพึ่งเข้ามาอ่านในภาค 3 ทันที หากยังไม่เข้าใจหลักการการทำงานของ RFID (Radio Frequency IDentification) ก็ควรกลับไปยังจุดเริ่มต้นก่อนนะครับ โดยที่สามารถอ่านรายละเอียดต่างๆได้ตามลิ้งค์เหล่านี้ ... การเชื่อมต่อคอมพิวเตอร์กับ RFID ภาค 1 (ทฤษฎี และ รูปแบบข้อมูล) ... การเชื่อมต่อคอมพิวเตอร์กับ RFID ภาค 2 (ปฏิบัติแบบไม่ต้องมีอุปกรณ์ก็ได้) ...
และแน่นอนว่าแอดมินจะไม่ขอกล่าวถึงการเชื่อมต่อฐานข้อมูล MS Access ด้วย VB6 เพราะเคยเขียนโค้ดแจกจ่ายไปเยอะแยะแล้ว ท่านสามารถหาอ่านได้ที่แหล่งต้นฉบับที่แอดมินโพสต์เอาไว้ ... คลิ๊กไปอ่านบทความเก่าได้ที่นี่ ...
หลักการการทำงาน ... แอดมินจำลองการป้อนค่าข้อมูลจำนวน 16 หลัก (ไบต์) เช่น x1234567890ABxxx โดยที่ค่า x จะแทนค่าส่วนหัวท้ายของชุดข้อมูล โค้ดโปรแกรมจะทำการแยกมันออกมาให้ได้เฉพาะ Data จำนวน 12 หลักเท่านั้น เมื่อได้ค่า TAG ID มาครบ 12 หลัก ก็จะทำการตรวจสอบกับฐานข้อมูลว่ามีข้อมูลอยู่หรือไม่ หากไม่มีก็จบ แต่ถ้าหากมีก็จะแสดง TAG ID และรูปภาพออกมาแสดงผล ... จบ ...
การเรียกใช้งาน Microsoft ActiveX Data Objects 2.8 Library เพื่อทำการติดต่อกับไฟล์ฐานข้อมูล
มาดูโค้ดฉบับเต็มกันเลย ...
- 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
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับแบบเต็มได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|