Solved: Sensor auslesen über RS422 - TTL Wandler

Hallo, ich versuche grade ein NMEA 0183 Anemometer (dieses hier) mit einem Arduino UNO auszulesen (auslesen ist vorerst ausreichend, senden muss ich nicht unbedingt). Laut Datenblatt des Anemometers kommuniziert es über de RS422 Standard mit einer baudrate von 4800. Ich habe daher so ein Modul wie in diesem tutorial als Level-Shifter im Einsatz. Eigentlich ist es für RS485 gedacht, unterstützt laut Datenblatt aber auch RS422. Ansonsten habe ich kaum RS422 Module gefunden, der Standard scheint nicht so verbreitet zu sein. Angeschlossen ist das RS485 Modul wie im verlinkten Tutorial.
Zum Empfangen der Daten und Ausgeben auf dem Serial Monitor verwende ich folgenden Code:

#include <SoftwareSerial.h>
#include <MemoryFree.h>



SoftwareSerial Serial2(2, 3); // emulating a second serial port using pin 2 and 3

String ReadStringWind;


void setup() {  
  Serial.begin(9600);  //Arduino serial monitor thru USB cable 
  Serial2.begin(4800); // Emulated Serial1 port connected to anemometer

}
  
void loop() {  
  
//Parsing
  ReadStringWind=Serial2.readStringUntil(13);   //NMEA data ends with 'return' character, which is ascii(13)
  ReadStringWind.trim();                      // they say NMEA data starts with "$", but the Arduino doesn't think so.
   //Serial.println(ReadStringWind);         //All the raw sentences will be sent to monitor, if you want them, maybe to see the labels and data order.

  //Start Parsing by finding data, put it in a string of character array, then removing it, leaving the rest of thes sentence for the next 'find'
   if (ReadStringWind.startsWith("$WIMWV")) {   //I picked this sentence, you can pick any of the other labels and rearrange/add sections as needed. 
     Serial.println(ReadStringWind);     // display raw data in Serial Monitor

    }
     }

Das funktioniert soweit ganz gut, ich bekomme im Serial Monitor NMEA Sätze angezeigt:


Wie man leider aber auch sieht kommen diese NMEA Sätze sehr unregelmäßig. Laut Datenblatt hat das Anemometer eine Samplerate von 500 ms. Weiß jemand woran es liegen könnte, dass nur so unregelmäßig vollständige Sätze am UNO ankommen?
Ich habe hier nun schon mehrfach gelesen das die Verwendung von Strings sehr unvorteilhaft sein kann. In einem anderen Programm verwende ich jedoch den gleichen code (natürlich etwas angepasst) um ein NMEA 0183 GPS auszulesen. Dort funktioniert alles hervorragend, daher bin ich eigentlich davon ausgegangen das würde hier auch so sein.

Durch die if-Schleife am Ende meines Codes filtere ich ja schon nach Sätzen mit dem korrekten Präfix "$WIMWV". Wenn ich diesen Teil auskommentiere und einfach nach jedem Durchlauf meinen Readstring ausgeben lasse sehe ich soetwas im Serial Monitor:


Jede Menge Müll und der Gültige NMEA Satz irgendwo dazwischen. Es gibt bei dieser Ausgabe eine gewisse Regelmäßigkeit, mehr gültige NMEA Sätze als vorher kann ich jedoch nicht finden.

Hat jemand einen Tipp woran es liegen könnte oder wie ich am besten beim Debuggen vorgehen kann?

Hallo
Schaue mal hier, vielleicht ist der NMEA Parser hilfreich.

Ich sehe da nichts. Kannst Du mal bitte das, was auf dem SerMon rauskommt einfach in codetags hier einfügen?

Ist das der komplette Code?
Du hast keinen Parser und nichts weiter dran.
Wenn Du den Anfang verpasst, dann must den DS verwerfen und auf den nächsten warten.
sonst passiert eben das:

Bedenke! Die Ausgabe auf dem SerMon braucht Zeit!
Den Anfng zu verpassen ist damit vorprogrammiert!

Setze den SerMon MINDESTENS auf 115200. Dann könnte es besser werden.

Ansonsten gab es schon einen NMEA-Thread die letzten Tage:

Wie selber geparst werden kann, haben wir in einem anderen Thread auch mal erarbeitet…
Es ist wurscht, welcher Übertragungsweg genutzt wird. Die Daten sind immer gleich…

