Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Pages: [1] 2   Go Down
Author Topic: Problem mit Datenübertragung zum PC  (Read 1712 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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):
Code:
 
   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(<zahl>) 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:
Code:
            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:
Code:
  {
 
  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:
Code:
            '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:
Code:

                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:
Code:
                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
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 63
Posts: 3133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da du nur Schnipsel postest, liegt die Vermutung nah, dass das Problem in dem Teil ist, der fehlt smiley-wink
--> Sicher, dass alle Zeichen in deinem inputChar array sind ?

Quote
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.

So ganz klar ist mir die Problembeschreibung allerdings nicht:
Was meinst du mit "Verbindung herstellen" ?
   Serial.Open in VB ?

Oder dass genau dieses If erfüllt ist ?
If Serial.ReadLine() = "ready" & System.Text.Encoding.UTF8.GetString({13}) Then

Quote
println()
 
Description
 
Prints data to the serial port as human-readable ASCII text followed by a carriage return character (ASCII 13, or '\r') and a newline character (ASCII 10, or '\n'). This command takes the same forms as Serial.print().


Holst du auch das '\n' 10 ab ?

Warum hast du keinen Fehlerhinweis im Else zu diesem If ?

Ganz generell:
Deinen Verdacht auf Pufferüberlauf mit einem starren Timer anzugehen verstehe ich übrigens nicht.
Bei so schönen Dialogen zwischen den zweien ...

Ich versteh das so, dass der PC in beiden Richtungen als Master fungiert, und entweder Werte sendet oder eine Antwort haben will.
Wie synchronisieren sie sich eigentlich, wenn das Ganze ausser Tritt geraten ist ?

Hast du auch einen Test-Modus, der nicht alle 200ms was rausballert, und statt dessen auf dem PC anzeigt, was gesendet wurde und was empfangen wurde ?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo nochmals!

Da beide Programme relativ lang sind, habe ich mal nur ein paar Schnipsel gepostet, es sind jetzt aber beide Codes im Anhang.


Die Oberfläche des VB Programms sieht folgendermaßen aus:

Die eingelesenen Bytes werden direkt auf der rechten Seite angezeigt, und nehmen auch die Werte an, die vom Pult kommen.

Quote
Oder dass genau dieses If erfüllt ist ?
If Serial.ReadLine() = "ready" & System.Text.Encoding.UTF8.GetString({13}) Then
Das meinte ich damit, die Verbindung an sich wird ja erfolgreich hergestellt und läuft auch stabil. (in die eine Richtung)
Da die Verbindungsaufbau ja beim Einlesen der Werte und beim Verbinden des Arduinos nach dem verwendeten Prinzip ja funktioniert (lediglich mit unterschiedlichen Zeichen), glaube ich nicht dass es am println() liegt.

Quote
Warum hast du keinen Fehlerhinweis im Else zu diesem If ?
Mache ich gleich!

Quote
Deinen Verdacht auf Pufferüberlauf mit einem starren Timer anzugehen verstehe ich übrigens nicht.
Bei so schönen Dialogen zwischen den zweien ...
War nur meine Vermutung, jedenfalls fror das Programm ein nach ein paar Sekunden und ich musste die USB Verbindung neu herstellen.


Quote
Hast du auch einen Test-Modus, der nicht alle 200ms was rausballert, und statt dessen auf dem PC anzeigt, was gesendet wurde und was empfangen wurde ?
Gut, ich kann mal versuchen anstatt des Timers eine Schaltfläche zu benutzen. Was empfangen wurde, wird ja bereits angezeigt.




* Arduino_Programm.txt (10.15 KB - downloaded 18 times.)
* VB.txt (20.46 KB - downloaded 53 times.)
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 63
Posts: 3133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
void serialEvent() {                        // Es sind Daten vom PC zugespielt worden
  for (byte i=0; i<2;i++){
    inputChar[i]=Serial.read();             // inputChar[0] Ziel und inputChar[1] Wert zuweisen
    delay(2);                               // Da es seine Zeit braucht, bis der PC alles sendet, wird zwischen den Bytes etwas abgewartet
  }
  Serial.flush();                           // Falls aus irgend einem Grund nun noch Daten im Lesepuffer sind, wird dieser gelöscht
}
Soviel ich weiss, ist das keine Interrupt-Routine, sondern kommt zwischen 2 loop() dran, hab ich aber selbst keine Erfahrung mit.

Serial.flush() hat übrigens nun eine andere Funktion ( man muss die Jungs einfach mögen ) als früher, und als in deinem Kommentar steht.

Du liest also immer 2 Buchstaben. Falls da irgendein unsynchroniserter Schrott kommt (irgendwann mal gekkommen ist ), wird das ohne Kommentar ignoriert
Aber wenn der PC nichts mehr sendet, sollte alles sich beruhigen und es danach wieder gehen.

Dein Sketch kann ja eine ganze Reihe von Funktionen, gehen denn alle ausser "oo" ?  Da ist in deinem Sketch in Zeile 130 aber auch offensichtlich was verloren gegangen ...
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Soviel ich weiss, ist das keine Interrupt-Routine, sondern kommt zwischen 2 loop() dran, hab ich aber selbst keine Erfahrung mit.
Ja, das hat mit dem Interrupt auch nichts zu tun.

Quote
Du liest also immer 2 Buchstaben. Falls da irgendein unsynchroniserter Schrott kommt (irgendwann mal gekkommen ist ), wird das ohne Kommentar ignoriert
Aber wenn der PC nichts mehr sendet, sollte alles sich beruhigen und es danach wieder gehen.
Naja, aber ich lese ja nur, wenn die Verbindung beidseitig bestätigt wurde und übernommen wird der Wert auch nur wenn als erstes Byte ein definierter Buchstabe kommt.


Quote
Dein Sketch kann ja eine ganze Reihe von Funktionen, gehen denn alle ausser "oo" ?
Ansonsten funktioniert eigentlich alles, es bedarf lediglich noch einer Anpassung; wenn denn einmal Daten übertragen würden.  smiley-confuse


Quote
Da ist in deinem Sketch in Zeile 130 aber auch offensichtlich was verloren gegangen ...
Stimmt, im alten Sketch waren hier 2 Befehle vertauscht. War nicht die neueste Version, die ich vorhin angehängt habe.

* Arduino_Programm.txt (10.28 KB - downloaded 22 times.)
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 63
Posts: 3133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist doch auch Schrott. 

Entschuldige, willst du testen; ob jemand so lange sketches auch nur anschaut ?
Ich trau dir mal zu, dass man dir nicht erklären muss, was da steht.

( Falls doch: Serial.println() wartet nicht auf eine Antwort, das if in Zeile 6 kann nie true sein )

Code:
if (inputChar[0]=='o'){                    // Wird an erster Stelle ein "o" empfangen, will der PC Daten an den Arduino senden.
   Serial.println("ready");                   // Es wird mit "ready" quittiert.
   if (inputChar[1]=='o')                     // Steht an zweiter Stelle auch ein "o", wird eingelesen:
  {
   
  if (inputChar[0] == 'P'){                  // "P" für PZB, stellvertretend für alle Leuchtmelder
  LmPZB(inputChar[1]);                       // Funktion siehe unten
  }
 
  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] == 'H'){                  // "H" für Hauptluftbehälter
      servoHLB.write(127-inputChar[1]);      // Wir weisen dem entsprechenden Servoobjekt seinen Wert zu
  }
 
  if (inputChar[0] == 'M'){                  // "M" für Motorstrom
    analogWrite(2,255-(2*inputChar[1]));     // Wir geben den Wert von 0 - 255 PWM an Pin 2,3 aus
    analogWrite(3,255-(2*inputChar[1]));
    }
   
  if (inputChar[0] == 'N'){                  // "N" für Primärstrom
    analogWrite(9,255-(2*inputChar[1]));     // Wir geben den Wert von 0 - 255 PWM an Pin 4 aus
    }   
   
  if (inputChar[0] == 'X')                   // "X" - Stunde
  {                 
    h0 = inputChar[1]/10;                    // Aufspalten in 2 Ziffern
    h1 = inputChar[1]%10;
  }
 
  if (inputChar[0] == 'Y')                   // "Y" - Minute
  {       
    m0 = inputChar[1]/10;                    // Aufspalten in 2 Ziffern
    m1 = inputChar[1]%10; 
  }
  //displayDigits(); 
  }
   }
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Entschuldige, willst du testen; ob jemand so lange sketches auch nur anschaut ?
Das war ja auch der Grund, warum ich anfangs nur die relavanten Teile gepostet hatte, weil der Sketch eben sehr lang ist.

