Hallo, ich möchte Daten vom Serial Port des Arduino Mega über RX1 lesen und auf dem Serial Monitor, also Port 0 ausgeben. Scheinbar kann ich aber keine Daten empfangen, denn in die if-Abfrage springt er nicht und gibt entsprechend nichts aus. Anbei mal der Code Ausschnitt: start(); Serial1.begin(BAUDRATE); Serial.begin(BAUDRATE); Serial1.write(0x55); //SYNC Serial1.write(0xCF); //PID Serial1.write(0x55); //Serial.begin(BAUDRATE, SERIAL_8N1); if (Serial1.available() > 0) { // read the incoming byte: rx = Serial1.read(); Serial.print("received: "); Serial.println(rx, DEC); } Serial.print("received: "); Serial.println(rx, HEX); Erst durch das untere print kann ich überhaupt am Monitor was sehen aber eben nur 0. Ich hänge mit dem Oszilloskop am RX1 und kann definitv sehen, dass hier was ankommt. Das Problem ist womöglich, dass nach dem letzten Serial write die Daten gleich los geschickt werden und die Pause hierzwischen auch nur ca. 500µs ist. Diese kann ich auch nicht verändern, außer mit der Baudrate, aber generell werden die Daten sofort nach der Anfrage gesendet. Könnt ihr mir hier weiter helfen, wie ich die Daten auslesen und am Serial Monitor darstellen könnte? Vielen Dank im Voraus.
:
Bearbeitet durch User
Ich nehme an, du schickst an irgendein Gerät mittels write erst mal ein Kommando. Wie wäre es, wenn du dem Gerät auch mal etwas Zeit geben würdest, eine Antwort zu formulieren und die per Serieller Schnittstelle zu übertragen? Solche Elektroniken sind ja keine Wunderwuzzi, die schon eine Antwort parat haben, noch ehe du ihnen ein Kommando geschickt hast. sprich zwischen hier
1 | Serial1.write(0x55); //SYNC |
2 | Serial1.write(0xCF); //PID |
3 | Serial1.write(0x55); |
und hier
1 | if (Serial1.available() > 0) { |
2 | // read the incoming byte:
|
3 | rx = Serial1.read(); |
4 | Serial.print("received: "); |
5 | Serial.println(rx, DEC); |
6 | }
|
musst du der Gegenstelle etwas Zeit einräumen! Du kannst nicht erwarten, dass sofort nach dem write die Antwort schon da ist.
Hallo, richtig ich erwarte eine Antwort unmittelbar nachdem ich die Daten bzw. Anfrage geschickt habe. Da ich ein Register mit dieser Aufforderung auslese, steht die Antwort sofort parat, wie geschrieben bereits nach ca. 500µs sind die Daten auf der RX Leitung mit dem Oszilloskop zu erkennen, nur eben nich am Seriellen Monitor. Die Frage ist, ist das zu schnell, denn die Antwort bzw. Geschwindigkeit der Antwort kann ich nunmal nicht beeinflussen.
Norbert Van der Heyd schrieb: > Hallo, > > richtig ich erwarte eine Antwort unmittelbar nachdem ich die Daten bzw. > Anfrage geschickt habe. Da ich ein Register mit dieser Aufforderung > auslese, steht die Antwort sofort parat, nein, das tut es nicht. Höchst wahrscheinlich ist noch nicht mal das Byte komplett abgeschickt worden, wenn die Funktion write() zurück kommt. Das andere Gerät benötigt ebenfalls Zeit um das Byte aus seiner UART auszulesen, es zu dekodieren, festzustellen was du willst und eine Antwort bereot zu stellen. Die dann ebenfalles erst mal durch seine UART raus muss und in deine rein, ehe dann das Zeichen bei dir als available() gemeldet wird. > wie geschrieben bereits nach > ca. 500µs Was denkst du wieviel Zeit zuwischen
1 | ...
|
2 | Serial1.write(0x55); |
und
1 | if (Serial1.available() > 0) { |
2 | ....
|
vergeht. Dein Arduino ist mit 16Mhz getaktet. Zwischen den beiden Anweisungen vergehen 1/16000000 oder 0.0625 µs! Ok, ein bischen mehr wird es schon sein, weil da ja auch noch der Funktionsreturn und der Aufruf der Funktion available liegt. Einigen wir uns auf 1µs. Das wird in etwa realistisch sein. > Die Frage ist, ist das zu schnell, denn die Antwort bzw. Geschwindigkeit > der Antwort kann ich nunmal nicht beeinflussen. Natürlich ist das zu schnell. Wenn du heute einen berittenen Boten um 15:00 nach Moskau mit deinem nächsten Schachzug losschickst, kannst du die Antwort per berittenem Boten nicht um 16:00 erwarten. Du musst auch bedenken, dass der Bote Zeit braucht um nach Moskau zu reiten. Selbst wenn dein Schachpartner innerhalb 30 Minuten einen Zug parat hat, dauert es seine Zeit, bis dieser Zug zu dier übertragen wurde. Es ist daher wenig sinnvoll am Montag um 15:00 einen Zug loszuschicken und am Montag um 16:00 auf die Antwort zu warten. Rein schon von der "Übertragungszeit" her kann die Antwort nicht vor übernächster Woche da sein. Auch eine Serielle Schnittstelle überträgt nicht in 0-Zeit. Timeouts bemessen sich in Hunderstelsekunden, eher noch größer. Millisekunden sind meistens schon harter Tobak. Von µs sind wir da weit entfernt.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.