Danke für die schnellen Antworten. Zur besseren Übersicht hier die Ausgabe des serial monitors in codetags:

18:03:12.100 -> ,0,MWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> V,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> V,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:12.100 -> ,IMWV,NAK
18:03:13.743 -> r⸮A
18:03:13.743 -> WI,N,A
18:03:13.790 -> WI,N,A
18:03:13.790 -> WI,N,A
18:03:13.790 -> WI,N,A
18:03:13.838 -> WI,N,A
18:03:13.838 -> WI,N,A
18:03:13.838 -> WI,N,A
18:03:13.885 -> WI,N,A
18:03:13.885 -> WI,N,A
18:03:13.885 -> WI,N,A
18:03:13.933 -> WI,N,A
18:03:13.933 -> WI,N,A
18:03:13.933 -> WI,N,A
18:03:13.979 -> WI,N,A
18:03:13.979 -> WI,N,A
18:03:14.026 -> WI,N,A
18:03:14.026 -> WI,N,A
18:03:14.026 -> WI,N,A
18:03:14.142 -> WI,N,A
18:03:14.142 -> WI,N,A
18:03:14.142 -> WI,N,A
18:03:14.142 -> $WIMWV,139.9,R,0.0,N,A
18:03:14.167 -> WPATC,WIMWV,NAK
18:03:14.213 -> WPATC,WIMWV,NAK
18:03:14.260 -> WPATC,WIMWV,NAK
18:03:14.307 -> WPATC,WIMWV,NAK
18:03:14.307 -> WPATC,WIMWV,NAK
18:03:14.354 -> WPATC,WIMWV,NAK
18:03:14.399 -> WPATC,WIMWV,NAK
18:03:14.445 -> WPATC,WIMWV,NAK
18:03:14.492 -> WPATC,WIMWV,NAK
18:03:14.492 -> WPATC,WIMWV,NAK
18:03:14.539 -> WPATC,WIMWV,NAK
18:03:14.585 -> WPATC,WIMWV,N0,N,A
18:03:14.632 -> V,N0,N,A
18:03:14.632 -> V,N0,N,A
18:03:14.678 -> V,N0,N,A
18:03:14.678 -> V,N0,N,A
18:03:14.678 -> V,N0,N,A
18:03:14.725 -> V,N0,N,A
18:03:14.725 -> V,N0,N,A
18:03:14.771 -> V,N0,N,A
18:03:14.771 -> V,N0,N,A
18:03:14.819 -> V,N0,N,A
18:03:14.819 -> V,N0,N,A
18:03:14.865 -> V,N0,N,A
18:03:14.865 -> V,N0,N,A
18:03:14.865 -> V,N0,N,A
18:03:14.910 -> V,N0,N,A
18:03:14.910 -> V,N0,N,A
18:03:14.957 -> V,N0,N,A
18:03:14.957 -> V,N0,N,A
18:03:15.003 -> V,N0,N,A
18:03:15.003 -> V,N0,N,A
18:03:15.098 -> V,N0,N,A
18:03:15.098 -> V,N0,N,A
18:03:15.098 -> V,N0,N,A
18:03:15.616 -> V,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N$WIMWV,139.9,R,0.0,N,A
18:03:15.799 -> ,IMWV,NAK
18:03:15.847 -> ,IMWV,NAK
18:03:15.847 -> ,IMWV,NAK
18:03:15.847 -> ,IMWV,NAK
18:03:15.847 -> ,IMWV,NAK
18:03:15.847 -> ,IAK
18:03:15.847 -> ,IMWV,NAK
18:03:15.893 -> ,IMWV,NAK
18:03:15.893 -> ,IMWV,NAK
18:03:15.893 -> ,IMWV,NAK
18:03:15.893 -> ,IMWV,NAK
18:03:15.941 -> ,IMWV,NAK
18:03:15.941 -> ,IMWV,NAK
18:03:15.987 -> ,IMWV,NAK
18:03:15.987 -> ,IMWV,NAK
18:03:16.034 -> ,IMWV,NAK
18:03:16.034 -> ,IMWV,NAK
18:03:16.172 -> ,IMWV,NAK
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.647 -> 
18:03:16.647 -> 
18:03:16.647 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.693 -> ,
18:03:16.693 -> 
18:03:16.693 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.739 -> 
18:03:16.739 -> 
18:03:16.739 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.787 -> ,
18:03:16.787 -> 
18:03:16.787 -> 
18:03:16.833 -> $WIMWV,139.9,R,0.0,N,A
18:03:16.833 -> ,,WIMWV,NAK
18:03:16.833 -> ,,WIMWV,NAK
18:03:16.833 -> ,,WIMWV,NAK
18:03:16.833 -> ,,WIMWV,NAK
18:03:16.879 -> ,,WIMW
18:03:16.879 -> 
18:03:16.879 -> ,,WIMWV,NAK
18:03:16.879 -> ,,WIMWV,NAK
18:03:16.879 -> ,,WIMWV,NAK
18:03:16.879 -> ,,WIMWV,NAK
18:03:16.925 -> ,,WIMWV,NAK
18:03:16.972 -> ,,WIMWV,NAK
18:03:16.972 -> ,,WIMWV,NAK
18:03:17.017 -> ,,WIMWV,NAK
18:03:17.063 -> ,,WIMWV,NAK
18:03:17.063 -> ,,WIMWV,NAK
18:03:17.130 -> ,,WIA
18:03:17.130 -> ,WIA
18:03:17.130 -> ,WIA
18:03:17.130 -> ,WIA
18:03:17.130 -> ,WIA
18:03:17.158 -> ,WIA
18:03:17.158 -> ,WIA
18:03:17.204 -> ,WIA
18:03:17.204 -> ,WIA
18:03:17.204 -> ,WIA
18:03:17.204 -> ,WIA
18:03:17.253 -> ,WIA
18:03:17.253 -> ,WIA
18:03:17.253 -> ,WIA
18:03:17.253 -> ,WIA
18:03:17.299 -> ,WIA
18:03:17.299 -> ,WIA
18:03:17.299 -> ,WIA
18:03:17.299 -> ,WIA
18:03:17.347 -> ,WIA
18:03:17.347 -> ,WIA
18:03:17.347 -> ,WIA
18:03:17.392 -> ,WIA
18:03:17.392 -> ,WIA
18:03:17.392 -> ,WIA
18:03:17.392 -> ,WIA
18:03:17.439 -> ,WIA
18:03:17.439 -> ,WIA
18:03:17.439 -> ,WIA
18:03:17.439 -> ,WIA
18:03:17.486 -> ,WIA
18:03:17.486 -> ,WIA
18:03:17.486 -> ,WIA
18:03:17.486 -> ,WIA
18:03:17.534 -> ,WIA
18:03:17.534 -> ,WIA
18:03:17.534 -> ,WIA
18:03:17.534 -> ,WIA
18:03:17.579 -> ,WIA
18:03:17.579 -> ,WIA
18:03:17.579 -> ,WIA
18:03:17.628 -> ,W$WIMWV,139.9,R,0.0,N,A
18:03:17.674 -> ITC,WIMWV,NAK
18:03:17.722 -> ITC,WIMWV,NAK
18:03:17.768 -> ITC,WIMWV,NAK
18:03:17.768 -> ITC,WIMWV,NAK
18:03:17.815 -> ITC,WIMWV,NAK
18:03:17.862 -> ITC,WIMWV,NAK
18:03:17.862 -> ITC,WIMWV,NAK
18:03:17.908 -> ITC,WIMWV,NAK
18:03:17.957 -> ITC,WIMWV,NAK
18:03:17.957 -> ITC,WIMWV,NAK
18:03:18.004 -> ITC,WIMWV,NAK
18:03:18.051 -> ITC,WIMWV,NAK
18:03:18.201 -> ITC,WIMWV,NAK
18:03:18.201 -> ITC,N,A
18:03:18.201 -> TC,N,A
18:03:18.201 -> TC,N,A
18:03:18.201 -> TC,N,A
18:03:18.201 -> TC,N,A
18:03:18.201 -> TC,N,A

