uart.c

gehe zur Dokumentation dieser Datei
00001 /****************************************************************************/
00040 /*****************************************************************************
00041 *                                                                            *
00042 *   This program is free software; you can redistribute it and/or modify     *
00043 *   it under the terms of the GNU General Public License as published by     *
00044 *   the Free Software Foundation; either version 2 of the License, or        *
00045 *   any later version.                                                       *
00046 *                                                                            *
00047 *****************************************************************************/
00048 #include "asuro.h"
00049 
00050 
00051 
00052 /****************************************************************************/
00094 void SerWrite (
00095   unsigned char *data,
00096   unsigned char length)
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 }
00125 
00126 
00127 
00128 /****************************************************************************/
00171 void SerRead (
00172   unsigned char *data,
00173   unsigned char length,
00174   unsigned int timeout)
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 }

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