RS232 Kommunikationsproblem PC<->Arduino

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von webcool.

    RS232 Kommunikationsproblem PC<->Arduino

    Hallo,
    ich bin seit längerem mal wieder dabei eine Schnittstelle zwischen einem Arduino Board und einem PC Programm herzustellen. Die Verbindung an sich funktioniert auch schon einwandfrei.
    Leider habe ich ein Problem mit dem VB Programm. Das Programm soll via RS232 USB dem Arduino bestimmte Befehle schicken. Diese Befehle arbeitet der Arduino ab und gibt einen Wert (Spannung, Strom) wieder zurück. Soweit so gut. Mit einem Terminalprogramm funktioniert das hin und her schicken ohne Probleme.
    Bei meinem Visual Basic Programm funktioniert das ganze nur einmal.
    Wenn ich auf den Button "cmd_Rohdaten" klicke bekomm ich einen Wert zurück, wie ich es möchte. Wenn ich erneut auf den Button klicke passiert gar nichts.
    Wenn ich das Programm neu starte (Arduino läuft weiter) und erneut auf den Button klicke funktionierts wieder, genau einmal. Aber warum das so ist habe ich bisher nicht herausgefunden, und hoffe Ihr könnt mir hier weiterhelfen.

    Das Ganze soll später ein Messgerät eines Motors für Spannung und Strom werden.

    VB.NET-Quellcode

    1. .....
    2. Private Sub cmd_Verbinden_Click(sender As Object, e As EventArgs) Handles cmd_Verbinden.Click
    3. If SerialPort1.IsOpen = False Then
    4. SerialPort1.BaudRate = SerialportBaudRate
    5. SerialPort1.DataBits = SerialportDataBits
    6. SerialPort1.PortName = SerialportPortName
    7. SerialPort1.ReadBufferSize = SerialportReadBufferSize
    8. SerialPort1.WriteBufferSize = SerialportWriteBufferSize
    9. Timer1.Interval = Timerintervall
    10. TimerMesswerte.Interval = Timerintervall
    11. TimerRohdaten.Interval = Timerintervall
    12. EinstellungenToolStripMenuItem.Enabled = False
    13. cmd_Verbinden.Text = "Trennen"
    14. cmd_Verbinden.BackColor = Color.Green
    15. cmd_Kalbibrierung.Enabled = True
    16. cmd_Messwertanzeige.Enabled = True
    17. cmd_Rohdaten.Enabled = True
    18. cmd_DrehmomentAuswahlen.Enabled = True
    19. lbl_COMPort.Text = SerialportPortName
    20. lbl_BAUDRATE.Text = SerialportBaudRate
    21. lbl_Wiederholungszeit.Text = Timerintervall
    22. SerialPort1.Open()
    23. Else
    24. Timer1.Enabled = False
    25. TimerRohdate.Enabled = False
    26. TimerMesswerte.Enabled = False
    27. SerialPort1.Close()
    28. EinstellungenToolStripMenuItem.Enabled = True
    29. cmd_Verbinden.Text = "Verbinden"
    30. cmd_Verbinden.BackColor = Color.Red
    31. cmd_Kalbibrierung.Enabled = False
    32. cmd_Messwertanzeige.Enabled = False
    33. cmd_Rohdaten.Enabled = False
    34. cmd_DrehmomentAuswahlen.Enabled = False
    35. End If
    36. End Sub
    37. ......
    38. Private Sub cmd_Rohdaten_Click(sender As Object, e As EventArgs) Handles cmd_Rohdaten.Click
    39. Dim DateiSenden As String
    40. DateiSenden = ""
    41. If radio_Roh1.Checked = True Then
    42. DateiSenden = "$<Read1"
    43. ElseIf radio_Roh2.Checked = True Then
    44. DateiSenden = "$<Read2"
    45. ElseIf radio_Roh3.Checked = True Then
    46. DateiSenden = "$<Read3"
    47. Else
    48. lbl_Fehler.Text = "Fehler beim Senden"
    49. End If
    50. If SerialPort1.IsOpen Then 'folgenden Code nur ausführen wenn auch eine Verbindung besteht
    51. TimerRohdate.Enabled = True
    52. SerialPort1.Write(DateiSenden + Chr(13)) '("$<Spannung" + (MotorRR).ToString + Chr(13)) 'Daten per RS232 an die Arduino Senden. CHr(13) =Enter drücken (Ende der Übertagung)
    53. cmd_Rohdaten.Enabled = False
    54. End If
    55. End Sub
    56. Private Sub TimerRohdate_Tick(sender As Object, e As EventArgs) Handles TimerRohdate.Tick
    57. If SerialPort1.BytesToRead > 0 Then 'Daten vom COM Port empfangen
    58. Do
    59. 'DatenEmpfangen = SerialPort1.ReadLine
    60. DatenEmpfangen = DatenEmpfangen & SerialPort1.ReadLine '& ";"
    61. If SerialPort1.BytesToRead = 0 Then
    62. Exit Do
    63. End If
    64. Loop
    65. AusgabeArr = DatenEmpfangen.Split(CChar(";")) 'empfangenen Text trennen und in ein String-Array speichern
    66. If AusgabeArr(0) = "EEPROM1" Then
    67. ' SerialPort1.Write("$<Read1" + Chr(13))
    68. lbl_Strom.Text = CSng(AusgabeArr(1))
    69. lbl_Spannung.Text = CSng(AusgabeArr(2))
    70. lbl_Speicher.Text = "1"
    71. TimerRohdate.Enabled = False
    72. cmd_Rohdaten.Enabled = True
    73. End If
    74. If AusgabeArr(0) = "EEPROM2" Then
    75. 'SerialPort1.Write("$<Read1" + Chr(13))
    76. lbl_Strom.Text = CSng(AusgabeArr(1))
    77. lbl_Spannung.Text = CSng(AusgabeArr(2))
    78. lbl_Speicher.Text = "2"
    79. TimerRohdate.Enabled = False
    80. cmd_Rohdaten.Enabled = True
    81. End If
    82. If AusgabeArr(0) = "EEPROM3" Then
    83. ' SerialPort1.Write("$<Read1" + Chr(13))
    84. lbl_Strom.Text = CSng(AusgabeArr(1))
    85. lbl_Spannung.Text = CSng(AusgabeArr(2))
    86. lbl_Speicher.Text = "3"
    87. TimerRohdate.Enabled = False
    88. cmd_Rohdaten.Enabled = True
    89. Else
    90. lbl_Fehler.Text = "Fehler beim Empfangen" 'MessageBox.Show("Der Startpunkt war falsch", "Warnung", MessageBoxButtons.OK)
    91. TimerRohdate.Enabled = False
    92. cmd_Rohdaten.Enabled = True
    93. End If
    94. End If
    95. End Sub


    Arduino:

    Quellcode

    1. if ((Serial.available() > 0))
    2. {
    3. while (Serial.available())
    4. {
    5. inbyte = Serial.read();
    6. if (inbyte == 13)
    7. {
    8. break;
    9. }
    10. else
    11. {
    12. if (index < MAXSTRING)
    13. {
    14. inString[index] = inbyte;
    15. inString[index+1] = '\0';
    16. index += 1;
    17. }
    18. }
    19. }
    20. inbyte=0;
    21. }
    22. ......
    23. else if ( !strcmp(inString, "$<Read1") )
    24. {
    25. Serial.write("EEPROM1;");
    26. Serial.println(Motorstrom);
    27. Serial.write(";");
    28. Serial.println(Batteriespannung);
    29. Serial.write(";");
    30. Serial.write("\n");
    31. for (int i=0; i <= index; i++)
    32. {
    33. inString[i] = 0;
    34. }
    35. index = 0;
    36. }
    37. else if ( !strcmp(inString, "$<Read2") )
    38. {
    39. Serial.write("EEPROM2;");
    40. Serial.println(Motorstrom);
    41. Serial.write(";");
    42. Serial.println(Batteriespannung);
    43. Serial.write(";");
    44. Serial.write("\n");
    45. for (int i=0; i <= index; i++)
    46. {
    47. inString[i] = 0;
    48. }
    49. index = 0;
    50. }
    51. else if ( !strcmp(inString, "$<Read3") )
    52. {
    53. Serial.write("EEPROM3;");
    54. Serial.println(Motorstrom);
    55. Serial.write(";");
    56. Serial.println(Batteriespannung);
    57. Serial.write(";");
    58. Serial.write("\n");
    59. for (int i=0; i <= index; i++)
    60. {
    61. inString[i] = 0;
    62. }
    63. index = 0;
    64. }
    65. else
    66. {
    67. for (int i=0; i <= index; i++)
    68. {
    69. inString[i] = 0;
    70. }
    71. index = 0;
    72. }
    so also es funktioniert jetzt. hab es alleine hinbekommen.
    Hab den VB Code bisl umgeschrieben und dann funktionierte es. Warum weis ich aber selbst nicht. :rolleyes:
    Immerhin funktionierts.
    Hier mal der Code:

    VB.NET-Quellcode

    1. Private Sub cmd_Rohdaten_Click(sender As Object, e As EventArgs) Handles cmd_Rohdaten.Click
    2. 'Daten über den COM Port RS232 an die Arduino senden:
    3. If SerialPort1.IsOpen = True Then 'folgenden Code nur ausführen wenn auch eine Verbindung besteht
    4. If radio_Roh1.Checked Then
    5. SerialPort1.Write("$<Read1" + Chr(13)) 'Daten per RS232 an die Arduino Senden. CHr(13) =Enter drücken (Ende der Übertagung)
    6. TimerRohdate.Enabled = True
    7. cmd_Rohdaten.Enabled = False
    8. ElseIf radio_Roh2.Checked = True Then
    9. SerialPort1.Write("$<Read2" + Chr(13)) 'Daten per RS232 an die Arduino Senden. CHr(13) =Enter drücken (Ende der Übertagung)
    10. TimerRohdate.Enabled = True
    11. cmd_Rohdaten.Enabled = False
    12. ElseIf radio_Roh3.Checked = True Then
    13. SerialPort1.Write("$<Read3" + Chr(13)) 'Daten per RS232 an die Arduino Senden. CHr(13) =Enter drücken (Ende der Übertagung)
    14. TimerRohdate.Enabled = True
    15. cmd_Rohdaten.Enabled = False
    16. End If
    17. End If
    18. End Sub
    19. Private Sub TimerRohdate_Tick(sender As Object, e As EventArgs) Handles TimerRohdate.Tick
    20. DatenEmpfangen = ""
    21. 'Daten vom COM Port empfangen
    22. If SerialPort1.BytesToRead > 0 Then
    23. Do
    24. DatenEmpfangen = DatenEmpfangen & SerialPort1.ReadLine '& ";"
    25. If SerialPort1.BytesToRead = 0 Then
    26. Exit Do
    27. End If
    28. Loop
    29. AusgabeArr = DatenEmpfangen.Split(CChar(";")) 'empfangenen Text trennen und in ein String-Array speichern
    30. If AusgabeArr(0) = "EEPROM1" Then
    31. cmd_Kalbibrierung.Enabled = True
    32. cmd_Kalbibrierung.Enabled = True
    33. lbl_Strom.Text = AusgabeArr(1)
    34. lbl_Spannung.Text = AusgabeArr(2)
    35. lbl_Speicher.Text = "1"
    36. cmd_Rohdaten.Enabled = True
    37. TimerRohdate.Enabled = False
    38. ElseIf AusgabeArr(0) = "EEPROM2" Then
    39. cmd_Kalbibrierung.Enabled = True
    40. cmd_Kalbibrierung.Enabled = True
    41. lbl_Strom.Text = AusgabeArr(1)
    42. lbl_Spannung.Text = AusgabeArr(2)
    43. lbl_Speicher.Text = "2"
    44. cmd_Rohdaten.Enabled = True
    45. TimerRohdate.Enabled = False
    46. ElseIf AusgabeArr(0) = "EEPROM3" Then
    47. cmd_Kalbibrierung.Enabled = True
    48. cmd_Kalbibrierung.Enabled = True
    49. lbl_Strom.Text = AusgabeArr(1)
    50. lbl_Spannung.Text = AusgabeArr(2)
    51. lbl_Speicher.Text = "3"
    52. cmd_Rohdaten.Enabled = True
    53. TimerRohdate.Enabled = False
    54. Else
    55. lbl_Fehler.Text = "Fehler beim Empfangen"
    56. cmd_Rohdaten.Enabled = True
    57. TimerRohdate.Enabled = False
    58. End If
    59. End If
    60. End Sub
    Hi,
    ich weiß das dein problem gelöst ist aber wie und warum weisst du ja nicht.

    wer auch probleme damit hat, dem kann ich nur fogendes sagen.

    also port öffnen, schreiben, empfangen, schlie. bevor der nächste query geschickt wird eine Sekunde warten mit einem timer z.b. und wieder von vorn
    öffnen, schreiben, empfangen, schliessen und 1 sec. warten, dann sollte es keine probleme geben wenn die syntax der befehle im string richtig sind.