Korrekt, das parsen habe ich im oben geposteten Minimalbeispiel weggelassen. Mache ich übrigens auch selber ohne library, aber das ist ein anderes Thema.
Ich möchte grade nur das anzeigen lassen was vom Sensor kommt, ohne etwas damit zu machen. Eine Erhöhung der baudrate bei der seriellen Ausgabe hat nichts verändert. Neben den sporadisch eingestreuten NMEA Sätzen befindet sich immernoch viel anderer Kram in der Ausgabe den ich nicht zuordnen kann. Mir ist bewusst, dass es bei Zeitüberschreitung zu verlusten einzelner NMEA Sätze kommen kann. Meinem Verständnis nach müsste mein code dann aber einfach bis zum nächsten Satz lauschen und diesen Ausgebe (für die spätere Anwendung wäre das übrigens vollkommen ausreichend). Das filtern nach vollständigen Sätzen habe ich in meinem code aber erstmal auskommentier. Mein readstring nimmt einfach alles auf bis ein (asci 13, Endmarker eines NMEA Satzes) kommt und gibt es aus. Wenn es nun zu bruchstückhafter aufnahme von NMEA Sätzen in den String kommen sollte (weil der code z. B. zu langsam ist und erst in der mitte eines Satzes anfängt zuzuhören) müsste die Ausgabe im Seriellen Monitor doch wenigstens aus deutlich erkennbaren Bruchstücken des NMEA Satzes bestehen oder ist diese Annahme falsch? Die vielen Ausgaben zwischen den NMEA Sätzen sehen leider so garnicht aus wie irgendwelche Bestandteile des korrekten satzes. Habe ich einen Denkfehler?

