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 }