Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > .NET Framework > Forum > การรับข้อมูลผ่านทาง Rs232 ข้อมูลถูกแบ่งย่อยออกจากกัน ไม่ได้มาทีเดียว



 

การรับข้อมูลผ่านทาง Rs232 ข้อมูลถูกแบ่งย่อยออกจากกัน ไม่ได้มาทีเดียว

 



Topic : 109442



โพสกระทู้ ( 15 )
บทความ ( 0 )



สถานะออฟไลน์




เคยได้ฌค้ดการรับข้อมูลผ่าน Rs232 จากในเวปนี้ครับ

Code (VB.NET)
Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports
Public Class Form1
    Dim myPort As Array
    Delegate Sub SetTextCallback(ByVal [int] As String)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myPort = IO.Ports.SerialPort.GetPortNames()
        postComboBox1.Items.AddRange(myPort)
    End Sub

    Private Sub addbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles addbutton.Click
        SerialPort1.PortName = postComboBox1.Text
        SerialPort1.BaudRate = baudComboBox2.Text
        SerialPort1.Open()

        addbutton.Enabled = False

        closebutton.Enabled = True

    End Sub

    Private Sub closebutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles closebutton.Click
        SerialPort1.Close()
        addbutton.Enabled = True
        closebutton.Enabled = False

    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        ReceivedText(SerialPort1.ReadExisting())
    End Sub
    Private Sub ReceivedText(ByVal [text] As String)
        If Me.inputTextBox2.InvokeRequired Then
            Dim x As New SetTextCallback(AddressOf ReceivedText)
            Me.Invoke(x, New Object() {(text)})
        Else

            Me.inputTextBox2.Text &= [text]

            


        End If
    End Sub


End Class



มันใช้งานได้ แต่!!!

สมมุติ ข้อมูลที่ส่งออกมาคือ 1234567890
แต่ผมลอง Debug ดูการรันโปรแกรมรับข้อมูลกลายเป็นว่า ข้อมูลถูกส่งแบบแบ่งข้อมูลแต่ก็ยังรวมเป็นข้อมูลเดิมเช่น
รอบแรกส่งมา 12 รอบที่สองส่ง 34567890 หรือ
รอบแรกส่งมา 1 รอบที่สองส่ง 234567890 หรือ
รอบแรกส่งมา 123 รอบที่สองส่ง 4567890
คือผมอยากข้อมูลออกมาชุดเดียวแล้วผมจะเอาข้อมูลชุดนั้นไปเปรียบเทียบอีกทีว่าข้อมูลที่ส่งมาตรงกับข้อมูลที่คีย์ไว้ในคอมหรือไม่ครับ



Tag : .NET, VB.NET







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2014-06-24 16:19:28 By : yochitaro View : 2034 Reply : 11
 

 

No. 1



โพสกระทู้ ( 9,559 )
บทความ ( 2 )



สถานะออฟไลน์


จากประสบการณื การเขียน rs232 อย่าบัค ช่วง event การส่งครับ มันไปขัดจังหวะการรับ
ทำให้ข้อมูลได้มาไม่ครบ มันจะไปค้างอยู่ใน buffer ครับ พอกด trace ที่ค้างใน buffer ก้จะส่งมาทั้งหมดครับ
ให้บักช่วงรับข้อมูลเสร็จแล้วครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-24 16:35:49 By : Chaidhanan
 


 

No. 2



โพสกระทู้ ( 15 )
บทความ ( 0 )



สถานะออฟไลน์


จากโค้ดด้านบนนี้ผมต้องดักรับค่าตรงไหนที่มันจะส่งข้อมูลมาแบบสมบูรณ์แล้วครับ

รบกวนช่วยแนะนำทีครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-25 09:18:44 By : yochitaro
 

 

No. 3



โพสกระทู้ ( 66 )
บทความ ( 0 )



สถานะออฟไลน์


กำหนด บิทเรท ไว้เท่าไหร่น๊าา 9600 หรือป่าว
อีกอย่างผมจำไม่ได้ว่ามันเรียกว่าอะไร ต้องลง เช็ค การยิง ค่าใส่โปรแกรม เทอมินอล ก่อนนะ
แล้วดู ค่า ว่าส่งเป็น 0D และ 0A หรือป่าว
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-01 17:02:16 By : ต๋องคับ
 


 

No. 4



โพสกระทู้ ( 15 )
บทความ ( 0 )



สถานะออฟไลน์


BaudRate 9600 ครับ
เวลาลองรันแล้วข้อมูลมันออกมาถูกต้องครับ แต่มันแยกกันมาครับ เช่นข้อมูลที่ส่งมาเป็น 1234567890 แต่ข้อมูลถูกส่งออกมาสองรอบครับ อาจจะเป็น 123 แล้วก็ 4567890 หรือ 1 แล้วก็ 234567890

ปัญหาของผมคือต้องการจะดักข้อมูลทั้งก้อนที่ส่งมา เอามาเปรียบเทียบกับดาต้าที่กำหนดไว้ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-04 13:26:46 By : yochitaro
 


 

No. 5



โพสกระทู้ ( 9,559 )
บทความ ( 2 )



สถานะออฟไลน์


ดูจากโค๊ดแล้วไม่จำเป็นต้อง debug เลยนี่ครับ

ข้อมูลสุดท้าย ส่งไปที่ ReceivedText

น่าจะมาร์คตรง Me.inputTextBox2.Text แต่มันก็ไม่ได้ประโยชน์แล้วครับ

ก็อย่างที่ผมบอกไป rs232 มันมาเป็น Stream พอไปขั้นจังหวะมัน ด้วย mark procedure
stream มันก็วิ่งเข้า buffer ครับ พอ trace ต่อ มันก็ส่งทุกอย่างออกมาหมด

ไม่สามารถหยุดการส่งได้ครับ
เราเอามาได้แค่ผลลัพธ์ที่มันส่งมาทั้งหมด ได้เท่านั้นครับ


ประวัติการแก้ไข
2014-07-04 14:13:46
2014-07-04 14:23:58
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-04 14:11:24 By : Chaidhanan
 


 

No. 6



โพสกระทู้ ( 9,559 )
บทความ ( 2 )



สถานะออฟไลน์


อ้อเข้าใจแล้วครับ

คือ rs232 มันไม่มีตัวเช็คข้อมูลสุดท้ายครับ
และเนื่องจากมันเป็น stream มาต่อเนื่องคงต้องเช็คแบบนี้ครับ
Code (VB.NET)
    Private Sub ReceivedText(ByVal [text] As String)
        If Me.inputTextBox2.InvokeRequired Then
            Dim x As New SetTextCallback(AddressOf ReceivedText)
            Me.Invoke(x, New Object() {(text)})
        Else
            If [text] > "" Then
                Me.inputTextBox2.Text &= [text]
            Else
                SerialPort1.Close()
            End If
        End If
    End Sub


และ ใน sub นี้
Code (VB.NET)
   Private Sub SerialPort1_DataReceived( ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived   
        ReceivedText(SerialPort1.ReadExisting())
        If Not SerialPort1.IsOpen Then
            'Do other method
        End If

    End Sub

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-04 14:53:30 By : Chaidhanan
 


 

No. 7



โพสกระทู้ ( 15 )
บทความ ( 0 )



สถานะออฟไลน์


ตามโค้ดของคุณพี่ด้านบน ต้องสั่งเปิดปิด port ตลอดเลยหรอครับ

มันจะมีผลเรื่องเวลาไหมครับ เพราะดาต้าที่วิ่งเข้ามา 1 นาทีก็อย่างน้อย 200 ชุดครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-07 10:10:58 By : yochitaro
 


 

No. 8



โพสกระทู้ ( 9,559 )
บทความ ( 2 )



สถานะออฟไลน์


ก็ไม่ต้องก็ได้ครับ แต่ ก็ สร้างตัวแปร ไว้ตัวหนึ่ง เป็น indicator ให้รู้ว่ามันสินสุดแล้ว

Code (VB.NET)
Dim chkEof As Boolean   'ถ้าประกาศตัวแปรผิด ก็แก้ไขหน่อยครับ ไม่ได้ใช้นานแล้ว

Private Sub ReceivedText(ByVal [text] As String)
    If Me.inputTextBox2.InvokeRequired Then
        Dim x As New SetTextCallback(AddressOf ReceivedText)
        Me.Invoke(x, New Object() {(text)})
    Else
        If [text] > "" Then
            Me.inputTextBox2.Text &= [text]
            chkEof = false
        Else
            chkEof= true; 'SerialPort1.Close()
        End If
    End If
End Sub

Private Sub SerialPort1_DataReceived( ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived   
     ReceivedText(SerialPort1.ReadExisting())
     If chkEof Then
         'Do other method
         chkEof = false;
     End If

 End Sub



ประวัติการแก้ไข
2014-07-07 11:12:44
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-07 11:12:09 By : Chaidhanan
 


 

No. 9



โพสกระทู้ ( 9,559 )
บทความ ( 2 )



สถานะออฟไลน์


หรือ อีกอย่าง โปรแกรมส่ง ก็ส่งตัวคั่นมาด้วยว่าหมด ข้อมูลแค่นี้
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-07 11:26:07 By : Chaidhanan
 


 

No. 10



โพสกระทู้ ( 15 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบคุณมากเลยครับ เด๋วผมขอลองดูก่อนนะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-07 11:28:10 By : yochitaro
 


 

No. 11



โพสกระทู้ ( 15 )
บทความ ( 0 )



สถานะออฟไลน์


ผมลองแล้วครับ ถ้ามันสิ้นสุดข้อมูลแล้วมันก็ไม่เข้าเงื่อนไข chkEof= true ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-07 16:05:30 By : yochitaro
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : การรับข้อมูลผ่านทาง Rs232 ข้อมูลถูกแบ่งย่อยออกจากกัน ไม่ได้มาทีเดียว
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่