ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 4768|ตอบกลับ: 0

[VB6] การเชื่อมต่อคอมพิวเตอร์กับ RFID ภาค 3 (ติดต่อกับฐานข้อมูล)

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583


หากท่านพึ่งเข้ามาอ่านในภาค 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 เพื่อทำการติดต่อกับไฟล์ฐานข้อมูล



มาดูโค้ดฉบับเต็มกันเลย ...
  1. Option Explicit

  2. Private Sub Form_Load()
  3.     Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
  4.     ' / Connect DataBase
  5.     Call OpenDataBase
  6.    
  7.     ' / ตั้งค่าเพื่อทดสอบ ID ขนาดข้อมูลความยาว 16 หลัก กรณีที่ไม่มีชุด RFID ทดสอบ
  8.     ' / หรือ พิมพ์ชุดข้อมูลใน Notepad ก่อน แล้ว Copy ไปวางใส่ในช่อง TextBox ก็ได้ครับ
  9.     txtTagID.Text = "x1234567890ABxxx"
  10.    
  11.     ' / กรณีมีชุดทดสอบ ต้องเคลียร์ค่าว่างเปล่าน่ะครับ
  12.     ' / txtTagID.Text = ""
  13.    
  14.     ' / เริ่มต้นตั้งค่าพอร์ทก่อน หากผิดพลาดให้ออกไปจากโปรแกรม
  15.     If Not InitializePort Then End
  16.     ' /หรือ
  17.     'Call InitializePort
  18.    
  19.     ' / เมื่อ 1000 millisecond = 1 second
  20.     ' / ตั้งเวลา Timer ให้กระตุ้นการทำงานทุกๆ 100 millisecond.
  21.     ' / นั่นก็คือ ทุกๆ 100 ms. จะมีการกระตุ้นการทำงานในส่วนการรับข้อมูล MSComm1_OnComm
  22.     Timer1.Interval = 100
  23.     ' / ตั้งรูปแบบ ListView
  24.     With lvwData
  25.         .ListItems.Clear
  26.         .View = lvwReport
  27.         ' / ตั้งค่า ListView แสดงผล
  28.         .ColumnHeaders.Add 1, , "Item", 800
  29.         .ColumnHeaders.Add 2, , "Tag ID", .Width \ 2 - 630
  30.         .ColumnHeaders.Add 3, , "วันที่ - เวลา การอ่านข้อมูล", .Width \ 2 - 500
  31.     End With

  32. End Sub

  33. ' / --------------------------------------------------------------------------------
  34. ' / ตั้งค่าเริ่มต้นให้กับ Port ก่อน
  35. Function InitializePort() As Boolean
  36. ' / ผมทำเป็นฟังค์ชั่น (เสมอ) เพราะบางครั้งก่อนทำงานจริงต้องตรวจสอบความพร้อม ...
  37. ' / ของพอร์ทที่ใช้งานด้วย หาก Return ค่ากลับเป็น False ก็ต้องหยุดการทำงานไว้ก่อน
  38. ' / --------------------------------------------------------------------------------
  39. On Error GoTo ErrHandler
  40.    
  41.     With MSComm1
  42.         ' / ทดสอบก่อนว่า Port เปิดใช้งานหรือไม่ หากเปิดไว้ก็ให้ปิด Port ก่อน
  43.         If .PortOpen Then .PortOpen = False
  44.         
  45.         ' / ตั้งค่า Port ที่ต้องการ
  46.         .CommPort = 1
  47.         
  48.         ' / ตั้งค่า Baud Rate, Parity, Data Bits, Stop Bits (Standard)
  49.         .Settings = "9600,N,8,1"
  50.         
  51.         ' / ตั้งสถานะในการ Hand Shaking ของ DTR and RTS (การตรวจสอบความถูกต้องการรับ - ส่ง)
  52.         '.DTREnable = True
  53.         '.RTSEnable = True
  54.         ' / ========================================
  55.         ' / สั่งให้ Enabled เหตุการณ์ในการรับข้อมูลทุกๆ Character
  56.         .RThreshold = 1
  57.         ' / ========================================
  58.         ' / Disable เมื่อส่ง Characters
  59.         '.SThreshold = 0
  60.         
  61.         ' / เปิด Port
  62.         .PortOpen = True
  63.         InitializePort = True
  64.    
  65.     End With

  66. ExitProc::
  67.     Exit Function
  68.    
  69. ErrHandler:
  70.     MsgBox Err.Number & " : " & Err.Description
  71.     InitializePort = False
  72.    
  73. End Function

  74. ' / --------------------------------------------------------------------------------
  75. ' / เหตุการณ์เกิดการรับข้อมูลเข้ามาผ่านทาง Serial Port - COM ในลักษณะของ Interrupt
  76. Private Sub MSComm1_OnComm()
  77. ' / --------------------------------------------------------------------------------
  78.    
  79.     With MSComm1
  80.         ' / ทดสอบเกิดเหตุการณ์เข้ามาของข้อมูล (Received)
  81.         Select Case .CommEvent
  82.             Case comEvReceive   ' หรือ มีค่าเท่ากับ 2
  83.                
  84.                 ' / แสดงข้อมูล เมื่อมีการรับข้อมูลเข้ามา
  85.                 txtTagID.Text = txtTagID.Text & MSComm1.Input
  86.    
  87.         End Select
  88.         
  89.     End With

  90. End Sub

  91. ' / --------------------------------------------------------------------------------
  92. ' / การนำมาใช้ใน Timer เพราะจังหวะของการอ่านมันคงที่กว่าครับ
  93. Private Sub Timer1_Timer()
  94. ' / --------------------------------------------------------------------------------
  95.     ' ตัวแปรรับค่า Tag ID จาก TextBox
  96.     Dim TagID As String
  97.    
  98.     ' ประกาศตัวแปรสำหรับ ListItem ที่ต้องใช้งานใน ListView
  99.     Dim LV As ListItem
  100.    
  101.     ' ดัก Error กรณีการอ่านผิดพลาด จะทำให้อ่านข้อมูลเข้ามาไม่ครบ ก็ให้จบออกไปก่อน
  102.     'If Len(txtTagID.Text) < 16 Then
  103.     '    txtTagID.Text = ""
  104.     '    Exit Sub
  105.     'End If
  106.    
  107.     ' เริ่มต้นนำข้อมูลไปแสดงลงใน ListView
  108.     If Len(txtTagID.Text) > 0 And Len(txtTagID.Text) = 16 Then
  109.         
  110.         TagID = txtTagID.Text
  111.         
  112.         ' / ตรวจสอบค่า Tag ID จากตารางข้อมูล
  113.         Set RS = New Recordset
  114.         Statement = "SELECT * FROM tblContact WHERE RFID = " & "'" & Mid$(Trim(TagID), 2, Len(TagID) - 4) & "'"
  115.         RS.CursorLocation = adUseClient
  116.         ' / กำหนดให้อ่านเดินหน้าอย่างเดียว
  117.         RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
  118.         ' / หากพบข้อมูล Tag ID
  119.         If RS.RecordCount > 0 Then
  120.             '/ ตรวจสอบว่ามีการเก็บตำแหน่งภาพหรือไม่
  121.             '/ กรณีนี้ ไม่มีข้อมูล
  122.             If IsNull(RS("PictureName")) Or Trim(RS("PictureName")) = "" Then
  123.                 '/ นำภาพอะไรก็ได้ มาแสดงให้ผู้ใช้งานเห็นว่าข้อมูลนี้ไม่มีการจัดเก็บภาพไว้
  124.                 Image1.Picture = LoadPicture(App.Path & "\Images" & "NoPicture.jpg")
  125.                
  126.             ' / นำตำแหน่งภาพมาทำการแสดงผล
  127.             ' / แต่ปัญหามันจะเกิดขึ้นในวันข้างหน้า หากหาไฟล์ภาพที่ระบุไม่เจอ ทางแก้ก็คือเขียนโค้ดดัก Error
  128.             Else
  129.                 If Dir(App.Path & "\Images" & Trim(RS("PictureName"))) <> "" Then
  130.                     Image1.Picture = LoadPicture(App.Path & "\Images" & RS("PictureName"))
  131.                 Else
  132.                     Image1.Picture = LoadPicture(App.Path & "\Images" & "NoPicture.jpg")
  133.                 End If
  134.             End If
  135.             RS.Close:    Set RS = Nothing
  136.             
  137.             ' / เริ่มต้นนำข้อมูลไปแสดงผลลงใน ListView
  138.             ' / ให้เกิดมีลำดับที่ สำหรับหลักแรก (Index = 0)
  139.             Set LV = lvwData.ListItems.Add(, , lvwData.ListItems.Count + 1)
  140.             
  141.             ' รูปแบบที่ปรากฏใน TextBox ===> [1C006082946A[ <===
  142.             ' แต่แท้จริงแล้ว ข้อมูลจะอยู่ในรูปแบบรหัส ASCII ดังนี้
  143.             ' <02>1C006082946A<0D><0A><03>
  144.             ' <02> บ่งบอกจุดเริ่มต้นของข้อมูล (STX - Start of Text)
  145.             ' <0D> หรือ 13 (ฐาน 10) คือ กดปุ่ม Enter (Carriage Return)
  146.             ' <0A> หรือ 10 (ฐาน 10) คือ Line Feed (ขึ้นบรรทัดใหม่)
  147.             ' <03> บ่งบอกจุดสิ้นสุดของข้อมูล (ETX - End of Text)
  148.             
  149.             ' / ผมใช้วิธีการนับเริ่มจากหลักที่ 2 และนับไปตามความยาวของ TagID (16 ตัว) - 4
  150.             LV.SubItems(1) = Mid$(TagID, 2, Len(TagID) - 4)
  151.             
  152.             ' / เก็บค่าวันที่ และ เวลา
  153.             LV.SubItems(2) = Now()
  154.             
  155.             ' ===================== ตำแหน่งนี้ ==================
  156.             ' ====== สามารถบันทึกลงฐานข้อมูลได้ หรือ สั่งให้อุปกรณ์ทำงาน ====
  157.         
  158.         '/ เมื่อไม่พบข้อมูล
  159.         Else
  160.             ' / เคลียร์ภาพ
  161.             Set Image1 = Nothing
  162.         
  163.         End If
  164.     End If
  165.    
  166.     ' เคลียร์ค่าการรับข้อมูล
  167.     txtTagID.Text = ""

  168. End Sub

  169. Private Sub Form_Unload(Cancel As Integer)
  170.     If MSComm1.PortOpen Then MSComm1.PortOpen = False
  171.     Call CloseDataBase
  172.     Set frmRFID = Nothing
  173.     End
  174. End Sub

  175. Private Sub cmdClear_Click()
  176.     lvwData.ListItems.Clear
  177.     txtTagID.Text = ""
  178.     txtTagID.SetFocus
  179.     Set Image1.Picture = Nothing
  180. End Sub

  181. Private Sub cmdExit_Click()
  182.     Unload Me
  183. End Sub

  184. Private Sub Form_Resize()
  185.     On Error Resume Next
  186.     If Me.WindowState = vbMinimized Then Exit Sub
  187.     ' ความกว้าง
  188.     If Me.Width < 8730 Then
  189.         Me.Width = 8730
  190.        Exit Sub
  191.     End If
  192.     ' ความสูง
  193.     If Me.Height < 5865 Then
  194.         Me.Height = 5865
  195.         Exit Sub
  196.     End If
  197.     ' การคำนวณหาระยะการย่อ ขยายของฟอร์ม
  198.     fraData.Move 0, 0, Me.ScaleWidth - cmdClear.Width - cmdExit.Width - 60, Me.ScaleHeight
  199.     lvwData.Move 30, 870, fraData.Width - 60, fraData.Height - 930
  200.     cmdClear.Move fraData.Width + 15, 90
  201.     cmdExit.Move cmdClear.Left + cmdClear.Width + 30, 90
  202.     Image1.Left = fraData.Width + 15
  203. End Sub
คัดลอกไปที่คลิปบอร์ด


ดาวน์โหลดโค้ดต้นฉบับแบบเต็มได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-27 22:39 , Processed in 0.314186 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้