uart.c-Dateireferenz

Funktionen zur seriellen Kommunikation. Mehr ...

#include "asuro.h"

gehe zum Quellcode dieser Datei

Funktionen

void SerWrite (unsigned char *data, unsigned char length)
 Senden von Daten ueber die serielle Schnittstelle.
void SerRead (unsigned char *data, unsigned char length, unsigned int timeout)
 Lesen von Daten ueber die serielle Schnittstelle.


Ausführliche Beschreibung

Funktionen zur seriellen Kommunikation.

Senden und empfangen von Daten ueber die seriellen Schnittstelle.
Diese Funktionen benoetigen einen laufenden Timer 2-Interrupt, da
die Hardware vom Asuro und die 'Gegenstelle' getaktete Signale
benötigen um sie als gueltig zu erkennen. Dieser Takt muss bei der
verwendeten Hardware 36 kHz betragen. Er wird in der Init()-Funktion
eingestellt und zusaetzlich in den Timer-Funktionen in time.c benutzt.

Siehe auch:
Defines fuer unseren Asuro immer in asuro.h
Hier werden aktuell keine Defines benutzt.
Version:
V--- - 10.11.2003 - Jan Grewe - DLR
Original Version von der ASURO CD

V--- - bis zum 07.01.2007 -
Bitte in Datei CHANGELOG nachsehen.

V001 - 13.01.2007 - m.a.r.v.i.n
+++ Alle Funktionen
Zerlegte Sourcen in einzelne Dateien fuer eine echte Library.

V002 - 22.01.2007 - Sternthaler
+++ Alle Funktionen
Kommentierte Version (KEINE Funktionsaenderung)

V003 - 25.07.2007 - Sternthaler (Gemeldet von helmut_w)
+++ SerWrite ()
+ Abschalten des Senders nach der Datenuebertragung zum sparen von Energie.
+ Erklaerungsversuch fuer die Warteschleife am Ende der Funktion.

V004 - 31.07.2007 - Sternthaler
+++ SerWrite ()
+ Erklaerungsversuch fuer die Warteschleife mit Bezug zum Forum unter http://www.roboternetz.de/

V005 - 14.08.2007 - m.a.r.v.i.n
Magic Numbers ersetzt durch IO Register Defines

Definiert in Datei uart.c.


Dokumentation der Funktionen

void SerRead ( unsigned char *  data,
unsigned char  length,
unsigned int  timeout 
)

Lesen von Daten ueber die serielle Schnittstelle.

Die empfangenen Daten werden in der als Pointer uebergeben Variable data
dem Aufrufer zur verfuegung gestellt.
Der Aufrufer bestimmt ueber den Parameter Timeout, ob diese Funktion im
'blocking'- oder im 'nonblocking'-Mode laufen soll. Im 'blocking'-Mode
bleibt diese Funktion auf alle Faelle so lange aktiv, bis die, uber den
Parameter length, geforderte Anzahl Zeichen empfamgen wurde.

Parameter:
[out] data Zeiger auf die einzulesenden Daten
[in] length Anzahl der zu lesenden Zeichen
[in] timeout 0 = blockierender Mode
Wird hier ein Wert groesser 0 uebergeben, wird nur eine gewisse Zeit
lang versucht ein weiteres Zeichen ueber die Schnittstelle zu empfangen.
Kommt in dieser Zeit kein weiteres Zeichen, wird im zurueckgegeben
Parameter date das erste Zeichen auf 'T' gesetzt und die Funktion
kehrt zum Aufrufer zurueck.
Ansonsten wird die Funktion auf alle Faelle verlassen, wenn die als
Parameter length geforderte Anzahl Zeichen empfangen werden konnten.
Rückgabe:
nichts
Beispiel:
(Nur zur Demonstration der Parameter/Returnwerte)
  // Empfangen von 5 Zeichen. Aber spaetestens nach 20 Versuchen wieder
  // im Programm weiter machen.
  char emfangene_daten [10];

  SerRead (emfangene_daten, 5, 20);
  if (emfangene_daten [0] == 'T')
    SerWrite ("Mist, timeout", 13);
  else
    SerWrite ("5 Zeichen empfangen", 19);

Definiert in Zeile 171 der Datei uart.c.

