Forum: Mikrocontroller und Digitale Elektronik UART Problem - Array Empfangen


von Dennis (Gast)


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 User
von Rufus Τ. F. (rufus) Benutzerseite


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)


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

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.