Forum: Mikrocontroller und Digitale Elektronik Arduino Seriell Daten lesen mit Serial read()


von Norbert V. (norbie)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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.

von Norbert V. (norbie)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.