RS232-Schnittstelle
Pinbelegung RS232-Schnittstelle SUB-D 9 polig
Pin | Beschreibung | Abkürzung | Richtung (vom PC aus gesehen) | Bemerkung |
---|---|---|---|---|
1 | carrier detect | CD | in | |
2 | receive data | RxD | in | Daten zum PC |
3 | send data | TxD | out | Daten vom PC |
4 | data terminal ready | DTR | out | PC bereit |
5 | ground | GND | ||
6 | data set ready | DSR | in | Mikrocontroller bereit |
7 | request to send | RTS | out | PC möchte Daten senden |
8 | clear to send | CTS | in | Mikrocontroller bereit zum Daten empfangen |
9 | ring indicate | RI | in | Eingehender Anruf (bei Modems) |
Datenflusskontrolle
Hardware-Datenflusskontrolle
- Vorteil: Transparente Datenübertragung, d.h. es müssen keine Steuerbytes übertragen werden
- Nachteil: Es werden zwei zusätzliche Leitungen benötigt.
- RTS und CTS verbinden, Bereitschaft über DSR melden
- RTS und DSR verbinden, Bereitschaft über CTS melden
- Bereitschaft über DSR und CTS melden
Software-Datenflusskontrolle
- Vorteil: Es werden nur die Datenleitungen benötigt
- Nachteil: Die Steuerzeichen XON/XOFF dürfen in den normalen Daten nicht vorkommen
- XOFF (0x13) stoppt den Datenfluss
- XON (0x11) setzt Datenübertragung fort.
Protokoll zur sicheren (Paket-)Datenübertragung über RS232
- Sichere Datenbetragung, d.h. Fehlererkennung ist wichtiger als der Datenbetragungsrate
- Daten werden immer in Paketen bertragen
- Variable Länge der Datenpakete
- Läuft ber RS232-Schnittstelle
- Datenfluss läuft zwischen (langsamen) Mikrocontroller und (schnellem) PC
- Einfach auf einem 8-bit Mikrocontroller zu implementieren
OSI-Schicht | Implementierung |
---|---|
1 - physical layer | RS 232 mit einseitiger Hardwareflusserkennung |
2 - data link layer | Startbyte, ESC-Sequenzen, Empfangs-Bestätigung |
3 - network layer | Paket-ID, CRC |
4 - transport layer | nicht implementiert |
5 - session layer | nicht implementiert |
6 - presentation | nicht implementiert |
7 - application layer | Anwendungsspezifisch |
Physical Layer
Der komplette Datenfluss läuft über eine RS232-Schnittstelle, wobei auf der Mikrocontroller-Platine vorzugsweise ein weiblicher SUB-D-Stecker angebracht wird, so dass sich Platine und PC mit einem normalen Modem-(nicht Nullmodem!)Kabel verbinden lassen. Dabei wird auf PC-Seite das oben beschriebene Verfahren der Hardwareflusskontrolle verwendet. Mit "PC-Seite" ist gemeint, dass im PC die Hardwareflusskontrolle eingeschaltet sein muss, beim Mikrocontroller nicht. Damit wartet der PC immer auf das Freigabesignal des Mikrocontrollers, bis er Daten sendet (der Mikrocontroller ist langsam und könnte ja mit dem Empfangen berfordert sein) - der Mikrocontroller hingegen kann immer Daten senden und muss nicht auf die Freigabe des PCs warten. Diese einseitige Hardwareflusskontrolle ist so durchführbar, da erstens der PC einen relativ großen Empfangsbuffer hat, zweitens der PC so schnell ist, dass er die Daten des Mikrocontrollers ohne Probleme verarbeiten kann und drittens der Mikrocontroller meistens nur Daten sendet, wenn sie der PC angefordert hat. Ein Vorteil dieses Konzeptes ist, das ein Eingang des Mikrocontrollers weniger belegt ist und dass man im Mikrocontrollerprogramm nie überprfen muss, ob der PC bereit ist.
Der Schaltplan zeigt den Anschluss eines Mikrocontrollers (hier der Atmel ATMega128) an den RS232-Treiber MAX232. Dabei sollte man beachten, dass die Sendeleitung des Mikrocontrollers (TXD) der Empfangsleitung der RS232-Schnittstelle (RS232_RXD) des PCs entspricht!
Wird ein Nullmodemkabel mit einem männlichen SUB-D-Stecker auf der Mikrocontroller-Platine benutzt, muss der TxD-Pin des Mikrocontrollers mit dem TxD-Pin (Pin 3) des SUB-D-Steckers verbunden werden.
Data Link Layer
Der Start eines Paketes wird mit einem eindeutigen Startbyte (UART_START) gekennzeichnet. Dadurch kann ein während einer Paket-Übertragung eingeschalteter Empfänger das nächste Paket erkennen und erst dann mit dem Empfang starten. Damit ein im Datenstrom zufällig auftauchendes Startbyte nicht als solches falsch verstanden wird, mssen folgende Ersetzungen vorgenommen werden:- UART_START > UART_ESC + UART_ESC_START
- UART_ESC > UART_ESC + UART_ESC_ESC
#define UART_START 0x7e #define UART_ESC 0x70 #define UART_ESC_ESC 0x71 #define UART_ESC_START 0x72
Dieser Mechanismus ist aus dem SLIP-Protkoll (siehe RFC 1055) entnommen.
Jeder Empfang eines Paketes wird durch den Empfänger mit einem Byte quittiert: 0xFF wenn der Empfang fehlerfrei war oder 0x00 bei Fehlern.
Da bei diesem Byte ebenfalls Fehler auftreten können, wurde bewusst 0xFF (Binär 0b11111111) und 0x00 (Binär 0b00000000) gewählt.
Der Sender des Datenpaketes kann nun anhand der Anzahl von '1' im binären Muster erkennen, ob ein Fehler (Anzahl < 4) auftrat oder ob der Empfang der Daten bei der Gegenstelle erfolgreich (Anzahl > 4) war.
Die Wahrscheinlichkeit, dass in diesem Byte mehr als vier Bitfehler auf einmal auftreten und die Quittierung somit falsch interpretiert wird, ist extrem gering.
Wird nun ein Paket mit 0x00 quittiert, so wird es solange wiederholt, bis es mit 0xFF quittiert wird. Sollte einmal die Antwort ausbleiben (Timeout), so wird es bis zu drei mal wiederholt.
Theoretisches Hintergrundwissen gibt's dazu bei der Vorlesung Rechnernetze Uni Mannheim.
Network-Layer
Ein Datenpaket ist wie folgt aufgebaut:Paket-ID | Datenlänge | Daten.... | CRC (16-bit) |
Abschnitt | Bytes | Beschreibung |
---|---|---|
Paket-ID | 2 | Dient zur eindeutigen Identifizierung des Paket-Inhaltes |
Datenlänge | 1 | Anzahl der nun folgenden Datenbytes |
Daten | 0..255 | Benutzerspezifische Daten |
CRC | 2 | CRC-CCITT mit Generatorpolynom 0x11021 |
Detaillierte Erläuterungen zur CRC-Berechnung gibt es bei http://www.iti.fh-flensburg.de/lang/algorithmen/code/crc/crc.htm und im Appnote 730 von Microchip.
Soll nun ein bestimmtes Paket beim Kommunikationspartner angefordert werden, so wird ein Paket mit der ensprechenden ID und einer Datenlänge von null gesendet.
Application Layer
Nun muss für jede Anwendung definiert werden, in welchem Paket (erkennbar an der ID) welche Daten bertragen werden.Download
C-Routinen (Inline-Assember) zur CRC-Berechnung für Atmel Mikrocontroller (8-bit)