Hallo,
dann mache es dir noch einfacher:
Gebe alles aus was zwischen $ und CRLF steht.
Somit sollten alle Datensätze sichtbar werden, die vom Sensor gesendet werden.

Ja. Da fehlt Dir der Anfang.
Der DS ist zu verwerfen, weil das erste Datenfeld nicht auf den zu parsenden Inhalt passt.
Und dann folgt später das ständige ausgeben und Du verfehlst den Inhalt vollständig.

Das kannst Du selber parsen.
Hast Du eine Datensatzbeschreibung, was Du da auswerten willst?

Wir haben das so ähnlich bis 115200 am Eingang(!) getestet.

Der Thread ist länger (und geht später auch an anderer Stelle weiter) - aber da siehst Du wie man sowas lösen kann, wenn mehr als ein Datenfeld ausgewertet werden soll.

Ansonsten - ich würde ggfls. jedes einzelne Zeichen was eingelesen wurde auch ausgeben. und nicht mit String…
edit:
Was wird Dir ausgegeben, wenn Du das laufen lässt…

#include <SoftwareSerial.h>
SoftwareSerial Serial2(2, 3); // emulating a second serial port using pin 2 and 3

char a;
void setup() {
  Serial.begin(115200);  //Arduino serial monitor thru USB cable
  Serial2.begin(4800); // Emulated Serial1 port connected to anemometer
  Serial.println(F("Start..."));
}

void loop() {
  while (Serial2.available())
  {
    char a = Serial2.read();
    Serial.print(a);
  }
}

Danke für die schnelle Antwort. Laut Datenblatt des sensors sendet er alle 500 ms einen Satz der so aussieht: $WIMWV,a.a,R,s.s,N,A*hhhh<CR><LF>
Ab und zu ist genau dieser Satz in der Ausgabe ja auch zu erkennen. Woran siehst du dass zum Beispiel hier

19:29:28.799 -> ,WIN,A
19:29:28.799 -> ,WIN,A
19:29:28.844 -> ,WIN,A
19:29:28.844 -> ,WIN,A
19:29:28.844 -> $WIMWV,139.8,R,0.0,N,A
19:29:28.892 -> ,PATC,WIMWV,NAK
19:29:28.938 -> 
19:29:28.938 -> ,PATC,WIMWV,NAK
19:29:28.986 -> 
19:29:28.986 -> ,PATC,WIMWV,NAK

alles über und unter dem korrekten Satz Bruchstücke von unvollständigen Sätzen sind? PATC oder NAC zum Beispiel kommt doch im eigentlichen Satz garnicht vor oder stehe ich irgendwo auf dem Schlauch?

Wenn ich das von dir erstellte Testeispiel (vielen Dank dafür) laufen lasse ändert sich an der Ausgabe nicht viel:

