ASURO Library  2.80
Funktionen
uart.c-Dateireferenz

Funktionen zur seriellen Kommunikation. Mehr ...

#include "asuro.h"
Include-Abhängigkeitsdiagramm für uart.c:

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.\n
      Diese Funktionen benoetigen einen laufenden Timer 2-Interrupt, da\n
      die Hardware vom Asuro und die 'Gegenstelle' getaktete Signale\n
      benötigen um sie als gueltig zu erkennen. Dieser Takt muss bei der\n
      verwendeten Hardware 36 kHz betragen. Er wird in der Init()-Funktion\n
      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 ()
V005 - 14.08.2007 - m.a.r.v.i.n
Magic Numbers ersetzt durch IO Register Defines
V006 - 27.03.2008 - m.a.r.v.i.n
Warteschlefe am Ende SerWrite Funktion entfernt.

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]dataZeiger auf die einzulesenden Daten
[in]lengthAnzahl der zu lesenden Zeichen
[in]timeout0 = 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.
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 158 der Datei uart.c.

{
unsigned char i = 0;
unsigned int time = 0;
UCSRB = (1<<RXEN); // Empfaenger einschalten
if (timeout != 0)
{
/*
Die Funktion wird auf alle Faelle, auch ohne empfangene Daten, wieder
verlassen. --> nonblocking mode
*/
while (i < length && time++ < timeout)
{
if (UCSRA & (1<<RXC))
{
data [i++] = UDR;
time = 0;
}
}
if (time > timeout)
data [0] = 'T';
}
else
{
/*
Die Funktion wird auf alle Faelle erst nach dem Empfang von der
vorgegebenen Anzahl Zeichen verlassen. blocking mode
*/
while (i < length)
{
if (UCSRA & (1<<RXC))
data [i++] = UDR;
}
}
}
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
Parameter
[in]*dataZu sendende Daten
[in]lengthDie Anzahl der zu sendenden Zeichen.
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 93 der Datei uart.c.

{
unsigned char i = 0;
UCSRB = (1<<TXEN); // Sender einschalten
while (length > 0) // so lange noch Daten da sind
{
if (UCSRA & (1<<UDRE))
{ // warten, bis der Sendebuffer leer ist
UDR = data[i++];
length --;
}
}
while (!(UCSRA & (1<<TXC))) // abwarten, bis das letzte Zeichen
; // uebertragen wurde.
UCSRA |= (1<<TXC); // transmission completed Flag setzen
UCSRB &= ~(1<<TXEN); // Sender ausschalten / Powersave
}