Hallo,
ich stehe bei meinem Projekt derzeit vor einem Problem, das ich nicht lösen kann.
Zuerst einmal die prinzipielle Aufgabe des Arduino bei meinem Projekt:
Ich will damit Digital- und Analogwerte von einem Pult an den PC schicken, als auch Daten an das Pult schicken, um diese dort als Digital- oder Analogwert auszugeben. Dafür schicke ich 4 Byte vom Pult zum PC, und ca. 8 Byte vom PC zum Pult. Als Schnittstelle am PC dient ein VB Programm, welches die Werte für das Pult von einem TCP-Server bezieht, für das Problem aber gar nicht ausschlaggebend. Ich erstellte zu Beginn ein Programm, das die Werte nur zum Pult schickte, und zwar immer dann, wenn die Werte von der TCP Verbindung aktualisiert wurden. Das funktionierte ganz Ok, nur brachte dieses nicht genau festlegbare Intervall mit sich, dass das Programm am PC bei Übertragung in beide Richtungen nicht stabil lief, da die Werte vom Pult zum PC immer genau alle 200ms gesendet wurden (Timer im VB Programm.) Ich vermute mal dass sich aufgrund der nicht synchronisierten Intervalle der Puffer füllte.
Um dieses Problem zu umgehen, wollte ich die Kommunikation nun in beide Richtungen vom Timer bestimmt ablaufen lassen. Dazu habe ich die Werte von der TCP Verbindung als Variablen gespeichert, um sie dann wenn sie gebraucht werden, zu übertragen. Nun allerdings kann ich zwar Daten vom Arduino zum PC übertragen, das auch stabil, jedoch funktioniert die Übertragung in die andere Richtung nicht mehr - die Routine zur Verbindungsherstellung ist jedoch in beide Richtungen dieselbe.
Ich hoffe die Problematik ist grundsätzlich verständlich, hier nun der VB - und Arduino Code:
Als erstes stelle ich eine Verbindung her, welche vom Arduino auch erfolgreich mit "ready" bestätigt wird:
VB:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Serial.IsOpen
Serial.WriteLine("oo") '"oo" für "output"
System.Threading.Thread.Sleep(50)
Arduino (in Loop):
if (inputChar[0]=='o'){ // Der PC will Werte zum Arduino ausgeben, es wird mit "ready" bestätigt
Serial.println("ready");
if (inputChar[1]=='o')
Die letzte if Bedingung wird auch erfüllt, das konnte ich bereits herausfinden. Nun sollen die Daten übertragen werden, in derselben Struktur wie es schon erwähnt bei direkter Übertragung beireits funktioniert hat - nur dass sie eben nicht direkt von der TCP Verbindung aus gesendet werden, sondern vorher in Variablen gespeichert wurden.
An der Speicherung der Werte dürfte es aber auch nicht liegen, ich habe auch schon versucht anstatt der gespeicherten Werte direkt Zahlen mit CByte() zu übertragen, auch erfolglos.
Damit der Arduino die Bytes unterscheiden kann, schicke ich als erstes einen Buchstaben zur Identifikation, anschließend die Information selbst. Also hier der Übertragungsteil im VB Programm:
If Serial.ReadLine() = "ready" & System.Text.Encoding.UTF8.GetString({13}) Then
OutChar(0) = 86 'V Der Buchstabe der Variable wird an den Arduino gesendet, damit er weiß was kommt.
OutChar(1) = V 'Der gespeicherte Wert wird gesendet
Serial.Write(OutChar, 0, 2)
OutChar(0) = 80 'P
OutChar(1) = Lm1
Serial.Write(OutChar, 0, 2)
OutChar(0) = 72 'H
OutChar(1) = H
Serial.Write(OutChar, 0, 2)
....
End If
...und zum Empfang der Daten im Arduino Programm:
{
if (inputChar[0] == 'V'){ // "V" für Geschwindigkeit
n=2*inputChar[1];
periode=speed[n]; // Aus dem Array "speed" wird die entsprechende Periodendauer für die aktuelle Geschwindigkeit gewählt
}
if (inputChar[0] == 'P'){ // "P" für PZB, stellvertretend für alle Leuchtmelder
LmPZB(inputChar[1]); // Funktion siehe unten
}
Dasselbe noch für die Übertragung zum PC - hier funktioniert alles einwandfrei und die Daten kommen auch beim PC an:
'Einlesen der Werte vom Arduino
Serial.WriteLine("ii") '"ii" für "input"
System.Threading.Thread.Sleep(50)
If Serial.ReadLine() = "readytosend" & System.Text.Encoding.UTF8.GetString({13}) Then
Ist eine Verbindung da, werden die 4 Bytes vom Arduino eingelesen:
INa = Serial.ReadByte() 'Byte 0 - Digitaleingabe I
INb = Serial.ReadByte() 'Byte 1 - Digitaleingabe II
INc = Serial.ReadByte() 'Byte 2 - Analogwert Fahrschalter
INd = Serial.ReadByte() 'Byte 3 - Analogwert FbV
Zusätzlich noch die Ausgbe am Bildschirm:
Byte1.Text = INa
Byte2.Text = INb
Byte3.Text = INc
Byte4.Text = INd 'Ausgabe am Bildschirm FbV
Ich hoffe es kennt sich hier jemand auch in VB aus und kann mir bei der Problematik behilflich sein - wie gesagt, ich kann mir nicht erklären, wieso keine Daten übertragen werden können.
Gruß,
Se11001
