Seriell Daten Empfangen

OP #4047582
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
}
Gast #4047596
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.
OP #4047622
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.