Forum: Mikrocontroller und Digitale Elektronik Arduino Rs232


von Sven (Gast)


Lesenswert?

Hallo
Ich möchte zwei int Variablen von einem Avr zum anderen Übertragen 
mittels Seriell.
Dafür verwende ich wie im Beispiel die Magie von parseInt();
1
  while (Serial.available() > 0) {
2
    int m1t = Serial.parseInt();
3
    int m2t = Serial.parseInt();     
4
      if (Serial.read() == '\n') {

Wenn ich die Daten vom Pc generieren lasse scheint es wunderbar zu 
klappen.
Wenn ich die Daten aber vom 2. Avr sende habe ich Aussetzer. So Das der 
Empfänger teilweise sekundenlang nix mehr empfangen möchte.
Die Daten mit Hterm mitgelesen sehen aber absolut korrekt aus.
Der Empfänger arbeitet auch weiter meint nur keine Daten mehr zu 
bekommen. Und ohne Neustart geht es dann auf einmal auch wieder.

Woran könnte das liegen?
Wie funktioniert ParseInt?
Was macht der wenn der zb mal ein Byte falsch übertragen wird? wartet er 
dann auf ein Byte ? Bekommt vom Sender aber gleich wieder ganz viele und 
ist dann vielleicht um ein Byte aus der Spur?

von Mick (Gast)


Lesenswert?

Hast du gemeinsames GND zwischen beiden Mikrocontrollern? Evtl. serielle 
Widerstände bei RX/TX Lines verwenden.

von Sven (Gast)


Lesenswert?

Mick schrieb:
> Hast du gemeinsames GND zwischen beiden Mikrocontrollern? Evtl.
> serielle
> Widerstände bei RX/TX Lines verwenden.

Jap gemeinsame Versorgung incl Masse und Extra noch einige Kondensatoren 
in der Versorgung.
Widerstände habe ich keine drin. Nein mittlerweile kann ich sogar 
Bestätigen das das Problem vom Parseint kommt.
Es wartet tatsächlich auf ein Byte. Wenn aber Zwei kommen Wartet es 
wieder auf eins. bis mal wieder nur eins kommt. Also bis zum nächsten 
Fehler.
Das ist reichlich ungut.

von Mick (Gast)


Lesenswert?

Ok, schau mal hier: https://www.arduino.cc/en/Reference/parseInt
parseInt gibt schon beim ersten empfangenen Byte einen Wert zurück, 
sofern dieses eine Zahl ist.

Vielleicht hilft dir das hier weiter: 
https://www.arduino.cc/en/Tutorial/StringToIntExample

von Sven (Gast)


Lesenswert?

Ich befürchte ich brauche da einen neuen Ansatz.
Also ich möchte zwei int zahlen(-255-+255) oder 4 Byte (0-255)
übertragen. Allerdings Permanent und Schnell.
Und irgendwie muss auch Sichergestellt werden das die Bytes nicht 
verschoben ankommen.
Bietet Arduino da schon andere Lösungen?
In Bascom hätte ich mir ein Fifo Buffer gebaut und Byte für Byte 
ausgelesen bis ein Bestimmtes Byte kommt und dann alle X Byte davor 
passend einsortiert und dann noch mit einer Checksumme verglichen.
Bascom kann ich gerade nicht verwenden weil ich gerade kein Windows zur 
Hand habe.

von nicht“Gast“ (Gast)


Lesenswert?

Was hindert dich daran, das mit C++ ebenso zu machen?
Auch kannst du bascom auf deinen Arduino drauf machen.

Grüße

von Joachim B. (jar)


Lesenswert?

Serial.read hat doch FiFo

warum schickst du nicht einfach ASCII mit CR?
1
#define MAXBUFFER 20
2
char serial_in_command[MAXBUFFER]={0};
3
char serial_in_buff[MAXBUFFER]={0};
4
unsigned char chr_cnt=0;
5
6
  // --------------- serial in ---------------
7
  if(Serial.available() > 0) 
8
  { char incomingByte = (char)Serial.read();
9
    if(!(incomingByte == 13))  // Falls kein Enter kommt muss der Text gespeichert werden in dem inText Array
10
    { if( isprint(incomingByte) )
11
        if(incomingByte=='-' || incomingByte=='+' || isdigit(incomingByte) ) // Ergänzung nur für Zahlen
12
          serial_in_buff[chr_cnt++] = incomingByte;
13
    }
14
    else // Wenn das Enter ankommt
15
    { strcpy(serial_in_command, serial_in_buff);
16
      chr_cnt = 0;
17
      memset(&serial_in_buff[0], 0, sizeof(serial_in_buff));
18
    }
19
  } // if (Serial.available() > 0) 
20
  
21
  if(strlen(serial_in_command))
22
  {   
23
    // fuer dich
24
    int16_t int_var = atoi(serial_in_command);
25
26
/*
27
    Serial.println(); Serial.print(serial_in_command); Serial.println(F("->erkannt"));
28
    if( strstr(serial_in_command, "help") || ( strstr(serial_in_command, "?") && strlen(serial_in_command)==1 ) )
29
    { // help screen
30
      Serial.println(F("\ncommands:\n"));
31
32
      Serial.println(F("hell, hellp, hellm, hellxx -> 0-10"));
33
      Serial.println(F("con, conp, conm, conxx -> 65-75"));
34
      Serial.println(F("date, dateJJJJ/MO/TA"));
35
      Serial.println(F("time, timeHH:MM:SS"));
36
      Serial.println(F("temp"));
37
      Serial.println(F("reset"));
38
      Serial.println(F(""));
39
      *serial_in_command=0;
40
    } // if( strstr(serial_in_command, "help") || ( strstr(serial_in_command, "?") && strlen(serial_in_command)==1 ) )
41
42
    else if( strstr(serial_in_command, "hell") )
43
    { if( !strcmp(serial_in_command, "hellp") )
44
*/
45
46
    *serial_in_command=0; // oder
47
//    memset(&serial_in_command[0], 0, sizeof(serial_in_command)); // oder
48
//    memset(serial_in_command, 0, sizeof(serial_in_command));
49
  } // if(strlen(serial_in_command))

von Mick (Gast)


Lesenswert?

Ich verwende vielfach die EasyTransfer Bibliothek: 
https://github.com/madsci1016/Arduino-EasyTransfer

Die ist wirklich der Hammer. Damit kannst du ganze struct Blöcke 
übertragen. Der Transfer wird zusätzlich mittels Checksummen geprüft.

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.