|
RS232 mit USB ansteuern
Die serielle Schnittstelle unter modernen Betriebssystemen programmatisch anzusteuern ist leider nicht mehr so einfach wie früher. Zum einen besteht das Problem, das viele Rechner gar keine serielle Schnittstelle mehr haben, hierzu gibt es jedoch die Möglichkeit, einen USB nach RS232 Adapter an den USB-Port zu stecken. Er wandelt die Signale normalerweise einfach um, vielmals gibt es jedoch das Problem, dass ältere Hardware andere Voltlevel (12V) als High und Low definieren als es die USB-Adapter (5V) tun.
Das nächste Problem besteht darin, dass es zwar viele Module unterschiedlichster Hersteller und Programmiersprachen gibt, jedoch nur sehr wenige dazu fähig sind, dass man programmatisch die einzelnen Pins der Schnittstelle auf High bzw. Low setzen kann. Meist ist hier die komplette serielle Datenübertragung derart gekapselt, dass man keine Pins direkt ansprechen kann, sondern nur den Weg über Baudraten, Paritätsbits und Stopbits gehen kann.
Python hat hier als moderne und einfach zu erlernende Skriptsprache zusätzlich die Möglichkeit geschaffen, die einzelnen Pins der seriellen Schnittstelle komplett individuell anzusteuern.
Da es hier sehr viele Versionen gibt, ist in den folgenden 3 Downloads ein Paket zusammengstellt, mit dem man mit Python unter WinXP die serielle Schnittstelle über einen USB-Adapter ansteuern kann.
>> Download Python Version 2.7.1 <<
>> Modul zur Ansteuerung der seriellen Schnittstelle <<
>> Hardwareunterstützung unter Win32 XP <<
Schließt man einen USB-RS232-Adapter an einen modernen Rechner an, so wird oft eine unüberschaubare Anzahl von seriellen COM-Ports am System angemeldet, welchen Port man nun wirklich programmatisch ansprechen kann, kann man einfach mit folgendem Snippet herausfinden:
import serial
s = -1
for x in range(0,10):
try:
s = serial.Serial(x)
print "initializing " + str(x) + " successful"
break
except:
print "initializing " + str(x) + " failed"
# do something with serial port s
# for example s.setRTS(level=1)
# finally close it
if not s is -1:
s.close()
print "port closed"
Hat man das alles geschafft und könnte man ggf. anfangen, sein eigenes Protokoll über die rohen Pins aufzusetzen, kommt man schnell an zwei viel gravierendere Probleme:
- Echtzeitprogrammierung kann man auf heutigen Multitask-Rechnern nahezu vergessen, Zeitmessungen sind relativ ungenau, weil es immer sein kann, das ein kritischer Task zwischendurch doch nochmal den Prozessor für sich alleine bekommt und somit die komplette Echtzeitsteuerung zunichte macht.
- WinAPI: so gut wie alle Bibliotheken, die man zum Ansteuern der seriellen Schnittstelle bekommt, setzen auf die WinAPI auf, bei neueren Betriebssystemen, bei denen man USB Adapter benutzen kann, ist die serielle Schnittstelle in eine Art Datei gekapselt. Kurz und knapp gesagt: Es kann sein, dass man bei zeitkritischen Steuerungen auf die Nase fällt, weil die Hardware schneller ist, als die Datei im Endeffekt aktualisiert wird. Somit kann es vorkommen, dass man an Port1 ein Signal erwartet, wenn an Port2 ein Signal vorhanden ist, aber zu dem Zeitpunkt die Datei noch nicht aktuell ist und man an Port1 ein veraltetes Signal bekommt.
Was nun ? Kann man alle selbstgebastelte Hardware vergessen ?
Nein, zum Glück ist der Zugriff auf die alte Hardware mithilfe der neuen USB-RS232 Adapter problemlos möglich, indem man tatsächlich die konventionelle Art der Übertragung mittels Baudrate usw. bewerkstelligt. Man muß lediglich beachten, dass man die Pegel von 0 bis 5V nach +12V und -12V anpassen muß. Das erledigt aber der leicht einzusetzende IC MAX232, er übernimmt keine Serialisierung von Daten sondern tatsächlich nur die Pegelwandlung. Auch ist hier anzumerken, dass er zwar mit 5V versorgt wird, aber mittels Ladungspumpen und externen Kondensatoren auf die höheren Voltpegel umwandeln kann.
Mithilfe eines MAX 232 Pegelwandlers kann man einen AVR direkt an den PC anschließen, denn viele AVRs besitzen eine sogenannte USART. Das einfache Angeben der Baudrate, das Einsetzen eines externen Quarzes und ein Schreiben eines Bytes in ein Register führt bereits dazu, dass ein Byte an den PC gesendet werden kann.
Folgende Schaltung zeigt den Aufbau eines Converters zur Übertragung von seriellen Daten an den PC:
Weitere Infos zu den Ports rechts oben (SCL und SDA) finden sich hier. |