Wie erwähnt hatte diese Variante mit dem Ankündigungs- und Datenbyte bereits funktioniert, nur eben nicht auf Timerbasis.

Quote
Serial.println() wartet nicht auf eine Antwort, das if in Zeile 6 kann nie true sein
Sorry, ich verstehe nicht ganz, was das Serial.println() mit dem if in Zeile 6 zu tun hat. Das if aus Zeile 3 ist da ja bereits erfüllt.
Wie kann ich alternativ dafür sorgen, dass der Arduino weiß, welcher Wert übertragen werden soll?

Sorry wenn ich hier jemanden nerve, aber mir fällt derzeit einfach keine Lösung für das Problem ein.  smiley-red


Gruß,
Se11001
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 63
Posts: 3133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Sorry, ich verstehe nicht ganz, was das Serial.println() mit dem if in Zeile 6 zu tun hat.
Ich auch nicht, war nur meine Vermutung der Ursache deines Missverständnisses.

Sorry, irgendwer steht auf dem Schlauch:

  if (inputChar[0] == 'P'){   

Was soll diese Zeile und der ganze Rest, wenn du aus dem aussenliegenden if weisst, dass (inputChar[0] == 'o') ist ?

Nachdem "oo" empfangen wurde, beauftragst du das Senden von "ready\r\n".  Danach passiert nichts, bis du loop beendest. Dann geht das "ready" langsam auf die Leitung.  Irgendwann später sendet dein PC vielleicht was, das du wieder als 2 bytes aus inputChar picken kannst.
Dass du im oo - Modus bist und diese 2 Zeichen kein Kommando wie 'V' oder die anderen sein können, musst du dir wohl im Arduino merken und in den nächsten loop Durchläufen berücksichtigen.

Warum muss alles so kompliziert sein ? Kann der PC nicht alles einfach senden:  'o' <size> <byte0> <byte1> ...
'o' und die Größe steht dann in inputChar, der Rest kann, wenn das 'o' erkannt wurde, gleich -- mit delay(2) und available()-Prüfung -- mit Serial.read() gelesen und verarbeitet werden. Arduino kann ja am Ende mit einer Empfangsbestätigung antworten.
               
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aber klar doch, wenn ich als Bedingung festlege dass ein bestimmter Wert eingelesen wurde, dazwischen nicht neu eingelesen wird und ich anschließend nach einem anderen Wert abfrage, kann diese Bedingung nie erfüllt werden, danke.

Nun habe ich den Arduino Sketch folgendermaßen angepasst:
Code:
void loop()

{
  if (inputChar[0]=='w'){                    // Wenn wir an erster Stelle ein "w" empfangen, möchte der PC wissen, ob wir wirklich
    Serial.println("I am a drivers desk");   // der Arduino  für das Fahrpult sind. Das bestätigen wir mit "I am a drivers desk""
    if (inputChar[1]=='w'){                  // Wenn an zweiter Stelle ebenfalls ein "w" kommt, sollen wir akustisch quitieren
      tone(5, 1000, 100);
      delay(200);
      tone(5, 1000, 100);
    }
  }
 
    
  if (inputChar[0] == 'P'){                  // "P" für PZB, stellvertretend für alle Leuchtmelder
  LmPZB(inputChar[1]);                       // Funktion siehe unten
  }
  
  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] == 'H'){                  // "H" für Hauptluftbehälter
      servoHLB.write(127-inputChar[1]);      // Wir weisen dem entsprechenden Servoobjekt seinen Wert zu
  }
  
  if (inputChar[0] == 'M'){                  // "M" für Motorstrom
    analogWrite(2,255-(2*inputChar[1]));     // Wir geben den Wert von 0 - 255 PWM an Pin 2,3 aus
    analogWrite(3,255-(2*inputChar[1]));
    }
    
  if (inputChar[0] == 'N'){                  // "N" für Primärstrom
    analogWrite(9,255-(2*inputChar[1]));     // Wir geben den Wert von 0 - 255 PWM an Pin 4 aus
    }    
    
  if (inputChar[0] == 'X')                   // "X" - Stunde
  {                  
    h0 = inputChar[1]/10;                    // Aufspalten in 2 Ziffern
    h1 = inputChar[1]%10;
  }
  
  if (inputChar[0] == 'Y')                   // "Y" - Minute
  {      
    m0 = inputChar[1]/10;                    // Aufspalten in 2 Ziffern
    m1 = inputChar[1]%10;  
  }
  //displayDigits();  
  
  
  
   if (inputChar[0]=='i'){                    // Wenn wir an erster Stelle ein "w" empfangen, möchte der PC wissen, ob wir wirklich
   Serial.println("readytosend");  
   if (inputChar[1]=='i')
   {Input();
   }
 }  
}

