Arduino 2 Arduino via Funk

Gast #3500076
Lesenswert?

Hallo Leute,

habe ein kleines Problem. Die Funkverbindung soll mit den Easy Radio 
ER400TRS hergestellt werden. Leider stimmen die empfangenen Daten nicht 
mit den gesendeten überein. Es sollen immer binär 3 Integer versendet 
werden. Selbstverständlich in LSB & MSB zerlegt. Wenn 0xff oxff versende 
kommen die Daten richtig an, aber bei z.B. 0x00 0x04 kommt am anderen 
Ende 0xff 0xfe heraus. Welches Protokoll ist am besten geeignet oder wo 
mache ich einen Fehler?

Receiver Prog.
1
#include <SoftwareSerial.h>;    // Serial Library einbinden
2
SoftwareSerial mySerial(0, 1); // RX, TX
3

4
unsigned int adresse=0;  // Variable Adressierung
5
unsigned int x=0;        // Variable x-Achse
6
unsigned int y=0;        // Variable y-Achse
7
int data_raw[6];         // Serial Data Arry
8
int cnt=0;               // Counter
9

10
void setup()
11
{
12
  mySerial.begin(19200);  // Start meine serielle Übertragung mit setzen der Baudrate 
13
  Serial.begin(19200);    // Start meine serielle Übertragung mit setzen der Baudrate
14
}
15
void loop()
16
{
17
// Abfrage serielle Daten der Fernbedienung
18

19
  if (Serial.available() >0)    // Abfrage Serial Data Available
20
  {
21
      for (cnt=0;cnt<6;cnt++)     // Schleife Abfrage Serial Buffer & Data Shift
22
      {
23
      data_raw[cnt]=Serial.read();
24
      Serial.println(data_raw[cnt]);
25
      Serial.flush();    // Rücksetzte Serial Buffer 
26
      }
27
      adresse=data_raw[1]*256+data_raw[2];
28
      x=data_raw[3]*256+data_raw[4];
29
      y=data_raw[5]*256+data_raw[6];
30
      if (adresse=65535)
31
        {
32
        Serial.println(adresse);
33
        Serial.println(y);
34
        Serial.println(x);
35
        data_raw[1]=0;
36
        data_raw[2]=0;
37
        }
38
      }
39
    
40
}
Gast #3500153
Lesenswert?

>  if (Serial.available() >0)    // Abfrage Serial Data Available
>  {
>      for (cnt=0;cnt<6;cnt++)     // Schleife Abfrage Serial Buffer &
>      {
>      data_raw[cnt]=Serial.read();

Wie kommst du darauf das wenn Serial.available() >0 ist gleich
6 Bytes zur Verfügung stehen?
#3500180
Lesenswert?

Hi,

dito...

Versuchs mal mit der Standardvariante fürs byteweise Einlesen mittels

while (Serial.available())
 {
 data_raw[cnt]=Serial.read();
 cnt++;
 }

Wäre vielleicht auch nicht verkehrt das Telegramm "sauber" 
abzuschließen, z.B. mit einem "\n"?

Mein Tipp wäre auch, das Auslesen in die separate serialEvent() Funktion 
zu packen. Eine Variante wie sie z.B. auch bei Bluetooh und GPS Modulen 
verwendet wird ist dann:

int cnt = 0;
boolean stringComplete = false;

void serialEvent()
 {
   while (Serial.available())
   {
   data_raw[cnt]=Serial.read();
   if (data_raw[cnt] == '\n')
     stringComplete = true;
   cnt++;
   }
 }

serialEvent wird lt. Beschreibung bei jedem Durchlauf von loop() 
geprüft.
Daher reicht in Deiner loop() Schleife die einfache Abfrage

if (stringComplete)
 {
 // was immer mit data_raw[] passieren soll
 }
// stringComplete = false;
// -> rücksetzen nicht vergessen
// ggf. auch gleich cnt = 0

um ein vollständiges Telegramm auszuwerten

Hoffe mal ich bringe da nichts durcheinander... ist Spät geworden heute 
und es war ne anstrengende Schicht ;)

Ciao...
#3529838
Lesenswert?

Hallo Leute,

leider habe ich immernoch das Problem mit dem Datenempfang. Die 
ankommenden Daten lösen einen Interrupt aus und Serial Event wird 
aufgerufen. Das Empfängerprogramm ist ensprechend eurer Tips verändert. 
Dadurch werden die ersten 2 Bytes richtig empfangen, aber die restlichen 
4 Bytes kommt nur Datenmüll. Obwohl Startbit, Stopbit und eine Pause mit 
gesendet werden. Die Funkmodule sind nicht das Problem. Wie kann ich die 
UARTs synchronisieren?

Vielen Dank für eure Tips!!!

Empänger Pro.:
1
const int rxpin=0;
2
const int txpin=1;
3
unsigned int adresse=0;    // Variable Adressierung
4
unsigned int x=0;          // Variable x-Achse
5
unsigned int y=0;          // Variable y-Achse
6
unsigned int data_raw[6];  // Serial Data Arry
7
int cnt=0;                 // Counter
8
int adr=11;                // LED Adresse
9
int ledy=10;               // LED Y-Achse
10
int ledx=9;                // LED X-Achse
11
char END='\n';             // Ende definieren
12
boolean stringComplete = false;
13

14
void setup()
15
{
16
Serial.begin(19200);    // Start meine serielle Übertragung mit setzen der Baudrate
17
  pinMode(rxpin, INPUT);
18
  pinMode(txpin, OUTPUT);
19
  Serial.flush();
20
  attachInterrupt(0, serialEvent, FALLING);
21
}
22
void loop()
23
{
24
  if (stringComplete)
25
  {
26
  for (cnt=0;cnt<6;cnt++)
27
  {
28
    adresse=data_raw[1]*256+data_raw[0];
29
    y=data_raw[3]*256+data_raw[2];
30
    x=data_raw[5]*256+data_raw[4];
31
    Serial.println(data_raw[cnt]);
32
    //Serial.println(adresse);
33
    //Serial.println(y);
34
    //Serial.println(x);
35
  }
36
    stringComplete=false;
37
    cnt=0;
38
    Serial.flush();
39
    delay(25);  
40
  }  
41
}
42

43
void serialEvent()
44
 { cnt=0;
45
   while (Serial.available())
46
   {
47
   data_raw[cnt]=Serial.read();
48
   if (data_raw[cnt] == '\n')
49
     stringComplete = true;
50
   cnt++;
51
   //delayMicroseconds(6);
52
   }
53
   
54
 }
#3530203
Lesenswert?

Jakob F. schrieb:
> Aus dem Datasheet des Easy Radio ist zu entnehmen:
>
> Transmission and reception are bi-directional half duplex i.e. transmit
> OR receive but not simultaneously.
>
> Könnte es unter Umständen sein, daß Du während des Empfangs schon wieder
> versuchst, etwas zu senden?

Die Funkverbindung sowohl auch die Funkmodule sind für eine Richtung 
angeschlossen und konfiguiert.

Aber trotzdem ein guter Tipp. Es bringt mich auf die Idee. Der Sender 
könnte unter Umständen mehrfach senden. Ich werde mal eine entsprechende 
Zwangspause im Sender programmieren.

Hat jemand eine Idee wie die Daten-ID gesetzt wird?

Gruß Thorsten

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren