MassflowDaten per COM Port, RS232 in Form Anzeigen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Beppi4u.

    MassflowDaten per COM Port, RS232 in Form Anzeigen

    Hallo!

    Ich möchte gerne Messdaten von einem Massflowmeter(MTC) die ich über den Seriellen Port ziehe in einer Form darstellen und dann später auch mal in einer Datei abspeichern um sie in Excel etc. weiter zu verarbeiten!
    Laut Handbuch kommen die Daten per stream und in Ascii. Ein COM Port Prog hat folgendes ausgegeben!(siehe Dateianhänge!)
    Die Daten sollten wohl so kommen: Druck, Temp(Kelvin), Volumenstrom l/min., Massenstrom Standartliter/min., Sollwerte(unwichtig), eingestellte Gasart(Air,Methan,etc.).
    Anhand der Angaben und meiner niederen VB Kenntnisse habe mir auch schon ein Programm zusammen gezimmert das allerdings auch nur gut die Hälfte von dem tut was ich will. :cursing:
    Ich hab's wohl hinbekommen das mir Volumendurchfluss und Massenstrom angezeigt wird aber die anderen bekomm ich aus dem Datenstrom nicht herausgefischt!
    Die COM Verbindung tut aber ich hab das Gefühl das was fehlt!
    Ich hoffe es hat einer von Euch genügend Nerven und Zeit mir zu helfen den richtigen Weg zu finden!
    Den Code hab ich unten reingepackt!

    Danke für die Hilfe und meine Aufnahme in die Gemeinschaft!
    Andreas



    Quellcode

    1. Imports System.IO.Ports
    2. Imports System.Threading
    3. Public Class Form1
    4. Public Sub New()
    5. InitializeComponent()
    6. enableControls()
    7. 'VOREINSTELLUNGEN DER FORM UND AUSSEHEN
    8. ComboBoxCOM.Text = "COM3"
    9. ComboBoxBAUDRATE.Text = "19200"
    10. ComboBoxDATABITS.Text = 8
    11. CheckBoxSTOPBITS2.CheckState = CheckState.Checked
    12. ' ZEIGE ALLE VERFÜGBAREN PORTS IN COMBOBOX
    13. For Each sp As String In My.Computer.Ports.SerialPortNames
    14. ComboBoxCOM.Items.Add(sp)
    15. Next
    16. End Sub
    17. Private Sub enableControls()
    18. If Not SerialPort1.IsOpen Then 'Wenn Port geschlossen dann
    19. ComboBoxCOM.Enabled = True
    20. btnCOMopen.BackColor = Color.AliceBlue
    21. btnCOMopen.Enabled = True
    22. Else 'ELSE heißt in diesem Fall Port1 offen dann
    23. ComboBoxCOM.Enabled = False
    24. btnCOMopen.BackColor = Color.Green
    25. btnCOMopen.Enabled = False
    26. End If
    27. End Sub
    28. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles btnPROGRAMMSCHLIESSEN.Click
    29. If SerialPort1.IsOpen Then SerialPort1.Close() ' Wenn Port tatsächlich offen dann darfste auch beenden
    30. enableControls() ' UI umschalten
    31. Me.Close() ' Das Programm schließen
    32. End Sub
    33. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles btnCOMclose.Click
    34. If SerialPort1.IsOpen Then SerialPort1.Close()
    35. enableControls()
    36. Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    37. End Sub
    38. Private Sub Form1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    39. If SerialPort1.IsOpen Then SerialPort1.Close() ' PORT Schließen bevor das Programm beendet wird
    40. enableControls()
    41. End Sub
    42. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    43. End Sub
    44. Private Sub GroupBox1_Enter(sender As System.Object, e As System.EventArgs)
    45. End Sub
    46. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btnCOMopen.Click
    47. Try
    48. With SerialPort1
    49. .PortName = ComboBoxCOM.Text ' Mit den Ausgewählten einstellungen den COM Port versuchen zu öffnen
    50. .BaudRate = ComboBoxBAUDRATE.Text
    51. .DataBits = ComboBoxDATABITS.Text
    52. .Open()
    53. .Parity = IO.Ports.Parity.None
    54. .StopBits = IO.Ports.StopBits.None
    55. Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    56. 'If CheckBox1.CheckState = CheckState.Checked Then
    57. ' .StopBits = StopBits.One
    58. ' If CheckBox2.CheckState = CheckState.Checked Then
    59. ' .StopBits = StopBits.Two
    60. ' End If
    61. 'End If
    62. End With
    63. enableControls()
    64. Catch ex As Exception
    65. End Try
    66. End Sub
    67. Private Sub Label7_Click(sender As System.Object, e As System.EventArgs) Handles lblTEMP.Click
    68. End Sub
    69. Private Sub Label11_Click(sender As System.Object, e As System.EventArgs) Handles lblGASART.Click
    70. End Sub
    71. Private Sub GroupBox4_Enter(sender As System.Object, e As System.EventArgs)
    72. End Sub
    73. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    74. Try
    75. Dim count As Double = SerialPort1.BytesToRead ' Empfangene Daten verarbeiten
    76. Dim data() As Byte
    77. ReDim data(count - 1)
    78. SerialPort1.Read(data, 0, count)
    79. Dim data1 As String = System.Text.Encoding.Default.GetString(data, 1, 6)
    80. Dim data2 As String = System.Text.Encoding.Default.GetString(data, 7, 13)
    81. 'Dim data3 As String = System.Text.Encoding.Default.GetString(data, 15, 22)
    82. lblVOLUMENFLUSS.Invoke(displayDataPtr, data1, data2) ' Keine Plan was und warum und wieso INVOKE Was'n das?
    83. Catch ex As Exception
    84. End Try
    85. End Sub
    86. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    87. Try
    88. Dim data As String = TextBox1.Text
    89. SerialPort1.WriteLine(data)
    90. TextBox1.AppendText(data & Environment.NewLine) ' Anzeige
    91. TextBox1.ScrollToCaret()
    92. TextBox1.SelectAll()
    93. Catch ex As Exception
    94. End Try
    95. End Sub
    96. Private Delegate Sub displayDataDlg(ByVal dat1 As String, ByVal dat2 As String)
    97. Private displayDataPtr As displayDataDlg = AddressOf displayData
    98. Private Sub displayData(ByVal d1 As Double, ByVal d2 As Double)
    99. Dim f As Double = Decimal.Parse(d1) 'sollte Standartliter Pro/Min. sein
    100. Dim p As Double = Decimal.Parse(d2) 'sollte Standartliter Total sein
    101. 'Dim DA As Double = Decimal.Parse(d3) 'sollte Umgebungsdruck sein
    102. lblVOLUMENFLUSS.Text = f 'Den Rest der Empfangenen Daten kann ich noch nicht richtig entschlüsseln!!!
    103. lblSTANDARTLITER.Text = p
    104. 'lblDRUCK.Text = DA
    105. End Sub
    106. Private Sub NumericUpDown1_ValueChanged(sender As System.Object, e As System.EventArgs)
    107. End Sub
    108. Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBoxSTOPBITS1.CheckedChanged
    109. If CheckBoxSTOPBITS1.CheckState = CheckState.Checked Then
    110. CheckBoxSTOPBITS2.CheckState = CheckState.Unchecked
    111. End If
    112. End Sub
    113. Private Sub CheckBox2_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBoxSTOPBITS2.CheckedChanged
    114. If CheckBoxSTOPBITS2.CheckState = CheckState.Checked Then
    115. CheckBoxSTOPBITS1.CheckState = CheckState.Unchecked
    116. End If
    117. End Sub
    118. Private Sub GroupBox1_Enter_1(sender As System.Object, e As System.EventArgs) Handles grboxCOMEINSTELLUNGEN.Enter
    119. End Sub
    120. End Class
    Bilder
    • 2015-11-30_09h49_13.png

      21,65 kB, 490×213, 146 mal angesehen
    "Why the heck is this peace of shit not work'in?" ?( ......."Oh...i see! ..cause I'm not work'in!!" 8|
    Willkommen im Forum. :thumbup:

    Beppi4u schrieb:

    und in Ascii
    Fang an mit Option Strict On :!:
    Wenn die Gegenstelle ASCII-Daten sendet, lies die Daten auch als ASCII-Daten aus, nicht als Bytes.
    Gib dem Port ein Encoding und lies die Daten als String aus. Invoke den gelesenen String in die Form und verarbeite dort Deine Daten.
    Öffne das Port erst, wenn alle Properties gesetzt sind.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. SerialPort1.Encoding = System.Text.Encoding.ASCII
    4. '...
    5. SerialPort1.Open()
    6. End Sub
    7. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    8. Dim data = SerialPort1.ReadExisting
    9. Me.BeginInvoke(Sub() TransferData(data))
    10. End Sub
    11. Private Sub TransferData(data As String)
    12. ' was tun
    13. End Sub
    14. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Rod für die schnelle Rückmeldung!
    --
    Aber-Oh je! "HILFE!!!" Ich hab das Programm jetzt"umgehäkelt"und damit nur schlimmer gemacht!
    "Option Strict On": Gesetzt!
    Serialport.Encoding = System.Encoding.ASCII!: Gemacht!
    Port Öffnen erst Einstellung der Properties!: Erledigt! --->(darf ich das"Stop Bit"den überhaupt innerhalb des "with" so ermitteln??)
    Aber jetzt hört's schon auf....!? Wo und "WIE?"nehme ich den ausgelesenen String den auseinander um dann die Werte auf die Labels zu verteilen??

    Bin für jede Hilfe dankbar!!
    Andreas


    Quellcode

    1. Imports System.IO.Ports
    2. Imports System.Threading
    3. Public Class Form1
    4. Public Sub New()
    5. InitializeComponent()
    6. enableControls()
    7. 'VOREINSTELLUNGEN DER FORM UND AUSSEHEN
    8. ComboBoxCOM.Text = "COM3"
    9. ComboBoxBAUDRATE.Text = "19200"
    10. ComboBoxDATABITS.Text = "8"
    11. CheckBoxSTOPBITS2.CheckState = CheckState.Checked
    12. ' ZEIGE ALLE VERFÜGBAREN PORTS IN COMBOBOX
    13. For Each sp As String In My.Computer.Ports.SerialPortNames
    14. ComboBoxCOM.Items.Add(sp)
    15. Next
    16. End Sub
    17. Private Sub enableControls()
    18. If Not SerialPort1.IsOpen Then 'Wenn Port geschlossen dann
    19. ComboBoxCOM.Enabled = True
    20. btnCOMopen.BackColor = Color.AliceBlue
    21. btnCOMopen.Enabled = True
    22. Else 'ELSE heißt in diesem Fall Port1 offen dann
    23. ComboBoxCOM.Enabled = False
    24. btnCOMopen.BackColor = Color.Green
    25. btnCOMopen.Enabled = False
    26. End If
    27. End Sub
    28. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles btnPROGRAMMSCHLIESSEN.Click
    29. If SerialPort1.IsOpen Then SerialPort1.Close() ' Wenn Port tatsächlich offen dann darfste auch beenden
    30. enableControls() ' UI umschalten
    31. Me.Close() ' Das Programm schließen
    32. End Sub
    33. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles btnCOMclose.Click
    34. If SerialPort1.IsOpen Then SerialPort1.Close()
    35. enableControls()
    36. Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    37. End Sub
    38. Private Sub Form1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    39. If SerialPort1.IsOpen Then SerialPort1.Close() ' PORT Schließen bevor das Programm beendet wird
    40. enableControls()
    41. End Sub
    42. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    43. End Sub
    44. Private Sub GroupBox1_Enter(sender As System.Object, e As System.EventArgs)
    45. End Sub
    46. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btnCOMopen.Click
    47. Try
    48. With SerialPort1 ' Mit den Ausgewählten einstellungen den COM Port versuchen zu öffnen
    49. .Encoding = System.Text.Encoding.ASCII
    50. .PortName = ComboBoxCOM.Text
    51. .BaudRate = CInt(ComboBoxBAUDRATE.Text)
    52. .DataBits = CInt(ComboBoxDATABITS.Text)
    53. .Parity = IO.Ports.Parity.None
    54. .StopBits = IO.Ports.StopBits.None
    55. If CheckBoxSTOPBITS1.CheckState = CheckState.Checked Then
    56. .StopBits = StopBits.One
    57. If CheckBoxSTOPBITS2.CheckState = CheckState.Checked Then
    58. .StopBits = StopBits.Two
    59. End If
    60. End If
    61. .Open()
    62. Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    63. End With
    64. enableControls()
    65. Catch ex As Exception
    66. End Try
    67. End Sub
    68. Private Sub Label7_Click(sender As System.Object, e As System.EventArgs) Handles lblTEMP.Click
    69. End Sub
    70. Private Sub Label11_Click(sender As System.Object, e As System.EventArgs) Handles lblGASART.Click
    71. End Sub
    72. Private Sub GroupBox4_Enter(sender As System.Object, e As System.EventArgs)
    73. End Sub
    74. Public Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    75. Try
    76. Dim data = SerialPort1.ReadExisting
    77. Me.BeginInvoke(Sub() TransferData(data))
    78. Catch ex As Exception
    79. End Try
    80. End Sub
    81. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    82. Try
    83. Dim data As String = TextBox1.Text
    84. SerialPort1.WriteLine(data)
    85. TextBox1.AppendText(data & Environment.NewLine) ' Anzeige
    86. TextBox1.ScrollToCaret()
    87. TextBox1.SelectAll()
    88. Catch ex As Exception
    89. End Try
    90. End Sub
    91. Private Delegate Sub TransferDataDlg(dat1 As String, dat2 As String, dat3 As String, dat4 As String, dat5 As String, dat6 As String)
    92. Private TransferDataPtr As TransferDataDlg = AddressOf TransferData
    93. Public Sub TransferData(d1 As String, d2 As String, d3 As String, d4 As String, d5 As String, d6 As String)
    94. Dim p As Double = Decimal.Parse(d1) 'sollte Umgebungsdruck sein
    95. Dim t As Double = Decimal.Parse(d2) 'sollte Temperatur in Kelvin sein
    96. Dim v As Double = Decimal.Parse(d3) 'sollte Volumenstrom l/min. sein
    97. Dim m As Double = Decimal.Parse(d4) 'sollte Massenstrom Standartliter/min. sein
    98. Dim sw As Double = Decimal.Parse(d5) 'sollte Sollwert (eigentlich Unwichtig) sein
    99. Dim ga As Double = Decimal.Parse(d6) 'sollte die am MTC Eingestellte Gasart sein
    100. lblDRUCK.Text = CStr(p)
    101. lblTEMP.Text = CStr(t)
    102. lblVOLUMENFLUSS.Text = CStr(v)
    103. lblSTANDARTLITER.Text = CStr(m)
    104. lblGASART.Text = CStr(ga)
    105. End Sub
    106. Private Sub NumericUpDown1_ValueChanged(sender As System.Object, e As System.EventArgs)
    107. End Sub
    108. Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBoxSTOPBITS1.CheckedChanged
    109. If CheckBoxSTOPBITS1.CheckState = CheckState.Checked Then
    110. CheckBoxSTOPBITS2.CheckState = CheckState.Unchecked
    111. End If
    112. End Sub
    113. Private Sub CheckBox2_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBoxSTOPBITS2.CheckedChanged
    114. If CheckBoxSTOPBITS2.CheckState = CheckState.Checked Then
    115. CheckBoxSTOPBITS1.CheckState = CheckState.Unchecked
    116. End If
    117. End Sub
    118. Private Sub GroupBox1_Enter_1(sender As System.Object, e As System.EventArgs) Handles grboxCOMEINSTELLUNGEN.Enter
    119. End Sub
    120. Private Sub TransferData(data As String)
    121. Throw New NotImplementedException
    122. End Sub
    123. End Class
    "Why the heck is this peace of shit not work'in?" ?( ......."Oh...i see! ..cause I'm not work'in!!" 8|

    Beppi4u schrieb:

    Wo und "WIE?"nehme ich den ausgelesenen String den auseinander
    Hab ich doch geschrieben. Nur Du hast den Post nicht verstanden und einfach eine neue Methode in Deinen Code reingenommen und nicht den äquivalenten alten rausgenommen.
    Ich hab mal Deinen Code etwas glatt gezogen (testen kann ich ihn nicht, da ich keine Kommunikation habe).
    Ich hab mal alle Try / Catches rausgeworfen, denn wir wollen Fehler finden und nicht verschleiern. ;)
    Ersetze die CheckBoxen durch RadioButton.
    Einen Programm-Close-Button brauchst Du nicht, das wird im Form_Closing gemacht.
    Sieh Dir meinen Code zunächst genau an, bevor Du Deinen Code durch meinen ersetzt und verstehe, warum ich welche Änderungen vorgenommen habe.
    Mach zuvor eine Sicherungskopie Deines Projekts.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class Form1
    3. Public Sub New()
    4. InitializeComponent()
    5. enableControls()
    6. ' ZEIGE ALLE VERFÜGBAREN PORTS IN COMBOBOX
    7. ComboBoxCOM.Items.AddRange(SerialPort.GetPortNames())
    8. 'VOREINSTELLUNGEN DER FORM UND AUSSEHEN
    9. ComboBoxCOM.Text = "COM3"
    10. ComboBoxBAUDRATE.Text = "19200"
    11. ComboBoxDATABITS.Text = "8"
    12. CheckBoxSTOPBITS2.Checked = True
    13. End Sub
    14. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    15. If SerialPort1.IsOpen Then SerialPort1.Close() ' PORT Schließen bevor das Programm beendet wird
    16. End Sub
    17. Private Sub enableControls()
    18. If SerialPort1.IsOpen Then ' Port offen
    19. ComboBoxCOM.Enabled = False
    20. btnCOMopen.BackColor = Color.Green
    21. btnCOMopen.Enabled = False
    22. Else ' Port geschlossen
    23. ComboBoxCOM.Enabled = True
    24. btnCOMopen.BackColor = Color.AliceBlue
    25. btnCOMopen.Enabled = True
    26. End If
    27. End Sub
    28. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles btnCOMclose.Click
    29. If SerialPort1.IsOpen Then SerialPort1.Close()
    30. enableControls()
    31. Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    32. End Sub
    33. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btnCOMopen.Click
    34. If SerialPort1.IsOpen Then
    35. SerialPort1.Close()
    36. End If
    37. With SerialPort1 ' Mit den Ausgewählten einstellungen den COM Port versuchen zu öffnen
    38. .Encoding = System.Text.Encoding.ASCII
    39. .PortName = ComboBoxCOM.Text
    40. .BaudRate = CInt(ComboBoxBAUDRATE.Text)
    41. .DataBits = CInt(ComboBoxDATABITS.Text)
    42. .Parity = IO.Ports.Parity.None
    43. .StopBits = IO.Ports.StopBits.None
    44. If CheckBoxSTOPBITS1.Checked Then
    45. .StopBits = StopBits.One
    46. ElseIf CheckBoxSTOPBITS2.Checked Then
    47. .StopBits = StopBits.Two
    48. End If
    49. .Open()
    50. Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    51. End With
    52. enableControls()
    53. End Sub
    54. Public Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    55. Dim data = SerialPort1.ReadExisting
    56. Me.BeginInvoke(Sub() TransferData(data))
    57. End Sub
    58. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    59. If Not SerialPort1.IsOpen Then
    60. MessageBox.Show("Port ist nicht offen")
    61. Return
    62. End If
    63. Dim data As String = TextBox1.Text
    64. SerialPort1.WriteLine(TextBox1.Text)
    65. End Sub
    66. Private Sub TransferData(data As String)
    67. Dim d1, d2, d3, d4, d5, d6 As String
    68. d1 = data.Substring(1, 6)
    69. d2 = data.Substring(7, 13)
    70. d3 = data.Substring(15, 22)
    71. '...
    72. ' Hier musst Du noch die anderen Variablen rauslösen
    73. Dim p As Double = Double.Parse(d1) 'sollte Umgebungsdruck sein
    74. Dim t As Double = Double.Parse(d2) 'sollte Temperatur in Kelvin sein
    75. Dim v As Double = Double.Parse(d3) 'sollte Volumenstrom l/min. sein
    76. Dim m As Double = Double.Parse(d4) 'sollte Massenstrom Standartliter/min. sein
    77. Dim sw As Double = Double.Parse(d5) 'sollte Sollwert (eigentlich Unwichtig) sein
    78. Dim ga As Double = Double.Parse(d6) 'sollte die am MTC Eingestellte Gasart sein
    79. lblDRUCK.Text = p.ToString
    80. lblTEMP.Text = t.ToString
    81. lblVOLUMENFLUSS.Text = v.ToString
    82. lblSTANDARTLITER.Text = m.ToString
    83. lblGASART.Text = ga.ToString
    84. End Sub
    85. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Na ja, das mit dem Verstehen.....da hab ich halt auch meine Grenzen! Aber die Grenzen versuche ich ja gerade durch lernen zu verschieben!
    --
    Radiobuttons...check!
    Form_closing....kapiert!
    Habe den code C&P!
    Bekomme jetzt ein:
    Port Open: True (schon mal gut!) :thumbup:
    A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll (nicht so gut!) :whistling:

    Meine Laienhafte Vermutung ist das sich das Zerteilen des Strings am unkontrollierten/ungeordneten eingehen der Daten verschluckt!
    Die Fehlermeldung taucht nach jedem Start an einer anderen Stelle auf: dx = data.Substring(x, x)
    "Ich meine Verstanden zu haben!"-Das deshalb ja ein CR am Ende einer jeden Satzfolge mitgegeben wird! Quasi als Signal das jetzt ein neuer Satz folgen wird!
    Gehe ich da richtig in der Annahme - und wenn ja - wie stelle ich es an das der String erst ab dem letzten CR zerteilt wird?
    Any suggestions? Ideas?
    Danke im vorraus!

    Andreas

    (Übrigens will ich mal Rückmelden wie sehr ich es zu schätzen weiß das ihr Euch Zeit und Nerven nehmt um anderen Menschen bei Ihren"Problemen" zu helfen und ihnen somit was beizubringen!)


    Quellcode

    1. Private Sub TransferData(data As String)
    2. Dim d1, d2, d3, d4, d5, d6 As String
    3. d1 = data.Substring(0, 6)
    4. d2 = data.Substring(9, 16)
    5. d3 = data.Substring(17, 22)
    6. d4 = data.Substring(23, 31)
    7. d5 = data.Substring(32, 39)
    8. d6 = data.Substring(40, 44)
    9. Dim p As Double = Double.Parse(d1) 'sollte Umgebungsdruck sein
    10. Dim t As Double = Double.Parse(d2) 'sollte Temperatur in Kelvin sein
    11. Dim v As Double = Double.Parse(d3) 'sollte Volumenstrom l/min. sein
    12. Dim m As Double = Double.Parse(d4) 'sollte Massenstrom Standartliter/min. sein
    13. Dim sw As Double = Double.Parse(d5) 'sollte Sollwert (eigentlich Unwichtig) sein
    14. Dim ga As Double = Double.Parse(d6) 'sollte die am MTC Eingestellte Gasart sein
    15. lblDRUCK.Text = p.ToString
    16. lblTEMP.Text = t.ToString
    17. lblVOLUMENFLUSS.Text = v.ToString
    18. lblSTANDARTLITER.Text = m.ToString
    19. lblGASART.Text = ga.ToString
    20. End Sub
    "Why the heck is this peace of shit not work'in?" ?( ......."Oh...i see! ..cause I'm not work'in!!" 8|

    Beppi4u schrieb:

    'System.ArgumentOutOfRangeException'
    In welcher Codezeile?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Beppi4u schrieb:

    6 und 8!
    Du musst Deinen String anders "zerlegen".
    Was genau steht in diesem String?
    Poste den mal.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Beppi4u schrieb:

    So wie im Anhang des ersten Posts!
    :rolleyes:
    Poste mal den String so wie Du ihn empfängst, bevor Du ihn zerlegst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sodele!
    Das Handbuch hat mich nicht wirklich schlauer gemacht.
    Nach einigem Probieren ist mir aufgefallen das im Debug-Mode im "Data" String eigentlich das richtige ankommt...aber halt auch nicht immer!
    Siehe Screenshots.



    "Why the heck is this peace of shit not work'in?" ?( ......."Oh...i see! ..cause I'm not work'in!!" 8|

    Beppi4u schrieb:

    aber halt auch nicht immer
    Sendet der Sender ein definiertes Übertragungs-Ende-Zeichen?
    Das könntest Du der Property ComPort1.NewLine zuweisen und dann mit ComPort1.ReadLine immer meine vollständige Zeile lesen.
    Ggf. musst Du die Property ~ ReceiveTimeout anpassen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sodele!
    Jetzt hab ich etwas rumprobiert aber tut immer noch nicht so wie es sein soll! :thumbdown:
    Vermutlich habe ich die Propertys an der falschen Stelle gesetzt oder nicht die richtige Syntax verwendet. ;(
    ComPort1.Readline gibt sofort nen Absturz!
    Siehe Screenshot - kommen dann und wann doch die richtigen Daten in der richtigen Reihenfolge im (data) string an!
    Wie muss ich .Startswith oder .Endswith einsetzten wenn der übergebene String (Vielleicht!) nicht immer exakt die gleiche länge hat?
    Danke für alle Anhaltspunkte die evtl. weiterführen könnten!


    "Why the heck is this peace of shit not work'in?" ?( ......."Oh...i see! ..cause I'm not work'in!!" 8|

    Beppi4u schrieb:

    Anhaltspunkte
    Er soll einen 12 Zeichen langen String auslesen, wo nach meinem Dafürhalten nur 2 Zeichen da sind: "Ar".
    Ändere mal die letzte Zeile um in

    VB.NET-Quellcode

    1. d6 = Data.Substring(41)
    da wird einfach der Rest gelesen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für den Tipp!
    Diese kleine Korrektur wird helfen den letzten Teil des String richtig auseinander zu nehmen wenn er den mal ständig in der Richtigen Art und Weise ankommen würde!
    Da das aber bis jetzt nicht der Fall ist bekommt keines der Labels je eine Zahl(Text)(Wert) zu sehen!
    Ich habe mich mal an den Hersteller des Device per mail gewendet um etwaige Fehler bei der Pinbelegung oder auch bei der Interpretation der Handbuchangaben ausschließen zu können!
    Kann ne weile dauern aber wenn ich mehr weiß werde ich es hier natürlich kund tun! :thumbup:
    Wenn sonst noch jemand nen Tipp parat hat!? Danke schon mal!

    (So langsam schwant mir womit Programmierer sich die Nächte um die Ohren schlagen! )
    "Why the heck is this peace of shit not work'in?" ?( ......."Oh...i see! ..cause I'm not work'in!!" 8|

    Beppi4u schrieb:

    etwaige Fehler
    Zerlege den String nicht per SubString, sondern per .Split(...). Wenn zwischen den Daten einheitliche Zeichen stehen (" "), ist das besser.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe das Thema COM Port und Massflow wieder aufleben lassen!
    Hab dann auch prompt den Fehler gefunden der verhindert das in meiner Form die Empfangenen Daten in der richtigen Art und weise angezeigt werden.
    Ich hatte leider ein falsches Zeilenerkennungszeichen eingetragen!
    Nach dem ich ein Simples " CR " angehängt habe funktioniert die Sache wie geschmiert.

    Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btnCOMopen.Click
    2. If SerialPort1.IsOpen = True Then
    3. SerialPort1.Close()
    4. End If
    5. With SerialPort1 ' Mit den Ausgewählten Einstellungen den COM Port versuchen zu öffnen
    6. .Encoding = System.Text.Encoding.ASCII
    7. .PortName = ComboBoxCOM.Text
    8. .BaudRate = CInt(ComboBoxBAUDRATE.Text)
    9. .DataBits = CInt(ComboBoxDATABITS.Text)
    10. .Parity = IO.Ports.Parity.None
    11. .StopBits = IO.Ports.StopBits.One
    12. If RadioButton1.Checked Then
    13. .StopBits = StopBits.One
    14. ElseIf RadioButton2.Checked Then
    15. .StopBits = StopBits.Two
    16. End If
    17. .Handshake = Handshake.None
    18. .NewLine = ControlChars.Cr ' <-- HIER LAG DER HUND BEGRABEN X/ :thumbsup:
    19. .ReadTimeout = 700
    20. .Open()
    21. Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    22. End With
    23. enableControls()
    24. End Sub


    Gruß und danke für jede Hilfe
    Andreas
    "Why the heck is this peace of shit not work'in?" ?( ......."Oh...i see! ..cause I'm not work'in!!" 8|

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Beppi4u“ ()