Forum: Mikrocontroller und Digitale Elektronik Seriell Daten Empfangen


von A. R. (and)


Lesenswert?

Hallo,

ich versuche gearde seriell Daten zu Empfangen.
Ich verwende HTERM und gebe unten als ASCII eine 1 ein und sende diese 
an mein selbst entwickeltes Board. Das Board funktioniert soweit. Senden 
funktioniert aufjedenfall.

Ich habe mich an das Tutorial  angelehnt, aber sscheibar funktioniert es 
nicht.
Später sollen auch mehr stellige Zahlen übertragen werden z.B. 4010.

Zum überprüfen ob ich den gesendeten wert 1 erhalte, habe ich eine LED 
test Routine programmiert.

1
//+++++++++++++++UART Init+++++++++++++++
2
3
void uart_init(void) {
4
   UBRR0H = UBRR_VAL >> 8;              
5
   UBRR0L = UBRR_VAL & 0xFF;            
6
 
7
   UCSR0B |= (1<<TXEN0) |(1<<RXEN0);          
8
   UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);      
9
}
10
11
12
//+++++++++++++++Get Werte+++++++++++++++
13
14
uint8_t uart_getc(void) {
15
    while (!(UCSR0A & (1<<RXC0)))   // warten bis Zeichen verfuegbar
16
        ;
17
    return UDR0;                   // Zeichen aus UDR an Aufrufer zurueckgeben
18
}
19
 
20
21
void uart_gets( char* Buffer, uint8_t MaxLen ) {
22
  uint8_t NextChar;
23
  uint8_t StringLen = 0;
24
 
25
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
26
 
27
                                  // Sammle solange Zeichen, bis:
28
                                  // * entweder das String Ende Zeichen kam
29
                                  // * oder das aufnehmende Array voll ist
30
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
31
    *Buffer++ = NextChar;
32
    StringLen++;
33
    NextChar = uart_getc();
34
  }
35
 
36
                                  // Noch ein '\0' anhängen um einen Standard
37
                                  // C-String daraus zu machen
38
  *Buffer = '\0';
39
}
40
41
42
43
//+++++++++++++++MAIN+++++++++++++++
44
45
46
int main (void) {        
47
48
//+++++++++++++++Variablen+++++++++++++++
49
50
  char Line[4];
51
  int16_t get;
52
53
//+++++++++++++++Initalisiere+++++++++++++++
54
  
55
  uart_init();
56
57
//+++++++++++++++Start+++++++++++++++
58
59
   while (1){
60
61
62
//+++++++++++++++Get Werte+++++++++++++++
63
  
64
  
65
66
  if (UCSR0A & (1<<RXC0)){
67
68
    uart_gets( Line, sizeof( Line ) );
69
70
    get = atoi (Line);
71
      
72
      if (get == 1){
73
74
      //+++++++++++++++++LED TEST+++++++++++++++++//
75
      PORTC |= (1<<PC0);    // Ausgang auf 1
76
      _delay_ms(500);
77
      PORTC |= (1<<PC1);      
78
      _delay_ms(500);
79
      PORTC |= (1<<PC2);
80
         _delay_ms(500);         
81
    
82
      PORTC &= ~(1<<PC0);    // Ausgang auf 0
83
      _delay_ms(500);
84
            PORTC &= ~(1<<PC1);
85
      _delay_ms(500);         
86
      PORTC &= ~(1<<PC2);
87
          _delay_ms(500); 
88
      //+++++++++++++++++LED TEST+++++++++++++++++//
89
      }
90
91
  }
92
  { 
93
  }
94
95
  }             
96
}

von Stefan F. (Gast)


Lesenswert?

Erster Schritt zur Fehleranalyse: Finde heruas, ob (UCSR0A & (1<<RXC0)) 
irgendwann mal auf True geht.

Zweiter Schritt: Welches Zeichen befindet sich dann in UDR?

Da das Senden schon klappt, kannst du das ja ganz einfach mit Hilfe von 
Textausgaben debuggen, falls du keinen Hardware-Debugger hast.

von A. R. (and)


Lesenswert?

Hardware Debugegr habe ich nicht. Wie mache ich das mit der Textausgabe.

Vor dem Quelltext von oben stehen nur noch die Define und Baud 
berechnung.
Wie kann ich herrausfinden wann (UCSR0A & (1<<RXC0)) auf true geht.

Bin noch neu im Gebiet des µController.

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.