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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren