 |
|
การรับข้อมูลผ่านทาง Rs232 ข้อมูลถูกแบ่งย่อยออกจากกัน ไม่ได้มาทีเดียว |
|
 |
|
|
 |
 |
|
จากประสบการณื การเขียน rs232 อย่าบัค ช่วง event การส่งครับ มันไปขัดจังหวะการรับ
ทำให้ข้อมูลได้มาไม่ครบ มันจะไปค้างอยู่ใน buffer ครับ พอกด trace ที่ค้างใน buffer ก้จะส่งมาทั้งหมดครับ
ให้บักช่วงรับข้อมูลเสร็จแล้วครับ
|
 |
 |
 |
 |
Date :
2014-06-24 16:35:49 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จากโค้ดด้านบนนี้ผมต้องดักรับค่าตรงไหนที่มันจะส่งข้อมูลมาแบบสมบูรณ์แล้วครับ
รบกวนช่วยแนะนำทีครับ
|
 |
 |
 |
 |
Date :
2014-06-25 09:18:44 |
By :
yochitaro |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
กำหนด บิทเรท ไว้เท่าไหร่น๊าา 9600 หรือป่าว
อีกอย่างผมจำไม่ได้ว่ามันเรียกว่าอะไร ต้องลง เช็ค การยิง ค่าใส่โปรแกรม เทอมินอล ก่อนนะ
แล้วดู ค่า ว่าส่งเป็น 0D และ 0A หรือป่าว
|
 |
 |
 |
 |
Date :
2014-07-01 17:02:16 |
By :
ต๋องคับ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
BaudRate 9600 ครับ
เวลาลองรันแล้วข้อมูลมันออกมาถูกต้องครับ แต่มันแยกกันมาครับ เช่นข้อมูลที่ส่งมาเป็น 1234567890 แต่ข้อมูลถูกส่งออกมาสองรอบครับ อาจจะเป็น 123 แล้วก็ 4567890 หรือ 1 แล้วก็ 234567890
ปัญหาของผมคือต้องการจะดักข้อมูลทั้งก้อนที่ส่งมา เอามาเปรียบเทียบกับดาต้าที่กำหนดไว้ครับ
|
 |
 |
 |
 |
Date :
2014-07-04 13:26:46 |
By :
yochitaro |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ดูจากโค๊ดแล้วไม่จำเป็นต้อง 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อ้อเข้าใจแล้วครับ
คือ 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตามโค้ดของคุณพี่ด้านบน ต้องสั่งเปิดปิด port ตลอดเลยหรอครับ
มันจะมีผลเรื่องเวลาไหมครับ เพราะดาต้าที่วิ่งเข้ามา 1 นาทีก็อย่างน้อย 200 ชุดครับ
|
 |
 |
 |
 |
Date :
2014-07-07 10:10:58 |
By :
yochitaro |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ก็ไม่ต้องก็ได้ครับ แต่ ก็ สร้างตัวแปร ไว้ตัวหนึ่ง เป็น 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หรือ อีกอย่าง โปรแกรมส่ง ก็ส่งตัวคั่นมาด้วยว่าหมด ข้อมูลแค่นี้
|
 |
 |
 |
 |
Date :
2014-07-07 11:26:07 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณมากเลยครับ เด๋วผมขอลองดูก่อนนะครับ
|
 |
 |
 |
 |
Date :
2014-07-07 11:28:10 |
By :
yochitaro |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมลองแล้วครับ ถ้ามันสิ้นสุดข้อมูลแล้วมันก็ไม่เข้าเงื่อนไข chkEof= true ครับ
|
 |
 |
 |
 |
Date :
2014-07-07 16:05:30 |
By :
yochitaro |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|