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 timer.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)

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 135 der Datei uart.c.

00139 {
00140   unsigned char i = 0;
00141   unsigned int  time = 0;
00142 
00143   UCSRB = 0x10;                         // Empfaenger einschalten
00144 
00145   if (timeout != 0)
00146   {
00147     /*
00148       Die Funktion wird auf alle Faelle, auch ohne empfangene Daten, wieder
00149       verlassen. --> nonblocking mode
00150     */
00151     while (i < length && time++ < timeout)
00152     {
00153       if (UCSRA & 0x80)
00154       {
00155         data [i++] = UDR;
00156         time = 0;
00157       }
00158     }
00159     if (time > timeout)
00160       data [0] = 'T';
00161   }
00162   else
00163   {
00164     /*
00165       Die Funktion wird auf alle Faelle erst nach dem Empfang von der
00166       vorgegebenen Anzahl Zeichen verlassen. blocking mode
00167     */
00168     while (i < length)
00169     {
00170       if (UCSRA & 0x80)
00171         data [i++] = UDR;
00172     }
00173   }
00174 }

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.

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().
Beispiel:
(Nur zur Demonstration der Parameter/Returnwerte)
  // Senden eines 'wunderbaren Textes' ueber die Schnittstelle.
  SerWrite ("Hello world", 11);

Definiert in Zeile 68 der Datei uart.c.

00071 {
00072   unsigned char i = 0;
00073 
00074   UCSRB = 0x08;                         // Sender einschalten
00075   while (length > 0)                    // so lange noch Daten da sind
00076   {
00077     if (UCSRA & 0x20)
00078     {                                   // warten, bis der Sendebuffer leer ist
00079       UDR = data[i++];
00080       length --;
00081     }
00082   }
00083   while (!(UCSRA & 0x40))               // abwarten, bis das letzte Zeichen
00084     ;                                   // uebertragen wurde.        
00085 
00086   for (i = 0; i < 0xFE; i++)            // warten auf irgendwas; keiner weiss
00087     for (length = 0; length < 0xFE; length++);  // wofuer
00088 }


Erzeugt am Wed Feb 14 16:10:02 2007 für ASURO Library von  doxygen 1.5.1-p1