ASURO Library  2.80
uart.c
gehe zur Dokumentation dieser Datei
1 /****************************************************************************/
42 /*****************************************************************************
43 * *
44 * This program is free software; you can redistribute it and/or modify *
45 * it under the terms of the GNU General Public License as published by *
46 * the Free Software Foundation; either version 2 of the License, or *
47 * any later version. *
48 * *
49 *****************************************************************************/
50 #include "asuro.h"
51 
52 
53 
54 /****************************************************************************/
93 void SerWrite (
94  unsigned char *data,
95  unsigned char length)
96 {
97  unsigned char i = 0;
98 
99  UCSRB = (1<<TXEN); // Sender einschalten
100  while (length > 0) // so lange noch Daten da sind
101  {
102  if (UCSRA & (1<<UDRE))
103  { // warten, bis der Sendebuffer leer ist
104  UDR = data[i++];
105  length --;
106  }
107  }
108  while (!(UCSRA & (1<<TXC))) // abwarten, bis das letzte Zeichen
109  ; // uebertragen wurde.
110 
111  UCSRA |= (1<<TXC); // transmission completed Flag setzen
112 
113  UCSRB &= ~(1<<TXEN); // Sender ausschalten / Powersave
114 }
115 
116 
117 
118 /****************************************************************************/
158 void SerRead (
159  unsigned char *data,
160  unsigned char length,
161  unsigned int timeout)
162 {
163  unsigned char i = 0;
164  unsigned int time = 0;
165 
166  UCSRB = (1<<RXEN); // Empfaenger einschalten
167 
168  if (timeout != 0)
169  {
170  /*
171  Die Funktion wird auf alle Faelle, auch ohne empfangene Daten, wieder
172  verlassen. --> nonblocking mode
173  */
174  while (i < length && time++ < timeout)
175  {
176  if (UCSRA & (1<<RXC))
177  {
178  data [i++] = UDR;
179  time = 0;
180  }
181  }
182  if (time > timeout)
183  data [0] = 'T';
184  }
185  else
186  {
187  /*
188  Die Funktion wird auf alle Faelle erst nach dem Empfang von der
189  vorgegebenen Anzahl Zeichen verlassen. blocking mode
190  */
191  while (i < length)
192  {
193  if (UCSRA & (1<<RXC))
194  data [i++] = UDR;
195  }
196  }
197 }