Forum: Mikrocontroller und Digitale Elektronik Arduino 2 Arduino via Funk


von Thorsten (Gast)


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
}

: Bearbeitet durch User
von holger (Gast)


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?

von Maxx M. (maxx2206)


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...

von Daniel (Gast)


Lesenswert?

Hardwareseitig alles in Ordnung? Quarz und Takt?

von Thorsten B. (thorstenbutz)


Lesenswert?

Danke für eure Tipps

Das wird mich wohl weiter bringen. Hardwareseitig ist alles auf einander 
abgestimmt. Takte, Baud usw.

Gruß Thorsten

von Thorsten B. (thorstenbutz)


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
 }

: Bearbeitet durch User
von Jakob F. (jmf123) Benutzerseite


Lesenswert?

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?

von Thorsten B. (thorstenbutz)


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

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.