หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 2 6 3 5 7 9

7 ธันวาคม พ.ศ.2549
1298 Users On-Line.
Visitors - Page views
 8 5 9 0 3 0 5
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

RFID และ การติดต่อฐานข้อมูล ด้วย VB6 ภาค 2 (การอ่านข้อมูล)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 1/12/2552   เวลา: 14:47
(อ่าน : 32524) 
เวลามันช่างผ่านไปอย่างรวดเร็วจริงๆเลยพ่อคุณ แม่คุณเอ๋ย ... เทคโนโลยีที่ก้าวล้ำนำหน้า ข้อมูล ข่าวสาร ความรู้ต่างๆ ส่งมาหาได้ถึงเตียงนอนกันเลยทีเดียว แต่ทว่าความรู้ในหลายสิ่งหลายอย่าง กลับยังคงถูกปิดกั้นเอาไว้ ... ยิ่งกว่าในอดีตนับสิบกว่าปีที่ผ่านมา เพราะเมื่อก่อนการเสาะแสวงหาข้อมูล มันค่อนจะข้างหากันลำบาก ใครจะเก่ง ใครจะฝีมือ ก็ล้วนแล้วแต่มาจากการมุ่งมั่น ฝึกฝน ด้วยตัวเอง กันทั้งนั้น ... ดูจากโฆษณาเหล้า ... "คนไทยถ้าตั้งใจทำอะไร ก็ไม่แพ้ชาติใดในโลก" ... ผมไม่รู้น่ะว่าคนคิดโฆษณานี้ เขามีอะไรแอบแฝงแนวคิดไว้อยู่หรือเปล่า อ้าวววว ... มองบวก คนไทยก็เก่งไม่แพ้ชาติอื่นหรอก แต่ลอง มองกลับ ซิครับ ... คนไทยไปสู้ชาติอื่นเขาไม่ได้ ก็เพราะคนไทยไม่ได้ตั้งใจนี่หว่า ... ขำมั้ยล่ะ ... พี่น้อง ... หุหุหุหุหุ ... แต่ที่แน่ๆสำหรับผม "โค้ดไทย ซอฟท์แวร์ไทย ไม่ไปนอก (โว้ย)"

  • สรุปเรื่อง RFID แบบง่ายๆ (อีกรอบ) ... เราต้องนำ Tag (เช่น บัตรนักศึกษา) ไปวางไว้ใกล้ๆกับรัศมีการทำงานของตัวอ่าน (Reader) เพื่อสร้างสนามแม่เหล็กไฟฟ้า (หรือพลังงานให้กับ Tag) เพื่อที่ Reader จะสามารถอ่านข้อมูลที่อยู่ใน Tag ออกมาได้ จากนั้นตัว Reader เองก็จะส่งข้อมูลแบบอนุกรมไปให้กับคอมพิวเตอร์ ผ่านทาง Serial Port (หรือ COM Port นั่นเอง) ... ส่วนของคอมพิวเตอร์ก็จะนำข้อมูลที่ได้ ไปประมวลผลต่อไป เช่น ค้นหาข้อมูลใน DataBase ว่ารหัสอันนี้น่ะ มันมีอยู่ในระบบหรือไม่ ... จบ
    เคยบอกไปแล้วว่าผมไม่ใช่นักวิชาเกิน เอ้ย วิชาการ ... 55555+ ...
  • แนวทางในการเขียนโปรแกรม (จากภาค 1)

        มุมมองในการเขียนโปรแกรมเพื่อทำการอ่านข้อมูล ในภาษา Basic
      • เนื่องจากว่า Tag ID นี้มันราคาถูก และ จัดเก็บข้อมูลในลักษณะของบาร์โค้ด 1 มิติ หรือ มองกันให้ง่ายๆ คือ มันมีข้อมูลอยู่ชุดเดียว
      • ข้อมูลที่อ่านได้ทั้งหมด คือ <02>1C006082946A<0D><0A><03> ... สังเกตว่ามีความยาว 16 ไบต์ (หรือ 16 ตัวอักขระ)
      • แต่ข้อมูลที่เราต้องการจริง คือ 1C006082946A ขนาด 12 ไบต์ โดยไม่ต้องตรวจสอบความถูกต้อง (CHECK SUM) ... ซึ่งสามารถอ่านข้อมูลได้ตั้งแต่หลักที่ 2 และนับไปทางขวามือเพิ่มอีก 11 ตัว (รวมเป็น 12 ตัว)
      • ดังนั้นในการเขียนด้วย Visual Basic 6 ผมจึงไม่ใช้วิธีการแยกส่วน DATA ออกมาจากรหัส CR และ LF แต่ใช้วิธีการนับความยาวของ INPUT ทั้งหมดเอา

        ทั้งนี้ และ ทั้งนั้น ก็ต้องศึกษาจากอุปกรณ์ที่คุณใช้งานกันอยู่ด้วยน่ะครับ เพราะการเก็บข้อมูลใน Tag ID นั้นมันไม่เหมือนกัน

       
    ดาวน์โหลด
    ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
     ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
     ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
     ดาวน์โหลด Microsoft Visual Basic Service Pack 6
    ข้อมูลเพิ่มเติม
    RFID และ การติดต่อฐานข้อมูล ด้วย VB6 ภาค 1 (ทฤษฎี และ รูปแบบข้อมูล)
    โค้ดและแนวคิดการแปลงเลขฐาน 10 เป็นฐาน 2 เรื่องหมูๆ ... ไม่บอกก็แทบจะไม่รู้กันเลย
    การแปลงเลขฐาน 10 เป็นเลขฐาน 16 และ เลขฐาน 2 เป็นเลขฐาน 16 (แนวคิดของช่าง)

    Projects --> Components


    Tools - เลือก Component ที่ใช้งาน


    Design Time


    Run Time

    โค้ดโปรแกรม Visual Basic 6 กับการอ่านค่า Tag
    เหตุการณ์ที่สำคัญในการรับข้อมูลเข้ามา คือ MSComm1_OnComm() ... เนื่องจากเราอาศัยการเกิด Interrupt (ขัดจังหวะการทำงานของ CPU) ดังนั้นโปรแกรมสามารถ Minimized หรือ ซ่อนไว้ใน System Tray ได้ ... เมื่อมีข้อมูลเข้ามา โปรแกรมจะทำการอ่านค่า หรือ ทำงานโดยอัตโนมัติ
    
    Option Explicit
    
    Private Sub Form_Load()
        
        Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
        
        ' ตั้งค่าเพื่อทดสอบ ID ขนาดข้อมูลความยาว 16 หลัก กรณีที่ไม่มีชุด RFID ทดสอบ
        ' หรือ พิมพ์ชุดข้อมูลใน Notepad ก่อน แล้ว Copy ไปวางใส่ในช่อง TextBox ก็ได้ครับ
        txtTagID.Text = "x1234567890ABxxx"
        ' ก็ผมบอกแล้วไงว่าไม่ต้องมี RFID ก็สามารถเรียนรู้การทำงานได้ ... 55555+
        
        ' กรณีมีชุดทดสอบ ต้องเคลียร์ค่าว่างเปล่าน่ะครับ
        ' 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 ในการแสดงผล 3 Columns
            .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
            
            ' ตั้งค่า COM Port ที่ต้องการ
            .CommPort = 1
            
            ' ตั้งค่า Baud Rate, Parity, Data Bits, Stop Bits
            .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
                    
                    ' แสดงข้อมูล เมื่อมีการรับข้อมูลเข้ามา
                    ' ลำพังแค่อาศัยการ Interrupt ... จะพบปัญหา Error บ่อยครั้ง ผมจึงใช้ Timer เข้าช่วยอีกที
                    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 กรณีการอ่านผิดพลาด จะทำให้อ่านข้อมูลเข้ามาไม่ครบ
        ' ความยาวข้อมูลมากกว่า 0 และ ต้องเท่ากับ 16 หลัก เท่านั้น
        If Len(txtTagID.Text) > 0 And Len(txtTagID.Text) = 16 Then
        
            ' โยกย้ายค่าจาก TextBox ไปไว้ในตัวแปรก่อน จะดีกว่า
            TagID = txtTagID.Text
                        
            ' เริ่มต้นนำข้อมูลไปแสดงผลลงใน 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()
            
            ' ส่งเสียงทักทายหน่อยว่าข้อมูลถูกต้องแล้วน่ะ ...
            With MMControl1
                .Command = "Stop"
                .Command = "Close"
                .FileName = App.Path & "\Sound\RightMP3.mp3"
                .PlayEnabled = True
                .Command = "Open"
                .Command = "Play"
            End With
            
            ' ======================== ตำแหน่งนี้ ==========================
            ' ============= สามารถบันทึกลงฐานข้อมูลได้ หรือ สั่งให้อุปกรณ์ทำงาน =============
            
        End If
        
        ' เคลียร์ค่าการรับข้อมูล
        txtTagID.Text = ""
    
    End Sub
    
    ตอนนี้ที่ทดสอบส่งผ่าน Serial Port อยู่น่ะครับ ผมกำลังรอชุดอุปกรณ์ในการแปลงสัญญาณจาก RS-232 เป็น RJ-45 หรือ ส่งผ่านสาย UTP เพื่อใช้ในระบบ LAN แทนอยู่ไงล่ะครับ ทำให้ระยะทางที่ส่งข้อมูลจะได้ไกลขึ้น พร้อมๆกับต้องเชื่อมเข้าสู่ฐานข้อมูลของ Server ... แล้วจะได้มานำเสนอในครั้งต่อไป ...

    ภาค 3 ... การเชื่อมต่อระบบฐานข้อมูล


    ภาค 3 ... การเชื่อมต่อเข้าสู่ระบบฐานข้อมูล


    สถิติการเข้าออก - Logging Stat

    ภาค 4 ... การควบคุมการเข้า-ออก หรือ เปิด-ปิดประตู (Hardware)

    Conclusion:
    เห็นหรือยังล่ะครับว่าเรื่องราวของ RFID มันก็ไม่ได้เป็นเรื่องที่ยากเย็นแสนเข็ญ แต่อย่างใดเลย ... แน่นอนว่ามุมมองต่างๆของผม มันออกมาจากประสบการณ์เป็นหลักสำคัญ ผมถึงได้มีเรื่องราวต่างๆมากมาย ที่ได้นำมาเสนอผ่านเว็บไซต์แห่งนี้นี่ไงล่ะครับพี่น้อง ... ขอร้องครับ อย่ามองว่านี่มันเป็นแค่ระดับ Assignment เพราะมันสามารถนำไปประยุต์ใช้งานได้มากมาย แค่อุปกรณ์ราคาไม่กี่พันบาท (ค่าเหล้าของผม แบบเมาได้หลายตลบเลยน่ะเนี่ย ... 55555+) ... เอาไปทำการบันทึกข้อมูลการเข้าออกห้อง LAB เพื่อขังนักศึกษาดีมั้ย 55555+ ... โดยอาศัยอินฟราเรดเข้ามาช่วย จะได้รู้การเข้า การออก และจำนวนคนที่อยู่ในห้อง ... 55555+ ... รอบหน้าพบกับการประยุกต์เข้าสู่ระบบฐานข้อมูลครับ ... (โดนใจสาย Hardware แน่ๆ ... เหอๆๆๆๆ)

  • จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
    เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
    CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
    Email: [email protected] หรือ โทร. 08-6862-6560