Im VB Programm sende ich die Datenpakete im 15ms Takt:
Code:
      If +Serial.IsOpen Then


            Lm1 = CByte(44)
            OutChar(0) = 81     'P
            OutChar(1) = CByte(Math.Round(29))
            Serial.Write(OutChar, 0, 2)
            O1.Text = Lm1

            System.Threading.Thread.Sleep(15)

            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)
            O2.Text = V

            System.Threading.Thread.Sleep(15)

            OutChar(0) = 46     'B
            OutChar(1) = B
            Serial.Write(OutChar, 0, 2)
            O3.Text = B
...

Eigentlich sollte der Arduino loop ja wesentlich schneller durchlaufen werden als die 15ms aus dem VB Programm und somit jeder Wert eingelesen werden, nun kommt aber trotzdem nichts an beim Arduino.
« Last Edit: February 28, 2013, 09:42:23 am by Se11001 » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 63
Posts: 3133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
nun kommt aber trotzdem nichts an beim Arduino
nichts oder "nicht das erwartete"
Wie erkennst du was der Arduino empfängt wenn es nicht in deiner if - Liste vorkommt ....
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hm, müsste das nicht eigentlich egal sein? Ist eine If Bedingung erfüllt, werden die inputChar[] Bytes ja auch nur "angschaut" und in eine andere Variable kopiert, und ansonsten nichts gemacht.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 63
Posts: 3133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
nun kommt aber trotzdem nichts an beim Arduino.

