RS232 -> Coputer

Gast #2081502
Lesenswert?
• ▲
▼
Das ist das Beispiel SerilleKommunikation aus dem Buch AVR-RISC 
Emebedded Software selbst enwickeln
1
/*
2
  Serielle Kommunikation 
3
  Einfacher Befehlsinterpreter
4

5
  ATMEGA8/16/32 und kompatibel
6
  STK500 mit dem STK500 Oszillator (3.68 MHz)
7
  Baudrate: 9600 (8N1)
8

9
  Roman Mittermayr
10
  AVRBUCH.DE  
11
*/
12

13
#include <avr/io.h>
14
#include <string.h> // Für "strcmp"
15
#include <stdlib.h> // Für "itoa"
16

17

18
#define  TAKT      3680000
19
#define UART_BAUDRATE  9600
20

21

22

23
// Berechnung der Konfigurationsparameter
24
#define UART_SETTING  ((TAKT/16L/UART_BAUDRATE)-1)
25

26

27
void setup_uart()
28
{
29
  /* Baudrate einstellen */
30
  UBRRH = (char) (UART_SETTING >> 8);
31
  UBRRL = (char) (UART_SETTING);
32

33
  /* Empfänger und Sender einschalten */
34
  UCSRB = (1<<RXEN) | (1<<TXEN);
35

36
  /* Asynchron, 8N1 */
37
  UCSRC = (1<<URSEL) | (3<<UCSZ0);
38
}
39

40
void uart_putchar(char c)
41
{
42
  // Warten bis Buffer bereit ...
43
  while (!(UCSRA & (1 << UDRE)))
44
    ;
45

46
  // Senden...
47
  UDR = c;
48
}
49

50
void uart_putstring(char *str)
51
{
52
  unsigned char i;
53

54
  for (i=0;i<255;i++) /* Maximal 255 Zeichen ausgeben ... */
55
  {
56
    if (str[i] != 0)
57
      uart_putchar(str[i]);
58
    else
59
      break; // Ende des Strings erreicht
60
  }
61
}
62

63
char uart_getchar()
64
{
65
  // Ist schon ein Zeichen im Buffer?
66
  if (bit_is_set(UCSRA, RXC))
67
    return UDR;
68
  else 
69
    return -1;
70
}
71

72
void uart_readline(char *str)
73
{
74
  char c;
75
  unsigned char index;
76
  
77
  index = 0;
78

79
  while (1)
80
  {
81
    c = uart_getchar();
82
    if (c != -1)
83
    {
84
      if (c == 13) /* ASCII: NewLine */
85
      {
86
        /* Ende der Zeile erreicht,
87
           also String abschließen */
88
        str[index] = 0;
89

90
        /* Funktion beenden */
91
        return;
92
      }
93
      else /* Normales Zeichen, anhängen an die Zeichenkette */
94
      {
95
        str[index] = c;
96
        index++;
97
      }
98
    }
99
  }
100
}
101

102
int main(void)
103
{
104
  char kommando[255];
105
  char temp[10];
106
  unsigned char zahl=0;
107

108
  /* RS232 einschalten ... */
109
  setup_uart();
110

111
  /* Willkommensnachricht senden ... */
112
  uart_putstring("AVRBUCH.DE - Serielle Kommunikation gestartet ...\r\n\r\n");
113

114
  while (1)
115
  {
116
    /* Auf komplettes Kommando warten ... */
117
    uart_readline(kommando);
118

119
    /* Welcher Befehl wurde geschickt? ============ */
120

121
    /* ==== BEFEHL: "version" */
122
    if (strcmp(kommando, "version")==0)
123
    {
124
      uart_putstring("OK: Version 1.00\r\n");
125
    }
126

127
    /* ==== BEFEHL: "up" */
128
    else if (strcmp(kommando, "up")==0)
129
    {
130
      if (zahl<255)
131
      {
132
        zahl++;
133
        uart_putstring("OK: Zahl wurde erhoeht\r\n");
134
      }
135
      else
136
        uart_putstring("ERROR: Maximum erreicht (Zahl=255)\r\n");
137
    }
138

139
    /* ==== BEFEHL: "down" */
140
    else if (strcmp(kommando, "down")==0)
141
    {
142
      if (zahl>0)
143
      {
144
        zahl--;
145
        uart_putstring("OK: Zahl wurde verringert\r\n");
146
      }
147
      else
148
        uart_putstring("ERROR: Minimum erreicht (Zahl=0)\r\n");
149
    }
150

151
    /* ==== BEFEHL: "show" */
152
    else if (strcmp(kommando, "show")==0)
153
    {
154
      itoa(zahl, temp, 10);
155
      uart_putstring("OK: Zahl = ");
156
      uart_putstring(temp);
157
      uart_putstring("\r\n");
158
    }
159
  }
160

161
  return 0;
162
}
Es ist ein ATMege 16
reicht das oder braucht Ihr mehr?
Wäre sehr nett wenn Ihr mir Helfen würdet

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.