#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 time.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)
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.
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 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
V004 - 31.07.2007 - Sternthaler
+ Erklaerungsversuch fuer die Warteschleife mit Bezug zum Forum unter http://www.roboternetz.de/
[in] | data | Zu sendende Daten |
[in] | length | Die Anzahl der zu sendenden Zeichen. |
// 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 }