INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Serielle Schnittstelle - Daten empfangen
24.04.2016, 19:40
Beitrag #1
Serielle Schnittstelle - Daten empfangen
Hallo zusammen,

ich habe folgendes Programm geschrieben:

Code:
void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  String StringByte;
  // read from port 1, send to port 1:
  if (Serial1.available()) {
    char inByte = Serial1.read();
    StringByte = inByte;
    if (StringByte == "A180")
    Serial1.write(inByte);
  }
Ich sende vom PC den Wert: A180. Aber ich erhalte nichts zurück, weil die If-Bedingung nicht durchlaufen wird.

Welcher Wert steht nach dem Serial1.read() in inByte, wenn ich vom PC A180 sende?

Vielen Dank und Grüße

datatom
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.04.2016, 20:13
Beitrag #2
RE: Serielle Schnittstelle - Daten empfangen
Hi,
nun ich habe das zwar selber noch nicht benutzt. Aber eines ist sicher, durch das Serial.read liest du nur 1 Byte ein und das speicherst du dann immer an die gleiche Stelle in StringByte. Somit wirst du diesen String so nie vergleichen können.
Also um den String so vergleichen zu können mußt du das was per Serial.read reinkommt in ein Array speichern und hier nach jedem Zeichen den Index erhöhen. Zudem sollte dein Protokoll ein sicheres Startzeichen beinhalten auf das du das String einlesen starten tust. Zudem wäre noch ein Ende Zeichen der Übertragung sinnvoll um das Ende zu erkennen. Dann kannst du den String vergleichen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.04.2016, 16:38 (Dieser Beitrag wurde zuletzt bearbeitet: 29.04.2016 16:40 von avoid.)
Beitrag #3
RE: Serielle Schnittstelle - Daten empfangen
Code:
StringByte += inByte;
so ist es besser ...
sonst ist immer nur das gerade verarbeitete Zeichen im String.

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.04.2016, 10:05
Beitrag #4
RE: Serielle Schnittstelle - Daten empfangen
(29.04.2016 16:38)avoid schrieb:  
Code:
StringByte += inByte;
so ist es besser ...
sonst ist immer nur das gerade verarbeitete Zeichen im String.

..wenn das so funzt jepp.
Jetzt mußt nur noch auf das A dich synchrnisieren und dann den Rest einlesen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.05.2016, 12:52 (Dieser Beitrag wurde zuletzt bearbeitet: 22.05.2016 13:27 von Datatom.)
Beitrag #5
RE: Serielle Schnittstelle - Daten empfangen
Ok, danke.

Ich habe jetzt folgendes Programm geschrieben, wo ich die Daten vom PC einlese und zurück sende. Das klappt soweit. Wenn ich jetzt den String mit den gesendeten Daten vom PC auf der Wert A180 vergleichen will, klappt das nicht. Kann mir jemand sagen wo das Problem ist?

Code:
String inputString = "";
boolean stringComplete = false;

void setup() {
  Serial1.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  if (stringComplete)
  {
    if (inputString == "A180")
    {
      digitalWrite(13, HIGH);
      delay(300);
      digitalWrite(13, LOW);
      delay(300);
    }
    inputString = "";
    stringComplete = false;
  }
}

void serialEvent1() {

  while (Serial1.available()) {

    char inChar = (char)Serial1.read();
    Serial1.write(inChar);
    inputString += inChar;
    if (inChar == '\r')
    {
      stringComplete = true;
    }
  }
}

Vergleiche ich auf ungleich A180 blinkt das LED schön vor sich hin.

Hat das evtl. mit /r zu tun?

Vielen Dank für die Hilfe:-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.05.2016, 13:33
Beitrag #6
RE: Serielle Schnittstelle - Daten empfangen
ich sehe du benutzt "serialEvent1" und "Serial1" also verwendest du einen Arduino Mega?
Info: für alle die keinen Mega verwenden, geht das nur ohne die 1 hinten dran.

deinem Quellcode nach hängst du jedes empfangene Zeichen an den String an auch das "\r" womit "A180\r" drin steht und nicht nur A180.

mein Vorschlag:
Code:
void serialEvent1() {
   while (Serial1.available()) {
     char inChar = (char)Serial1.read();
     Serial1.write(inChar);
     if (inChar == '\r' || inChar == '\n')
     {
       stringComplete = true;
     }
     else
     {
       inputString += inChar;
     }
   }
}

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.05.2016, 14:27 (Dieser Beitrag wurde zuletzt bearbeitet: 22.05.2016 14:29 von Datatom.)
Beitrag #7
RE: Serielle Schnittstelle - Daten empfangen
Vielen Dank. Habe die If-Bedingung geändert auf

Code:
if (inputString == "A180\r")

Jetzt blinken die LED so wie es sein soll.

Ja ich habe einen Arduino Mega2560.

Die nächste Frage ist, wenn ich jetzt inputString auf mehrer Werte vergleichen möchte, schreibe ich dort jedes mal die if-Bedingung oder gibt es eine Möglichkkeit, wie z.B. case?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.05.2016, 14:52 (Dieser Beitrag wurde zuletzt bearbeitet: 22.05.2016 14:57 von rkuehle.)
Beitrag #8
RE: Serielle Schnittstelle - Daten empfangen
Hallo Datacom

Zitat:schreibe ich dort jedes mal die if-Bedingung oder gibt es eine Möglichkkeit, wie z.B. case?
In der Hoffnung, dass du jetzt nicht den Sprachumfang im Detail erklärt haben möchtest, erlaube ich mir mal den Verweis auf https://www.arduino.cc/en/Reference/HomePage bzw. auch auf die 1. Zeile der Signatur von avoid Big Grin
Tja, Arduino nutzen bedeutet eben auch viel viel lesen Confused

Grüße Ricardo

PS. Kleiner Effekt nebenbei für Linux Nutzer. Mit dem Kommando
Code:
stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
kann man sich das Terminalprogramm sparen und dem Arduino Daten direkt per
Code:
echo "A180" > /dev/ttyUSB0
schicken. Die Kommandos immer in einer Zeile. Das tty und die Baudrate müssen natürlich angepasst werden.

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Daten Visualisieren MeisterQ 12 580 01.12.2016 19:36
Letzter Beitrag: MeisterQ
  Data Logger Daten auf SD Card schreiben Crichton 12 316 22.11.2016 18:32
Letzter Beitrag: Crichton
  I2C Daten übertragen Gandalf 3 217 04.11.2016 13:20
Letzter Beitrag: hotsystems
  Daten über USB verarbeiten Felix91 10 331 12.10.2016 13:00
Letzter Beitrag: Tommy56
  Can-Bus Shield ok, aber keine Daten Clubsport 38 1.546 01.09.2016 14:17
Letzter Beitrag: Clubsport
  NRF24L01+ "Ping" senden, empfangen, bestätigen MeisterQ 8 389 23.08.2016 13:19
Letzter Beitrag: MeisterQ
  Daten an mysql diode1990 24 1.312 31.07.2016 10:29
Letzter Beitrag: Gandalf
  NRF24L01,Empfangene Daten auswerten Marc2014 9 533 30.07.2016 19:34
Letzter Beitrag: rkuehle
  Interrupt wenn softwareSerial Daten BennIY 3 449 01.05.2016 18:39
Letzter Beitrag: tiny85fan
  wie Parameter der seriellen Schnittstelle anpassen? avoid 6 487 29.04.2016 16:44
Letzter Beitrag: avoid

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste