thongkorn โพสต์ 2018-1-11 13:29:00

[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]
ดูในรูปแบบกติ: [VB6] การเชื่อมต่อคอมพิวเตอร์กับ RFID ภาค 3 (ติดต่อกับฐานข้อมูล)