#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. |
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.
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.
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.
[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. |
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.
[in] | data | Zu sendende Daten |
[in] | length | Die Anzahl der zu sendenden Zeichen. |
// 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 }