Forum: Mikrocontroller und Digitale Elektronik UART Problem - Array Empfangen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dennis (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ich habe ein kleines Problem wenn ich über UART daten empfangen will

Ich sende die mit folgendem Code
1
void rs485_putc(unsigned char c){
2
  PORTB |= (1<<PORTB1);
3
  while(!(UCSR0A & (1<<UDRE0))){}
4
  UDR0 = c;
5
  PORTB &= ~(1<<PORTB1);
6
}
7
8
void rs485_puts(char *s, unsigned int len){
9
  while (len--){              
10
    rs485_putc(*s++);
11
  }
12
}
13
14
sendByte[8] = 0x02;
15
16
rs485_putAddr(0x42);
17
rs485_puts(sendByte,20);
vorher lasse ich mir aber mein sendByte mit einer schleife auf 0xFF 
stellen!!!!

Empfangen tue ich es mit
1
ISR(USART_RX_vect){
2
  uint8_t Nextchar;
3
  uint8_t StringLen = 0;
4
  Nextchar = rs485_getc();  //warte auf und emogae das nächste Zeichen
5
                //Sammle solange Zeichen, bis:
6
                //*entweder das String Ende Zeichen kam
7
                //*oder das aufnehmende Array voll ist
8
9
  while(Nextchar != '\n' && StringLen < uart_maxstrlen){ 
10
    uart_string[StringLen] = rs485_getc();
11
    StringLen++;
12
  }
13
                //Noch ein '/0' anhängen um einen Standrd C String daraus zu machen
14
  uart_string[StringLen] = '\0';
15
}

in der While frage ich dann diesen string ab..
1
if(uart_string[0] == 0x42){
2
      UCSR0A &= ~(1<<MPCM0);
3
      _delay_ms(100);
4
      PORTD |= (1<<PORTD6); //LED AN
5
      _delay_ms(100);
6
      PORTD &= ~(1<<PORTD6); //LED AN
7
    }
8
    if(uart_string[8] == 0x02){
9
      //PORTC &= ~(1<<PORTC4); //LED AN
10
       PORTD |= (1<<PORTD4); //LED AN
11
        _delay_ms(200);
12
        PORTD &= ~(1<<PORTD4); //LED AN
13
      _delay_ms(200);
14
      UCSR0A |= (1<<MPCM0);
15
    }
Das Problem: PD6 wird geschaltet... dh. 0x42 kommt an.. (die Adresse)... 
aber 0x02 kommt nicht an... ich habe es auch schon mit [7] oder [9] 
Probiert...
Ich sende es aufjeden Fall im [8]feld.
Das kuriose ist dass ich auch bei [19] die 0x42 empfange!..

schicke ich aber einzelnes zeichen mittels
rs485_putc... dann funktioniert es...

--

Mit den [ c ] [ /c ] -Tags funktioniert das Syntaxhighlighting und Dein 
Code wird etwas lesbarer.

-rufus

: Bearbeitet durch Moderator
von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Deine ISR ist kaputt.

Konzeptionell wird diese ISR für jedes einzelne empfangene Zeichen 
aufgerufen, Du aber hast darin eine Schleife programmiert, die 
wiederholt rs485_getc() aufruft.

Entscheide Dich: Interruptgesteuertes Empfangen oder pollen.

von Dennis (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Danke.. leider läuft es immernoch nicht sauber...
habe es nun wie folgt aufgebaut..



SENDESEITE:
sendByte[0] = 1;//DEVICE; //Modus
sendByte[1] = 2;//EEPROM_read(0);  ; //lese ID aus EEPROM
sendByte[2] = 3;//EEPROM_read(1);
sendByte[3] = 4;//EEPROM_read(2);
sendByte[4] = 5;//EEPROM_read(3);
sendByte[5] = 6; //CRC
sendByte[6] = 7; //BAT
sendByte[7] = 8; //STATUS
sendByte[8] = 9; //STATUS
for(uint8_t i=9; i<20; i++){
  sendByte[i] = 0xF1; //DATA i
  }

rs485_putAddr(0x42);
rs485_puts(sendByte,20);

EMPFANGSSEITE:
void rs485_gets(char* Buffer, uint8_t MaxLen){
  uint8_t Nextchar;
  uint8_t StringLen = 0;

  Nextchar = rs485_getc();  //warte auf und emogae das nächste Zeichen
                //Sammle solange Zeichen, bis:
                //*entweder das String Ende Zeichen kam
                //*oder das aufnehmende Array voll ist
  while(Nextchar != '\n' && Nextchar != '\r' && StringLen < MaxLen){
    *Buffer++ = Nextchar;
    StringLen++;
    Nextchar = rs485_getc();
  }
                //Noch ein '/0' anhängen um einen Standrd C String 
daraus zu machen
  *Buffer = '\0';
}


if(UCSR0A & (1<<RXC0))
   rs485_gets(uart_string, 20);


if(uart_string[2] == 1){
  while(uart_string[2]--){
    PORTD |= (1<<PORTD7); //LED AN
     _delay_ms(200);
     PORTD &= ~(1<<PORTD7); //LED AN
    _delay_ms(200);
  }
  UCSR0A |= (1<<MPCM0);
  uart_string[2]=0xFF;
}


Ich bin meni uart_string nun durchgegangen...
bei [0] und bei [1] erkennt der die dort stehende 1 bzw. 2....
aber bei [2] [3] ... usw. hat der schon (wahrscheinlich) 0xFF..
Die LED hört erst nach etwas längerer Zeit auf zu blinken....

Ich habe mich aber Parallel zum RX und TX auf der Empfangsseite mit 
Putty drauf gehangen und sehe dort dass alles so ankommt wie ich es 
sende...


42
1
2
3
4
5
6
7
8
9
F1
F1
F1
F1
F1
F1
F1
F1
F1
F1
F1

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.