Irgendwas wird schon ankommen, wenn der PC was sendet. Mit USB - Verbindung sollte es auch kein Kabel-Problem sein.


Mit sowas wie
Quote
Code:
      tone(5, 1000, 100);
      delay(200);
      tone(5, 1000, 100);

ist dein Arduino natürlich erstmal beschäftigt, was der PC in dieser Zeit sendet, rauscht erst anschliessend durch deinen 2-Byte Puffer


Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja schon, aber ich verbinde ja nur einmal und da stören die 200ms nicht wirklich.

Ich habe nun das VB Programm so verändert, dass ich einfach mit Serial.Write arbeite, und siehe da - es kommt etwas an:

Code:
             Serial.DiscardOutBuffer()
            Serial.Write("P")
            Serial.Write(Lm1)
            O1.Text = Lm1

            Serial.DiscardOutBuffer()
            System.Threading.Thread.Sleep(15)

            V = Analogwert.Value
            Serial.Write("V")
            Serial.Write(V)
            O2.Text = V

            System.Threading.Thread.Sleep(15)

...

Das "Analogwert.Value" ist ein Slider fürs Debuggen, somit kann ich einen beliebigen Wert einstellen.

Der Arduino empfängt jetzt die Buchstaben korrekt und kann so die übertragenen Werte schon richtig zuordnen. Einziges Problem ist, dass die Werte nicht korrekt übertragen werden. Zum Testen habe ich das Programm am Arduino so angepasst, dass er den eingelesenen Wert wieder zurück an den PC schickt. Übertrage ich zum Arduino 0, kommt 48 zurück, bei 1 kommt 49, das geht bis 9 - 57 ab dann kommt immer 48 zurück. Ab undzu springt es auch auf 255.

 Wo kann hier noch der Fehler liegen?

« Last Edit: February 28, 2013, 12:33:13 pm by Se11001 » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 63
Posts: 3133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Übertrage ich zum Arduino 0, kommt 48 zurück

Das ist kein Fehler smiley-wink
Wenn du mit Basic eine 0 als Text überträgst kommt eine '0' an, und dieser Buchstabe hat den Zahlenwert 48 ( oder 0x30 ) .
Ein 'A' kannst du auch übertragen, das wäre als Zahl eine 65, etc.

Problem ist, wenn du einen Wert > 10 hast, und der als Text, z.B.  "123" übertragen wird.
Dann kommen 3 Byte an: 48, 49, 50 aber du willst nur eins , nämlich die 123.

Die passende Funktion in Basic heisst Chr(x) : Chr(123) = 0x7B = ' { '

Probier mal
Dim val As Byte = Analogwert.Value
Serial.Write("V" & Chr(val))




255 ist die berühmte -1, wenn du ein Serial.Read() machst und gar nichts zu lesen da ist.
Wenn du auch echte 255 hast, musst du
entweder erst auf Serial.available() abfragen, oder in einen int statt ein byte einlesen.

Code:
int i = Serial.read();
if (i != -1)
{
 // i hat jetzt einen Wert zwischen 0 und 255 und kann ohne Informationsverlust als byte verarbeitet werden.
 byte c = (byte)i;
}
else
{
  // kein Zeichen zu lesen


Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, danke für die Info - hätte ich mir auch denken können. Ich dachte solange kein " " verwendet wird, wird der Wert an sich gesendet.

Hm, die Funktion Chr(x) scheint nicht existent zu sein? smiley-slim (Verwende VB2010 Express)

Logged

Pages: [1] 2   Go Up
Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Jump to: