Objektorientierte Umsetzung der Klasse RS232
|
Bild 0-1: Leeres Projekt
|
Bild 0-1: Neues .h-File für die Klasse RS232 anlegen.
Die nachfolgenden Programme als Projekt rs232_oop_senden.zip herunterladen.
RS232 - Klasse
class RS232
{
public:
RS232(uint32_t baudrate=115200, uint8_t datenbits=8, uint8_t stopbits=1)
{
//setzen der Baudrate:
uint32_t baudregister = TAKTFREQUENZ/8/baudrate-1;
UBRRH = (uint8_t) (baudregister>>8); //Setzen des HIGH-Bytes des Baudraten-Registers
UBRRL = (uint8_t) baudregister; //Setzen des LOW -Bytes des Baudraten-Registers
//einfache (nicht doppelte) Übertragungsgeschwindigkeit:
UCSRA = (1<<U2X);
//Setzen des Nachrichtenformats: 8 Datenbits, 1 Stopbits
switch(datenbits)
{
case 5:
UCSRC = (1<<URSEL)|(0<<UCSZ1)|(0<<UCSZ0);
break;
case 6:
UCSRC = (1<<URSEL)|(0<<UCSZ1)|(1<<UCSZ0);
break;
case 7:
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(0<<UCSZ0);
break;
case 8:
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
break;
}
if(stopbits==2)
UCSRC |= (1<<USBS);
}
void start(bool senden, bool empfangen)
{
if(senden==true)
UCSRB |= 1<<TXEN;
if(empfangen==true)
UCSRB |= 1<<RXEN;
}
void stop()
{
UCSRB &= 255 - (1<<TXEN) - (1<<RXEN);
}
void sendeZeichen(uint8_t zeichen)
{
while( !(UCSRA & (1<<UDRE)) ); //Warten bis der Uebertragungspuffer leer ist
UDR = zeichen; //Daten in den Puffer schreiben und übertragen
}
void sendeZahl(uint8_t zahl)
{
sendeZeichen( 48+zahl/100 );
sendeZeichen( 48+(zahl % 100)/10 );
sendeZeichen( 48+zahl%10 );
sendeZeichen('\n');
sendeZeichen('\r');
}
};
Code 0-1: RS232.h - Klasse für RS232-Schnittstelle.
Hauptprogramm / Verwendung / Test der Klasse RS232
#include <avr/io.h>
#define TAKTFREQUENZ 9216000
#include "RS232.h"
int main(void)
{
// RS232 rs232(115200,8,1);
RS232 rs232;
uint8_t akku=0;
uint32_t pause;
DDRA = 0b00000000;
DDRB = 0b00000000;
DDRD = 0b00000000;
DDRC = 0b11111111; //über RS232 gesendete Zahlen sollen auch an
//zweiten Mikrocontroller geschickt
//und angezeigt werden.
rs232.start(true,false);
while(true)
{
rs232.sendeZahl(akku);
//Zahl außerdem wie gewohnt nach Port C schicken:
PORTC = akku;
for(pause=0;pause<10000000;pause++);
//Weiterzählen:
akku++;
}
return 0;
}
Code 0-2: Hauptprogramm