00175 {
00176   unsigned char i = 0;
00177   unsigned int  time = 0;
00178 
00179   UCSRB = (1<<RXEN);                         // Empfaenger einschalten
00180 
00181   if (timeout != 0)
00182   {
00183     /*
00184       Die Funktion wird auf alle Faelle, auch ohne empfangene Daten, wieder
00185       verlassen. --> nonblocking mode
00186     */
00187     while (i < length && time++ < timeout)
00188     {
00189       if (UCSRA & (1<<RXC))
00190       {
00191         data [i++] = UDR;
00192         time = 0;
00193       }
00194     }
00195     if (time > timeout)
00196       data [0] = 'T';
00197   }
00198   else
00199   {
00200     /*
00201       Die Funktion wird auf alle Faelle erst nach dem Empfang von der
00202       vorgegebenen Anzahl Zeichen verlassen. blocking mode
00203     */
00204     while (i < length)
00205     {
00206       if (UCSRA & (1<<RXC))
00207         data [i++] = UDR;
00208     }
00209   }
00210 }

void SerWrite ( unsigned char *  data,
unsigned char  length 
)

Senden von Daten ueber die serielle Schnittstelle.

Die zu senden Daten werden nicht als 0-terminierter C-String erwartet, sondern
es werden grundsaetzlich so viele Zeichen gesendet wie im 2.ten Parameter
angegeben werden. Deshalb sollte die Funktion eher zum Senden von Rohdaten verwendet werden (keine ASCII Zeichen) Zum Senden von Strings sollte stattdessen die Funktion SerPrint verwendet werden. Bei der aktuellen WinAVR Version (2007055) gibt es eine Warnung, falls ein String als 1. Parameter übergeben wird

Version:
V003 - 25.07.2007 - Sternthaler (Gemeldet von helmut_w)
+ Abschalten des Senders nach der Datenuebertragung zum sparen von Energie.
+ Erklaerungsversuch fuer die Warteschleife am Ende der Funktion.

V004 - 31.07.2007 - Sternthaler
+ Erklaerungsversuch fuer die Warteschleife mit Bezug zum Forum unter http://www.roboternetz.de/

Parameter:
[in] data Zu sendende Daten
[in] length Die Anzahl der zu sendenden Zeichen.
Rückgabe:
nichts
Siehe auch:
Die Initialisierung vom Timer 2-Interrupt erfolgt in der Funktion Init().

SerPrint

Beispiel:
(Nur zur Demonstration der Parameter/Returnwerte)
  // Senden von Rohdaten ueber die Schnittstelle.
  unsigned char buf[4] = {0x55, 0xaa, 0xab, 0xcd);
  SerWrite (buf, 4);

Definiert in Zeile 94 der Datei uart.c.

00097 {
00098   unsigned char i = 0;
00099 
00100   UCSRB = (1<<TXEN);                    // Sender einschalten
00101   while (length > 0)                    // so lange noch Daten da sind
00102   {
00103     if (UCSRA & (1<<UDRE))
00104     {                                   // warten, bis der Sendebuffer leer ist
00105       UDR = data[i++];
00106       length --;
00107     }
00108   }
00109   while (!(UCSRA & (1<<TXC)))           // abwarten, bis das letzte Zeichen 
00110     ;                                   // uebertragen wurde.        
00111 
00112   for (i = 0; i < 0xFE; i++)            // warten auf irgendwas; keiner weiss
00113     for (length = 0; length < 0xFE; length++);  // wofuer
00114   UCSRB  = 0x00;                        // Sender ausschalten / Powersave
00115 
00116   // Als Grund fuer die doppelte for()-Schleife hatte Arexx-Henk hier
00117   // http://www.roboternetz.de/phpBB2/viewtopic.php?p=182250#182250
00118   // angegeben, dass das Senden 2-Stufig ueber UDR und einem internem
00119   // Schieberegister funktioniert.
00120   // Wuerde direkt nach dem Senden sofort die Empfangsfunktion aufgerufen,
00121   // dann wird dort der Sender abgeschaltet obwohl noch Daten im internen
00122   // Schieberegister vorhanden sind. Diese Daten wuerden dann nicht mehr
00123   // gesendet.
00124 }


Erzeugt am Sun Nov 18 18:24:53 2007 für ASURO Library von  doxygen 1.5.1-p1