19:29:25.240 -> Start...
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,A
19:29:25.240 -> ,N.0,N,AStart...
19:29:26.883 -> 	br⸮A
19:29:26.883 -> 
19:29:26.883 -> ,WIMWV,NAK
19:29:26.925 -> 
19:29:26.925 -> 
19:29:26.925 -> ,WIMWV,NAK
19:29:26.972 -> 
19:29:26.972 -> 
19:29:26.972 -> ,WIMWV,NAK
19:29:26.972 -> 
19:29:26.972 -> 
19:29:26.972 -> ,WIMWV,NAK
19:29:27.019 -> 
19:29:27.019 -> 
19:29:27.019 -> ,WIMWV,NAK
19:29:27.065 -> 
19:29:27.065 -> 
19:29:27.065 -> ,WIMWV,NAK
19:29:27.065 -> 
19:29:27.065 -> 
19:29:27.065 -> ,WIMWV,NAK
19:29:27.112 -> 
19:29:27.112 -> 
19:29:27.112 -> ,WIMWV,NAK
19:29:27.112 -> 
19:29:27.159 -> 
19:29:27.159 -> ,WIMWV,NAK
19:29:27.159 -> 
19:29:27.159 -> 
19:29:27.159 -> ,WIMWV,NAK
19:29:27.207 -> 
19:29:27.207 -> 
19:29:27.207 -> ,WIMWV,NAK
19:29:27.207 -> 
19:29:27.207 -> 
19:29:27.207 -> ,WIMWV,NAK
19:29:27.255 -> 
19:29:27.255 -> 
19:29:27.255 -> ,WIMWV,NAK
19:29:27.300 -> 
19:29:27.300 -> 
19:29:27.300 -> ,WIMWV,NAK
19:29:27.300 -> 
19:29:27.300 -> 
19:29:27.300 -> ,WIMWV,NAK
19:29:27.349 -> 
19:29:27.349 -> 
19:29:27.349 -> ,WIMA
19:29:27.349 -> WIMA
19:29:27.349 -> WIMA
19:29:27.395 -> WIMA
19:29:27.395 -> WIMA
19:29:27.395 -> WIMA
19:29:27.395 -> WIMA
19:29:27.442 -> WIMA
19:29:27.442 -> WIMA
19:29:27.442 -> WIMA
19:29:27.489 -> WIMA
19:29:27.489 -> WIMA
19:29:27.489 -> WIMA
19:29:27.489 -> WIMA
19:29:27.534 -> WIMA
19:29:27.534 -> WIMA
19:29:27.534 -> WIMA
19:29:27.584 -> WIMA
19:29:27.584 -> WIMA
19:29:27.584 -> WIMA
19:29:27.584 -> WIMA
19:29:27.628 -> WIMA
19:29:27.628 -> WIMA
19:29:27.628 -> WIMA
19:29:27.628 -> WIMA
19:29:27.675 -> WIMA
19:29:27.675 -> WIMA
19:29:27.675 -> WIMA
19:29:27.675 -> WIMA
19:29:27.723 -> WIMA
19:29:27.723 -> WIMA
19:29:27.723 -> WIMA
19:29:27.723 -> WIMA
19:29:27.769 -> WIMA
19:29:27.769 -> WIMA
19:29:27.769 -> WIMA
19:29:27.816 -> WIMA
19:29:27.816 -> WIMA
19:29:27.816 -> WIMA
19:29:27.816 -> WIMA
19:29:27.862 -> WIMA
19:29:27.862 -> $WIMWV,139.8,R,0.0,N,A
19:29:27.909 -> WTC,WIMWV,NAK
19:29:27.955 -> 
19:29:27.955 -> WTC,WIMWV,NAK
19:29:27.955 -> 
19:29:27.955 -> WTC,WIMWV,NAK
19:29:28.002 -> 
19:29:28.002 -> WTC,WIMWV,NAK
19:29:28.049 -> 
19:29:28.049 -> WTC,WIMWV,NAK
19:29:28.096 -> 
19:29:28.096 -> WTC,WIMWV,NAK
19:29:28.096 -> 
19:29:28.096 -> WTC,WIMWV,NAK
19:29:28.143 -> 
19:29:28.143 -> WTC,WIMWV,NAK
19:29:28.189 -> 
19:29:28.189 -> WTC,WIMWV,NAK
19:29:28.189 -> 
19:29:28.189 -> WTC,WIMWV,NAK
19:29:28.236 -> 
19:29:28.236 -> WTC,WIMWV,NAK
19:29:28.284 -> 
19:29:28.284 -> WTC,WIMWV,NAK
19:29:28.331 -> 
19:29:28.331 -> WTC,WIMWV,NAK
19:29:28.331 -> 
19:29:28.331 -> WTC,WIN,A
19:29:28.378 -> ,WIN,A
19:29:28.378 -> ,WIN,A
19:29:28.378 -> ,WIN,A
19:29:28.424 -> ,WIN,A
19:29:28.424 -> ,WIN,A
19:29:28.424 -> ,WIN,A
19:29:28.471 -> ,WIN,A
19:29:28.471 -> ,WIN,A
19:29:28.517 -> ,WIN,A
19:29:28.517 -> ,WIN,A
19:29:28.517 -> ,WIN,A
19:29:28.566 -> ,WIN,A
19:29:28.566 -> ,WIN,A
19:29:28.566 -> ,WIN,A
19:29:28.612 -> ,WIN,A
19:29:28.612 -> ,WIN,A
19:29:28.612 -> ,WIN,A
19:29:28.659 -> ,WIN,A
19:29:28.659 -> ,WIN,A
19:29:28.659 -> ,WIN,A
19:29:28.705 -> ,WIN,A
19:29:28.705 -> ,WIN,A
19:29:28.752 -> ,WIN,A
19:29:28.752 -> ,WIN,A
19:29:28.752 -> ,WIN,A
19:29:28.799 -> ,WIN,A
19:29:28.799 -> ,WIN,A
19:29:28.799 -> ,WIN,A
19:29:28.844 -> ,WIN,A
19:29:28.844 -> ,WIN,A
19:29:28.844 -> $WIMWV,139.8,R,0.0,N,A
19:29:28.892 -> ,PATC,WIMWV,NAK
19:29:28.938 -> 
19:29:28.938 -> ,PATC,WIMWV,NAK
19:29:28.986 -> 
19:29:28.986 -> ,PATC,WIMWV,NAK
19:29:29.032 -> 
19:29:29.032 -> ,PATC,WIMWV,NAK
19:29:29.078 -> 
19:29:29.078 -> ,PATC,WIMWV,NAK
19:29:29.078 -> 
19:29:29.078 -> ,PATC,WIMWV,NAK
19:29:29.125 -> 
19:29:29.125 -> ,PATC,WIMWV,NAK
19:29:29.172 -> 
19:29:29.172 -> ,PATC,WIMWV,NAK
19:29:29.219 -> 
19:29:29.219 -> ,PATC,WIMWV,NAK
19:29:29.266 -> 
19:29:29.266 -> ,PATC,WIMWV,NAK
19:29:29.266 -> 
19:29:29.312 -> ,PATC,WIMWV,NAK
19:29:29.312 -> 
19:29:29.312 -> ,PATC,WIMWV,NA.0,N,A
19:29:29.359 -> NA.0,N,A
19:29:29.406 -> NA.0,N,A
19:29:29.406 -> NA.0,N,A
19:29:29.453 -> NA.0,N,A
19:29:29.453 -> NA.0,N,A
19:29:29.500 -> NA.0,N,A
19:29:29.500 -> NA.0,N,A
19:29:29.500 -> NA.0,N,A
19:29:29.547 -> NA.0,N,A
19:29:29.547 -> NA.0,N,A
19:29:29.592 -> NA.0,N,A
19:29:29.592 -> NA.0,N,A
19:29:29.639 -> NA.0,N,A
19:29:29.639 -> NA.0,N,A
19:29:29.687 -> NA.0,N,A
19:29:29.687 -> NA.0,N,A
19:29:29.687 -> NA.0,N,A
19:29:29.734 -> NA.0,N,A
19:29:29.734 -> NA.0,N,A
19:29:29.780 -> NA.0,N,A
19:29:29.780 -> NA.0,N,A
19:29:29.826 -> NA.0,N,A
19:29:29.826 -> NA.0,N,A
19:29:29.872 -> NA.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$WIMWV,139.8,R,0.0,N,A
19:29:30.432 -> 0IMWV,NAK
19:29:30.432 -> 
19:29:30.432 -> 0IMWV,NAK
19:29:30.478 -> 
19:29:30.478 -> 0IMWV,NAK
19:29:30.478 -> 
19:29:30.478 -> 0IMWV,NAK
19:29:30.526 -> 
19:29:30.526 -> 0IMWV,NAK
19:29:30.526 -> 
19:29:30.526 -> 0IMWV,NAK
19:29:30.571 -> 
19:29:30.571 -> 0IMWV,NAK
19:29:30.571 -> 
19:29:30.571 -> 0IMWV,NAK
19:29:30.619 -> 
19:29:30.619 -> 0IMWV,NAK

