einfaches Auslesen Von Daten am RS232

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von VB-Robo.

    einfaches Auslesen Von Daten am RS232

    Hallo.

    kurz zu meinem Vorhaben:
    Ich habe eine Schaltung entwickelt mit der ich verschiedene Daten mit einem µC an meinem Motorrad messe. Jede Information ist 1Byte

    Problem:
    Dieses vorerst eine Byte möchte ich via RS232 einfach zu meinem PC schicken, das funzt auch soweit, ich weiß nur nicht wie ich das am PC dann mit VB 2010 auslesen kann.

    Ich habe das tool Serialport bereits gefunden, aber ich weiß nicht welche Befehle ich nutzen muss um das ganze dann auch auszulesen und in eine Variable zu schreiben.

    Den lieben Herrn Google und co. hab ich schon befragt aber ich versteh meistens nich was die wollen, weil die Programme meist viel umfangreicher sind.

    Kann mir jemand einen Codeausschnitt zeigen in dem soetwas realisiert ist oder die nötigen Befehle dazu nennen.
    Ich hab auch ne ganze Menge VB2008-kram gefunden aber das ist ja wieder bissel anders als 2010, da bin ich leider auch nicht durchgestiegen.

    Leider bin ich noch ein ziemlicher anfänger was VB angeht...

    vielen dank für mögliche antworten
    Beispiele um Daten per RS232 zu empfangen gibt es hier viele. Evtl. mal nach Com-Port statt RS232 suchen. Das 1 Byte wird wohl so nicht ausreichen. Die Übertragung müsste synchronisiert werden. Probleme können auch bei einem Wert 0 auftreten. Wenn Du es richtig machen möchtest, dann schicke (wie ursprünglich vorgesehen) Text über die Schnittstelle. Z.B. "U12.6" Da kann man am U erkennen, dass es um die Spannung geht und die Werte danach lassen sich einfach in Zahlenwerte umwandeln und man (die Software) kann sofort erkennen, wenn mehrere Werte hinereinander kommen, an welcher Stelle der "Sender" gerade ist.

    Im Prinzip arbeite ich immer so:

    Prüfen, ob Daten im Empfangsbuffer (Buffer größer 0) sind. Wenn ja diese an einen Dateneingangsstring hängen. Dann prüfen, ob CHR(13) darin vorkommt. Wenn ja, alle Daten bis dahin in einen Abarbeitungspuffer kopieren und aus dem Dateneingangsstring entfernen. Dann den Abarbeitungspuffer abarbeiten, leeren und wieder von Vorne.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    leider klappt das scheinbar noch nciht so .
    also mein pic sendet mir ein "B"

    aber VB kriegt nicht mit das da was ankommt.

    Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)



    ist das der richtige code um so ein Ereignis am Serial Port auszulösen?

    muss ich vorher noch irgendwas importieren.
    bei mir hab ich da bis jetzt nur diese zwei sachen




    Quellcode

    1. Imports System.Text
    2. Imports System.IO.Ports



    hier mal der ganze code für das empfangen

    Quellcode

    1. Public daten, t_zahl As Byte
    2. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
    3. t_zahl = t_zahl + 1
    4. If t_zahl = 100 Then t_zahl = 0
    5. lblZeitanzeige.Text = "5" 'sollte nur zur Kontrolle sein ober er Überhaupt hierrein geht
    6. byteeinlesen()
    7. lblZahl.Text = daten
    8. End Sub
    9. Private Sub byteeinlesen()
    10. daten = SerialPort1.ReadByte()
    11. End Sub


    besten dank für die hilfe
    Hallo,

    ich habe bezüglich VB.net keine Erfahrungen mit RS232. Unter VB6 jedoch läuft es sehr zuverlässig, wenn ich regelmäßig (per Timer) prüfe, ob der Buffer größer 0 ist und dann in die Sub springe. Das Event Data_received oder so ähnlich wurde bei mir damals auch nciht zuverlässig ausgelöst. Seit dem nutze ich die Timervariante. Möglich, dass dieses Event erst auslöst, wenn der Buffer voll ist, eine bestimmte Anzahl an Zeichen enthält oder ein CR (ASC 13) empfangen wurde.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Obbedair schrieb:

    leider klappt das scheinbar noch nciht so .
    also mein pic sendet mir ein "B"

    aber VB kriegt nicht mit das da was ankommt.



    Threshold auf 1 ,damit bei jeden Byte ein Event ausgelöst wird.

    Die Variable daten,lies einmal im Timer Event in eine Textbox ein.
    Willst du die Variable z.B. direkt in eine Textbox einlesen,wirst du nichts sehen,
    oder du mußt mit Delegaten arbeiten.

    MfG
    jippi es funzt:-)

    ich hab im internet noch einen anderen quellcode gefunden

    trotzdem musste ich aber auch threshold auf meine anzahl an bytes einstellen damit das ereignis auch richitg ausgelöst wird

    hier noch mal der quellcode den ich gefunden hab und mit dem es auf anhieb geklappt hat. muss mich da nur noch richitg durchfuchsen damit ich´s vielleicht auch mal versteh:-)

    trotzdem einen großen dank an alle

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ByteIn(255) As Byte
    3. Private count, bytesImBuffer As Integer
    4. Private angeforderteBytes As Integer = 10
    5. Private comOpen, Datenfehler As Boolean
    6. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    7. SerialPort1.PortName = "COM6" 'Name der RS-232 festlegen.
    8. SerialPort1.Handshake = IO.Ports.Handshake.None 'Kein Handshake
    9. SerialPort1.BaudRate = 9600 'Übertragungsrate
    10. SerialPort1.Parity = IO.Ports.Parity.None 'Keine Paritätsprüfung
    11. SerialPort1.DataBits = 8 '8 Datenbits
    12. SerialPort1.StopBits = IO.Ports.StopBits.One '1 Stoppbit
    13. SerialPort1.RtsEnable = False 'RTS-Signal deaktivieren
    14. SerialPort1.DtrEnable = False 'DTR-Signal deaktivieren
    15. SerialPort1.Open() 'Seriellen Port mit den Einstellungen
    16. comOpen = SerialPort1.IsOpen
    17. End Sub
    18. Private Sub SerialPort1_DataReceived(ByVal sender As Object, _
    19. ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
    20. Handles SerialPort1.DataReceived
    21. Timer1.Enabled = False ' Event ist angekommen, Timeout löschen
    22. bytesImBuffer = SerialPort1.BytesToRead
    23. ' Sicherheitsabfrage (kann eigentlich nicht auftreten):
    24. If bytesImBuffer < angeforderteBytes Then
    25. MsgBox(("Datenübertragungsfehler " & _
    26. angeforderteBytes - bytesImBuffer).ToString & _
    27. " Bytes verloren", _
    28. MsgBoxStyle.Critical)
    29. SerialPort1.DiscardInBuffer()
    30. Datenfehler = True
    31. Exit Sub
    32. End If
    33. SerialPort1.Read(ByteIn, 0, bytesImBuffer) ' empfangene Bytes in das Byte-Array
    34. Me.Invoke(New EventHandler(AddressOf updateData))
    35. End Sub
    36. Public Sub updateData()
    37. For i As Integer = 0 To angeforderteBytes - 1
    38. count += 1
    39. Dim _str = String.Format("{0} >> {1:X}", count, ByteIn(i))
    40. listBox1.Items.Add(_str)
    41. Next
    42. End Sub
    43. Private Sub Button1_Click(ByVal sender As System.Object, _
    44. ByVal e As System.EventArgs) Handles Button1.Click
    45. If comOpen Then
    46. SerialPort1.ReceivedBytesThreshold = angeforderteBytes
    47. SerialPort1.Write(Chr(&H14)) 'MLT-System ausgeben lassen.
    48. Timer1.Interval = 5000 'Zeitüberwachung starten
    49. Timer1.Enabled = True
    50. Datenfehler = False
    51. count = 0
    52. End If
    53. End Sub
    54. ' Datareceived event ist nach 5 sec nicht gekommen
    55. Private Sub Timer1_Tick(ByVal sender As System.Object, _
    56. ByVal e As System.EventArgs) Handles Timer1.Tick
    57. Timer1.Enabled = False
    58. Dim anzBytes As Integer = SerialPort1.BytesToRead
    59. MsgBox("Timeout Datenanfrage InputBufferlöschen", MsgBoxStyle.Critical)
    60. SerialPort1.DiscardInBuffer()
    61. Datenfehler = True
    62. End Sub
    63. End Class
    so ich will nicht extra nen neuen threat eröffnen daher schreib ich mein problem einfach hier rein.
    Und zwar will ich meinen PC mit meiner roboter steuerung (RN-Control), die ich seit letzte woche hab, über RS232 kommunizieren lassen.
    So bei der steuerung war nen Terminal Programm dabei welches meldungen die von der RN-Control gesendet wurden anzeigt.

    Aber in meinem Programm kommt irgendwie nicht alles an. nur stücke davon. wieso weis ich einfach nicht.
    kann mir da mal jemand weiter helfen? vielleicht ist es ja nur ne kleinigkeit.

    hier mein Code: (Timer steht auf 1ms)

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Dim Licht, BlLicht, IRLicht As Integer
    3. Dim DatenSenden As Boolean
    4. Dim DatenEmpfangen As String
    5. Dim AusgabeArr() As String
    6. IRAbstand1 = 0
    7. IRAbstand2 = 0
    8. UAbstand1 = 0
    9. UAbstand2 = 0
    10. DatenSenden = False
    11. MotorL = CInt(MoDrehzahl * MotorL / 100)
    12. MotorR = CInt(MoDrehzahl * MotorR / 100)
    13. If MotorL < 0 Then
    14. prbUKetteL.Value = MotorL * (-1)
    15. Else
    16. prbUKetteL.Value = MotorL
    17. End If
    18. If MotorR < 0 Then
    19. prbUKetteR.Value = MotorR * (-1)
    20. Else
    21. prbUKetteR.Value = MotorR
    22. End If
    23. Licht = Scheinwerfer
    24. BlLicht = Blinklicht
    25. IRLicht = IRStrahler
    26. DatenEmpfangen = ""
    27. 'Daten vom COM Port empfangen
    28. If SerialPort1.BytesToRead > 0 Then
    29. Do
    30. rtbFehlermeldungen.AppendText(Chr(SerialPort1.ReadByte)) 'Hier ist der Fehler
    31. rtbFehlermeldungen.ScrollToCaret()
    32. DatenEmpfangen = DatenEmpfangen & Chr(SerialPort1.ReadByte) & ";"
    33. If SerialPort1.BytesToRead = 0 Then
    34. Exit Do
    35. End If
    36. Loop
    37. If chbRNSenden.Checked = True Then
    38. 'Werte aus Ausgabe Array den einzelnen Variablen zuordnen
    39. IRAbstand1 = CInt(AusgabeArr(1))
    40. IRAbstand2 = CInt(AusgabeArr(2))
    41. UAbstand1 = CInt(AusgabeArr(3))
    42. UAbstand2 = CInt(AusgabeArr(4))
    43. Batteriestatus = CShort(AusgabeArr(5))
    44. lblTempA.Text = AusgabeArr(6)
    45. lblTempI.Text = AusgabeArr(7)
    46. rtbFehlermeldungen.Text = rtbFehlermeldungen.Text & vbNewLine & AusgabeArr(0)
    47. DatenSenden = True
    48. End If
    49. End If
    50. AusgabeArr = message.Split(CChar(";")) 'empfangenen Text trennen und in ein String-Array speichern
    51. If DatenSenden = True Then
    52. 'Daten über den COM Port RS232 an die RN-Control senden:
    53. If SerialPort1.IsOpen Then 'folgenden Code nur ausführen wenn auch eine Verbindung besteht
    54. SerialPort1.Write("Motorr" + (MotorR).ToString + Chr(13)) 'per RS232 die aktuelle Motordrehzahl für Rechten Motor senden ' " CHr(13) =Enter drücken"
    55. SerialPort1.Write("Motorl" + (MotorL).ToString + Chr(13)) 'per RS232 die aktuelle Motordrehzahl für Linken Motor senden ' " CHr(13) =Enter drücken"
    56. 'SerialPort1.Write("Licht" + (Licht).ToString + Chr(13)) 'per RS232 der Scheinwerfer an aus senden ' " CHr(13) =Enter drücken"
    57. 'SerialPort1.Write("BlLicht" + (BlLicht).ToString + Chr(13)) 'per RS232 das Blinklicht an aus senden ' " CHr(13) =Enter drücken"
    58. 'SerialPort1.Write("IRLicht" + (IRLicht).ToString + Chr(13)) 'per RS232 der IR-Strahler an aus senden ' " CHr(13) =Enter drücken"
    59. 'SerialPort1.Write("SchildH" + (SchildPosH).ToString + Chr(13)) 'per RS232 das SchildHorizontal senden ' " CHr(13) =Enter drücken"
    60. 'SerialPort1.Write("SchildV" + (SchildPosV).ToString + Chr(13)) 'per RS232 der Schild Vertikal senden ' " CHr(13) =Enter drücken"
    61. 'SerialPort1.Write("Kamerapos" + (KameraPosition).ToString + Chr(13)) 'per RS232 der Schild Vertikal senden ' " CHr(13) =Enter drücken"
    62. End If
    63. DatenSenden = False
    64. End If
    65. lblIRAbstand1.Text = IRAbstand1 & " cm"
    66. lblIRAbstand2.Text = IRAbstand2 & " cm"
    67. lblUAbstand1.Text = UAbstand1 & " cm"
    68. lblUAbstand2.Text = UAbstand2 & " cm"
    69. KameraPosition = 0
    70. SchildPosH = 0
    71. SchildPosV = 0
    72. MotorL = 0
    73. MotorR = 0
    74. End Sub


    Eigenschaften des SerialPorts am PC:
    der Serial Port im PC-Programm hat folgende Eigenschaften:
    Baudrate 9600
    DataBits 8
    DiscardNull: falls
    DtrEnable False
    Generate Merr True
    Handshake None
    Parity None
    Parity Replace 63
    Port Name COM1
    ReadBufferSize 4096
    ReadTimeout -1
    RecivedByte 1
    RtsEnable False
    StoptBits one
    das soll ankommen:
    "Dies Ist Ein Test"
    20
    10
    500
    100
    11
    2
    20
    Programm abgebrochen
    Das kommt an:
    De s i et
    0
    0
    0
    10
    1

    2
    Porm ud berce
    hat jemand ne idee?

    EDIT: Hab meinen Fehler gefunden. Sorry^^ war nen dummer fehler.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB-Robo“ ()