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.
Arduino:
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
- .....
- Private Sub cmd_Verbinden_Click(sender As Object, e As EventArgs) Handles cmd_Verbinden.Click
- If SerialPort1.IsOpen = False Then
- SerialPort1.BaudRate = SerialportBaudRate
- SerialPort1.DataBits = SerialportDataBits
- SerialPort1.PortName = SerialportPortName
- SerialPort1.ReadBufferSize = SerialportReadBufferSize
- SerialPort1.WriteBufferSize = SerialportWriteBufferSize
- Timer1.Interval = Timerintervall
- TimerMesswerte.Interval = Timerintervall
- TimerRohdaten.Interval = Timerintervall
- EinstellungenToolStripMenuItem.Enabled = False
- cmd_Verbinden.Text = "Trennen"
- cmd_Verbinden.BackColor = Color.Green
- cmd_Kalbibrierung.Enabled = True
- cmd_Messwertanzeige.Enabled = True
- cmd_Rohdaten.Enabled = True
- cmd_DrehmomentAuswahlen.Enabled = True
- lbl_COMPort.Text = SerialportPortName
- lbl_BAUDRATE.Text = SerialportBaudRate
- lbl_Wiederholungszeit.Text = Timerintervall
- SerialPort1.Open()
- Else
- Timer1.Enabled = False
- TimerRohdate.Enabled = False
- TimerMesswerte.Enabled = False
- SerialPort1.Close()
- EinstellungenToolStripMenuItem.Enabled = True
- cmd_Verbinden.Text = "Verbinden"
- cmd_Verbinden.BackColor = Color.Red
- cmd_Kalbibrierung.Enabled = False
- cmd_Messwertanzeige.Enabled = False
- cmd_Rohdaten.Enabled = False
- cmd_DrehmomentAuswahlen.Enabled = False
- End If
- End Sub
- ......
- Private Sub cmd_Rohdaten_Click(sender As Object, e As EventArgs) Handles cmd_Rohdaten.Click
- Dim DateiSenden As String
- DateiSenden = ""
- If radio_Roh1.Checked = True Then
- DateiSenden = "$<Read1"
- ElseIf radio_Roh2.Checked = True Then
- DateiSenden = "$<Read2"
- ElseIf radio_Roh3.Checked = True Then
- DateiSenden = "$<Read3"
- Else
- lbl_Fehler.Text = "Fehler beim Senden"
- End If
- If SerialPort1.IsOpen Then 'folgenden Code nur ausführen wenn auch eine Verbindung besteht
- TimerRohdate.Enabled = True
- 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)
- cmd_Rohdaten.Enabled = False
- End If
- End Sub
- Private Sub TimerRohdate_Tick(sender As Object, e As EventArgs) Handles TimerRohdate.Tick
- If SerialPort1.BytesToRead > 0 Then 'Daten vom COM Port empfangen
- Do
- 'DatenEmpfangen = SerialPort1.ReadLine
- DatenEmpfangen = DatenEmpfangen & SerialPort1.ReadLine '& ";"
- If SerialPort1.BytesToRead = 0 Then
- Exit Do
- End If
- Loop
- AusgabeArr = DatenEmpfangen.Split(CChar(";")) 'empfangenen Text trennen und in ein String-Array speichern
- If AusgabeArr(0) = "EEPROM1" Then
- ' SerialPort1.Write("$<Read1" + Chr(13))
- lbl_Strom.Text = CSng(AusgabeArr(1))
- lbl_Spannung.Text = CSng(AusgabeArr(2))
- lbl_Speicher.Text = "1"
- TimerRohdate.Enabled = False
- cmd_Rohdaten.Enabled = True
- End If
- If AusgabeArr(0) = "EEPROM2" Then
- 'SerialPort1.Write("$<Read1" + Chr(13))
- lbl_Strom.Text = CSng(AusgabeArr(1))
- lbl_Spannung.Text = CSng(AusgabeArr(2))
- lbl_Speicher.Text = "2"
- TimerRohdate.Enabled = False
- cmd_Rohdaten.Enabled = True
- End If
- If AusgabeArr(0) = "EEPROM3" Then
- ' SerialPort1.Write("$<Read1" + Chr(13))
- lbl_Strom.Text = CSng(AusgabeArr(1))
- lbl_Spannung.Text = CSng(AusgabeArr(2))
- lbl_Speicher.Text = "3"
- TimerRohdate.Enabled = False
- cmd_Rohdaten.Enabled = True
- Else
- lbl_Fehler.Text = "Fehler beim Empfangen" 'MessageBox.Show("Der Startpunkt war falsch", "Warnung", MessageBoxButtons.OK)
- TimerRohdate.Enabled = False
- cmd_Rohdaten.Enabled = True
- End If
- End If
- End Sub
Arduino:
Quellcode
- if ((Serial.available() > 0))
- {
- while (Serial.available())
- {
- inbyte = Serial.read();
- if (inbyte == 13)
- {
- break;
- }
- else
- {
- if (index < MAXSTRING)
- {
- inString[index] = inbyte;
- inString[index+1] = '\0';
- index += 1;
- }
- }
- }
- inbyte=0;
- }
- ......
- else if ( !strcmp(inString, "$<Read1") )
- {
- Serial.write("EEPROM1;");
- Serial.println(Motorstrom);
- Serial.write(";");
- Serial.println(Batteriespannung);
- Serial.write(";");
- Serial.write("\n");
- for (int i=0; i <= index; i++)
- {
- inString[i] = 0;
- }
- index = 0;
- }
- else if ( !strcmp(inString, "$<Read2") )
- {
- Serial.write("EEPROM2;");
- Serial.println(Motorstrom);
- Serial.write(";");
- Serial.println(Batteriespannung);
- Serial.write(";");
- Serial.write("\n");
- for (int i=0; i <= index; i++)
- {
- inString[i] = 0;
- }
- index = 0;
- }
- else if ( !strcmp(inString, "$<Read3") )
- {
- Serial.write("EEPROM3;");
- Serial.println(Motorstrom);
- Serial.write(";");
- Serial.println(Batteriespannung);
- Serial.write(";");
- Serial.write("\n");
- for (int i=0; i <= index; i++)
- {
- inString[i] = 0;
- }
- index = 0;
- }
- else
- {
- for (int i=0; i <= index; i++)
- {
- inString[i] = 0;
- }
- index = 0;
- }