Hallo paulpaulson, wenn ich die letzte If-Schleife in meine code aktiviere gebe ich ja alles aus was mit einem asci 13 endet und mit $WIMWV anfängt. Ist das ein Unterschied zu der von dir vorgeschlagenen Lösung? Wenn ich drüber nachdenke müsste es eigentlich auf das gleiche hinauslaufen, oder täusche ich mich da durch den zeitlichen Verzug im code?

Ich habe grade festgestellt, das zum Beispiel PATC der Präfix eines Input-Satzes in der Form

$PATC,IIMWV,AHD,x.x<CR><LF> //set reference direction offset
$PATC,IIMWV,DWD,x.x<CR><LF> //set dir damping % - 000 to 999 (default 500ms)
$PATC,IIMWV,TXP,xxx<CR><LF> //output sentence rate in ms (default 500ms)
$PATC,IIMWV,DSP,xxx<CR><LF> //set speed damping % - 000 to 999 (default 500)
$PATC,IIMWV,RID<CR><LF> //report ID
$PATC,IIMWV,CFG,xy<CR><LF> //configure command. Default x=y=0. See manual for details.

ist (siehe spec-sheet 2. Seite). Mich bringt das der Lösung grade nicht weiter aber vielleicht hilft euch diese Information ja.

Ich hab mal kurz in das pdf geschaut und wenn ich Deinen ersten Post nehme, dann denke ich das Du ein Problem mit dem Bus hast.

