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