Hallo,
ich wollte das Rad mal neu erfinden und hab mir zwei Sketche geschrieben, mit denen zwei Arduinos Daten austauschen können, auf Pin 3 und 4. Das Prinzip ist relativ einfach : Wird Pin 3 auf vom Empfänger auf HIGH gesetzt, weiß der Sender, dass er jetzt Daten schicken soll. Dies geschieht über Pin 4. Die "Daten" sind relativ einfach : Ein 16-Bit Wert wird übertragen. Zum Testen ist das der Wert 65000.
Beim Empfänger-Code habe ich zwischen dem Empfangen noch einige DEBUG-Meldungen in Form von seriellen Ausgaben hinzugefügt, um verfolgen zu können, ob die richtigen Werte empfangen werden und wie lange das ganze ungefähr dauert.
Das für mich absolut nicht nachvollziehbare ist, dass das Empfangen des 16-BIt-Wertes mit weniger seriellen Ausgaben ca. 100 ms länger dauert, als ohne.
Der Code des Empfängers liegt unten. Wenn die Präprozessordirektive DEBUG definiert ist, dauert das Empfangen rund 1380 ms. Ist DEBUG nicht definiert, dann dauert das Empfangen ca. 1480 ms.
Die Dauer der Übertragung wird mithilfe der Differenz der Variablen startTransmission und debugTime ausgewertet.
Mit definiertem DEBUG erscheint am Ende bei der seriellen Ausgabe die Zeile :
Receiver : Transmission time : 1382 ms
Ohne definiertem DEBUG (und somit ca. 5 seriellen Ausgaben weniger) erscheint am Ende die Zeile
Receiver : Transmission time : 1482 ms
Könnt ihr mir bitte den Grund dafür sagen ? Denn eigentlich müsste es doch genau anders herum sein, also so, dass der Sketch mit weniger seriellen Ausgaben schneller ist, oder ?
#define TEST
#define DEBUG
#define RECORDING
#define STARTTRANSMISSION 3
#define TRANSMISSIONLINE 4
#define TASTER 8
const unsigned long timeOutLimit = 3000;
#ifdef RECORDING
unsigned int successful = 0;
unsigned int total = 0;
#endif
#ifdef TEST
const unsigned int referenceValue = 65000;
#endif
// Code für den Empfänger
unsigned long startTransmission = 0;
unsigned long debugTime = 0;
unsigned long startValue;
unsigned int value;
int receivedValues = 0;
unsigned long duration = 0;
void setup() {
// put your setup code here, to run once:
pinMode(STARTTRANSMISSION, OUTPUT);
pinMode(TRANSMISSIONLINE, INPUT);
pinMode(TASTER, INPUT);
Serial.begin(9600);
}
void loop() {
// Sobald der Taster an Pin 8 gedrückt wird, soll der Sender uns Daten schicken
while(digitalRead(TASTER) == LOW);
#ifdef DEBUG
Serial.print("Receiver : Taster gedrueckt. Sende Nachricht");
Serial.println();
#endif
// Jetzt möchten wir Daten vom Sender
digitalWrite(STARTTRANSMISSION, HIGH);
value = 0;
// Warte, bis Sender den HIGH-Impuls schickt um zu signalisieren, dass er bereit ist
while (digitalRead(TRANSMISSIONLINE) == LOW);
#ifdef DEBUG
Serial.print("Receiver : Timeout-Limit is set to ");
Serial.println(timeOutLimit, DEC);
Serial.println("Receiver : Sender is now Online. Receiving data starts now");
#endif
// Timeoutzeit beginnt jetzt
startTransmission = millis(); //1. Variable für Zeitmessung
// Verlasse das Empfangen erst, wenn das Zeitlimit erreicht ist, oder 16 Werte empfangen wurden
while ((millis() - startTransmission < timeOutLimit) && receivedValues < 16)
{
if (digitalRead(TRANSMISSIONLINE) == HIGH)
{
//Starte Zeitmessung
startValue = millis();
//Warte, bis Übertragung des Wertes beendet
while (digitalRead(TRANSMISSIONLINE) == HIGH);
//Werte anhand der Dauer den Wert aus
duration = millis() - startValue;
// Wenn es kein Dummy-Wert ist, auswerten
if (duration > 5)
{
if (duration < 45)
{
bitWrite(value, receivedValues, 1);
#ifdef DEBUG
Serial.print("Receiver : I received value 1 \t ");
#endif
}
else
{
bitWrite(value, receivedValues, 0);
#ifdef DEBUG
Serial.print("Receiver : I received value 0 \t ");
#endif
}
//Anzahl der empfangenen Werte um 1 erhöhen
receivedValues++;
#ifdef DEBUG
Serial.print("Duration of data paket was : ");
Serial.print(duration, DEC);
Serial.print(" ms");
Serial.println();
#endif
}
}
}
// Übertragung ist beendet, Leitung auf LOW ziehen
digitalWrite(STARTTRANSMISSION, LOW);
receivedValues = 0;
debugTime = millis(); //2. Variable für Zeitmessung
#ifdef DEBUG
// Wertausgabe zur Analyse
Serial.print("Receiver : Transmission time : ");
Serial.print(debugTime - startTransmission, DEC);
Serial.print(" ms");
Serial.println();
Serial.print("Receiver : I received the value ");
Serial.print(value);
Serial.print(", b");
for (int i=0; i<16; i++)
{
Serial.print(bitRead(value, i));
}
Serial.println();
if (digitalRead(TRANSMISSIONLINE)==HIGH)
Serial.println("Receiver : TRANSMISSIONLINE is HIGH");
else
Serial.println("Receiver : TRANSMISSIONLINE is LOW");
#endif
#ifdef RECORDING
#ifndef DEBUG
Serial.println();
Serial.print("Receiver : Transmission time : ");
Serial.print(debugTime - startTransmission, DEC);
Serial.println(" ms");
#endif
if (value == referenceValue)
{
Serial.println("Transmission successful");
successful++;
}
else
Serial.println("Transmission not successful");
total++;
Serial.print("Transmissions (successful) : ");
Serial.println(successful);
Serial.print("Transmissions (total) : ");
Serial.println(total);
Serial.println();
value = 0;
#endif
//Endlosschleife
}