Wie sieht der Aufbau aus? Wieviel Mtr. Kabel liegen da schon zwischen und was hast Du als Versorgung (Netzteil? Typ?) auf der Sensorseite?
was ist das für ein Wandler? gibt es dazu ein Datenblatt (link)
Solange Du mit dem Kurzsketch kein sauberes Ergebnis bekommst, brauchst nicht weitermachen…

Der Aufbau hat im Moment Schreibtischgröße und soll später noch deutlich verkleinert werden. Vom Sensor kommt ein 1m langes Originalkabel. An die Enden habe ich Jumper gelötet, die dann dierekt ins Steckbrett mit dem Max485 Modul gehen. Verwendet habe ich dieses, das auch hier noch mal näher beschrieben wird. Das Anemometer wird mit einem Labornetzteil versorgt.
NMEA In+ und NMEA Out+ des Sensors habe ich auf Eingang A und B des Max485 Moduls gelegt. Vcc und Gnd des Moduls sind mit 5V und Gnd des UNO verbunden. Auf der anderen Seite habe ich Ro mit Pin2 (receive) und Di mit Pin3 (transmit) verbunden. Die beiden mittleren Pins sind beide mit GND des UNO verbunden um das Modul gemäß dieser Anleitung auf “receive” zu stellen.

Hier ein beschriftetes Foto des Aufbaus:

Aktuell gibt es keine Verbindung von Netzteil GND und Arduino GND. Könnte das eine mögliche Fehlerquelle sein? Kann ich GND des Labornetzteils und GND des Arduinos so einfach miteinander verbinden?

1 Like

Allein für das Foto gibts nen ++
Das hast richtig gut gemacht…

Ich hab aus Deinem PDF noch, das da ja das Kompassmodul dran hängt.
Aus dem mir rausgesuchten Manual geht die Beschaltung am Serial-Port hervor.
https://www.flotecmarin.se/pdf/A5022_manual_2013_GT_rev1.pdf (2.2)

Ich hab noch keine Idee, was Du da für ein RS422-Modul hast, aber die Beschaltung ist nicht funktional.
Du hast auf der HighSide die 5V vom Arduino dran. Die Kabel gehören da weg. Beide.
Der schwarze (GND) auf dem rechten Brett gehört auf das rechte Steckbrett an GND.
Der rote vom rechten nach dem linken Brett wohl muss weg!
Ob da überhaupt was ran muss, geht nur aus ner Doku rauszulesen…

Danke my_xy_projekt, wenn sich schon hilfsbereite Leute wie du mit meinen Problemen beschäftigen soll es wenigstens leicht verständlich sein.

Das mit dem Kompass ist mir neu, den besitze ich nicht. Ich habe nur das Anemometer. Da ist garantiert kein Kompass drin integriert. Ich glaube es handelt sich dabei um ein anderes Produkt.

Ein richtiges Datenblatt zu dem Modul gibt es leider nicht. Der Aufbau ist aber eigentlich ganz simpel:


Es ist ein Maxim 485 verbaut (das Datenblatt zu dem Chip gibt es hier bei Maxim zum download, leider etwas unübersichtlich). Zusätzlich finden sich noch alle Wiederstände und die Kapazität die nach Datenblatt benötigt werden mit auf der Platine. Unten rechts im Bild ist eine LED zur Funktionsanzeige verbaut.

Der Schaltplan des Moduls sieht so aus:


Versorgungsspannung des Moduls sind 5V, daher habe ich Vcc (im obigen Bild rot) und GND (im obigen Bild schwarz) von der rechten Seite zum Arduino geführt. Das Anemometer wird vom Labornetzteil nämlich mit 8-30V (ich habe aktuell 10V eingestellt) versorgt.

Ich habe mich bei der Verkabelung an dieses Tutorial gehalten. Dort wird folgende Pinbelegung verwendet:


Zur Verwendung des Moduls als receiver heißt es dort:

In order to be used as a receiver, RE pin and DE pin must be connected to GND, and RO pin is connected to RX. Data received by AB will be sent to RO pin that is connected to Arduino RX pin so the data can be read by Arduino.

Muss ich zwischen rechtem und linkem Steckbrett (sprich zwischen GND vom Arduino und GND vom Netzteil) eine Verbindung für ein gemeinsames GND herstellen?

Hallo, also,

Alle Bezugspotenziale sollten das selbe Potenzial haben, hier muss also eine Verbindung zwischen aller GND hergestellt werden.

Dies hat primär erstmal den Grund das der RE/DE-Switch bei dir auf GND gezogen wird (RX-Schaltung, Pegel Low) .

Das hast du ja schon. Und dann ist es so das dein EIA-485 Bezugskorrespondierend arbeitet. Dies bedeutet das der transceiver die Flanken gegen seine Basispotenziale erhebt. Auch dies sollte durch Potenzialausgleich des GND gegeneinander verschalten werden. Ob es sich dabei um die Lösung handelt kann ich so aus dem FF nicht sagen, jedoch ist dies eine Häufige Fehlerursache.

Viele Dank für die Antwort, die Masse war tatsächlich ein Teil des Problems.

Gemeinsam mit dem Hersteller des Sensors (Autonnic Research Ltd.) habe ich nun alles zum Laufen bringen können. Hauptproblem war, dass das Anemometer das Modul nicht mag. Obwohl 5 Kabel von dem Anemometer kommen ist nur eins davon RX, ein anders TX. Das Potential wird jeweils zu GND gemessen. Für meinen Anwendungsfall (reines Auslesen des Sensors bzw. empfangen der NMEA Nachrichten) brauche ich nur das TX Kabel und GND, mehr nicht. Beim oben verwendeten Modul sind Rx und Tx auf Leitung A und B gelegt, dadurch vermischt der Sensor die NMEA Sätze mit den Messwerten und mögliche NMEA Sätze zur Konfiguration (startet mit PATC, siehe screenshot oben).
Ich habe es daraufhin statt dem Oben verwendeten RS422/485 Modul mal mit einem RS323 auf TTL Wandler versucht:
max3232
Solche module scheinen weit verbreitet zu sein, bekommt man für ein paar cent. Verbaut ist ein Maxim MAX3232 auf der Vorderseite und die laut Datenblatt für die Funktion nötigen Kondensatoren (100µF) auf der Rückseite. Schematisch sieht die Schaltung so aus:

max232_schematic
Wenn man das Modul so anschließt funktioniert es leider überhaupt nicht. Das einzige was passiert ist, dass es sehr warm wird.
Nach einieger Zeit ist mir der kleine Kommentar unten links am Schaltbild aufgefallen: C3 kann entweder auf Vcc oder auf GND gelegt werden. Bei den von mir gekauften Modulen lag es auf GND. Ich habe daraufhin bei einem mal C3 auf Vcc gelegt und siehe da, alles funktioniert!

Der Umbau ist leider nicht ganz ohne, da das Modul relativ klein ist. Ohne Mikroskop und entsprechendes Lötequipment wird es schwierig werden.

Für alle die es nachmachen wollen:

Zu erst habe ich auf der Platine die Verbindung von C3 (identifiziert durch messen) zu GND durchgekratzt.
max3232_03

Anschließend einen kleinen Draht auf Vcc gelegt. Dazu bot sich der linke Lötpunkt vom Kondensator unter C3 an.