RS232 Schnittstelle

Baudrate setzen

Die Baudrate ist zu Beginn auf 19200 eingestellt und kann mit diesen Parametern geändert werden:
request = 0
wIndex = 0
wValue = Baudrate gemäß Tabelle oder Formel
65536 - (24 * 10^6 / (32 * Baudrate))

Je nach Definition innerhalb einer Programmierumgebung kann wValue mit Vorzeichen behaftet sein. Der Wertebereich geht dann nicht mehr von 0 bis 65535, sondern von -32768 bis 32767. Die Umrechnung geschieht bei Zahlen über 32767, indem von der Zahl 65536 abgezogen wird.

If wValue > 32767 then
wValue = wValue - 65536

In dieser Tabelle sind in Klammern die umgerechneten Werte angegeben.

19200 Baud = 65497 (-39)
14400 Baud = 65484 (-52)
9600 Baud = 65458 (-78)
4800 Baud = 65380 (-156)
2400 Baud = 65224 (-312)
1200 Baud = 64911 (-625)
300 Baud = 63036 (-2500)

Beispiel zum Setzen der Baudrate auf 9600:
send SERVICE vendor request 0 wValue 65458 wIndex 0
oder
send SERVICE vendor request 0 wValue -78 wIndex 0

 

Handshake/Dezimalwert zurücklesen

 

request = 0
wIndex = 1 für Handshake oder = 2 für Dezimalwert
wValue = 0

Wenn Zeichen über die RS232 Schnittstelle gesendet werden, so haben diese einen langen Weg vor sich. Von der Macintosh-Anwendung durch verschiedene Treiber und das Betriebssystem über die USB- Schnittstelle in Service USB und dann weiter an das externe RS232 Gerät. Wenn das externe Gerät nicht in der Lage ist Zeichen zu empfangen, so teilt es diesen Umstand Service USB über die Handshakeleitung (HSKi) mit. Service USB setzt Zeichen nur dann über die RS232 Schnittstelle ab, wenn das externe Gerät bereit ist (Hardwarehandshake). Nun kommt es vor, dass das externe Gerät nicht bereit ist und die Macintosh-Anwendung Zeichen über den USB an die RS232 Schnittstelle schicken möchte. In diesem Fall können bis zu 128 Byte zwischengepuffert werden. D.h. die Macintosh-Anwendung hat die Zeichen losgeschickt, der Sendebefehl ist ohne Fehler ausgeführt worden und das Macintosh-Programm geht davon aus, daß die Zeichen auch über RS232 ausgegeben wurden. Wenn nun die RS232-Gegenstelle nicht bereit ist, so verharren die Zeichen im Zwischenpuffer bis die Gegenstelle wieder bereit ist. Sollte der Zwischenpuffer voll sein, so kehrt der Sendebefehl nach einer gewissen, einstellbaren Zeit mit einem Fehler zurück. Es kann daher nützlich sein, die Handshakeleitung und somit die Bereitschaft der Gegenstelle zum Zeichenempfang vom Macintosh aus abzufragen und den Benutzer mit einer Meldung darauf hinzuweisen, dass das RS232-Gerät nicht betriebsbereit ist.

Bei den ab 2008 ausgelieferten Interfaces mit Firmware Version ab 3.x stehen insgesamt 16 bit bei den Digitaleingängen zur Verfügung und Bit8 ist mit dem Zustand der Handshakeleitung belegt.

Für ältere Interfaces bzw. aus Gründen der Softwarekompatibiliät kann an Stelle der Digitaleingänge die Handshakeleitung auf Bit4 empfangen werden.

Der Befehl lautet:
send SERVICE vendor request 0 wValue 0 wIndex 1

Danach kann der Zustand des Digitaleingangs durch verschiedene, zuvor besprochene Befehle, ausgelesen werden. Als Beispiel sei hier genannt:
compare SERVICE input value mask "XXX0XXXX".
Bit 4 entspricht der Handshakeleitung. Alle anderen Bits sind zu ignorieren. Das RS232-Gerät ist bereit, wenn Bit 4 logisch 0 aufweist. So liefert z.B. compare SERVICE input value mask "XXX0XXXX" true zurück, wenn das RS232-Gerät bereit ist.

Wichtig ! Vergessen Sie nicht diesen Zustand wieder zu ändern, wenn Sie die Digitaleingänge nutzen möchten.
send SERVICE vendor request 0 wValue 0 wIndex 2 device id 0
stellt den Ursprungszustand wieder her.

 

Zeichen ersetzen

Service USB kann veranlasst werden, ein Zeichen beim Senden durch ein anderes Zeichen zu ersetzen. Hierdurch können Sie eine Zeichensatztabelle im Service USB hinterlegen, wenn das RS232 Gerät (z.B. Kassenbondrucker) eine andere Zeichensatztabelle verwendet als der Macintosh. Dieser Zeichenaustausch funktioniert für Sendedaten zum externen RS232 Gerät. Empfangene Zeichen werden nicht verändert. Die Beispielprogramme für Service USB RS232 und das Kassenprogramm für den Einzelhandel machen von dieser Funktion regen Gebrauch, um die Zeichensätze von Macintosh und Bondrucker in Einklang zu bringen. Im Zuge von UTF-8 und Unicode verliert dieser Befehl langsam an Bedeutung und ist aus Kompatibilitätsgründen noch enthalten.
request = 0
wIndex = 3
wValue = 0xAABB
AA = von
BB = nach
Beispiel, um statt eines X ein U auszugeben
X = ASCII Hexadezimalwert 58
U = ASCII Hexadezimalwert 55

Der auszugebende Hexadezimalwert für wValue lautet also 5855. Je nach Programmierumgebung muss dieser Wert noch in das Dezimalzahlensystem umgerechnet werden. So nimmt z.B. der AppleScript Befehl nur Dezimalzahlen entgegen und lautet wie folgt:
send SERVICE vendor request 0 wValue 22613 wIndex 3 device id 0
Je nach Definition innerhalb einer Programmierumgebung kann wValue mit Vorzeichen behaftet sein. Der Wertebereich geht dann nicht mehr von 0 bis 65535, sondern von -32768 bis 32767. Die Umrechnung geschieht bei Zahlen über 32767, indem von der Zahl 65536 abgezogen wird.
If wValue > 32767 then
wValue = wValue - 65536

 

Zeichen senden

Zeichen über die RS232 Schnittstelle gibt folgender Befehl aus
write bytes to SERVICE pipe x data y data size z

Es gelten diese Parameter:
pipe = muß immer 0 sein.
data = die zu sendenden Daten
data size = die Länge der zu sendenden Daten in Bytes. Wenn dieser Parameter 0 ist, werden alle Daten ausgegeben.
device id = Seriennummer des Service USB. Kann 0 sein, wenn nur ein Service USB angeschlossen ist.
timeout = Zeitangabe in 1/60 Sekunden, die versucht wird um die Daten über RS232 auszugeben. Wenn das externe RS232 Gerät nicht bereit ist (Handshakeleitung) und der interne Zeichenpuffer (maximal 128Bytes) voll ist, kann der Befehl keine Zeichen senden. Er versucht es dann so lange, wie unter „timeout" angegeben und kehrt bei Erfolglosigkeit mit Fehler 13001 (errServiceUSB_Timeout) zurück.
Beispiel:
write bytes to SERVICE pipe 0 data "Eukalyptusbonbon" timeout 100

 

Zeichen empfangen

Empfangene Zeichen werden in einem Macintosh internen Zwischenpuffer mit einer Größe von ca. 1000 Bytes abgelegt. Dieser Zwischenpuffer kann mit folgendem Befehl ausgelesen werden
read bytes from SERVICE
Dabei gelten diese Parameter
pipe = muß immer 0 sein.
for = die Anzahl der zu lesenden Zeichen. Ist dieser Parameter 0, so werden alle Zeichen gelesen.
device id = Seriennummer des Service USB. Kann 0 sein, wenn nur ein Service USB angeschlossen ist.
timeout kann 0 sein.

 

Anzahl der empfangenen Zeichen herausfinden

Manchmal ist es nützlich herauszufinden ob schon Zeichen empfangen wurden.
read bytes available in SERVICE pipe gibt die Anzahl der zur Zeit im Macintosh-Puffer befindlichen Zeichen zurück.
Beispiel:
read bytes available in SERVICE pipe 0

Unter AppleScript und dem Framework (Xcode) kann auch ein Notification-Service gestartet werden.
Beispiel:
register SERVICE device notification notification type bytes in read pipe notification value 0

Tipp: Im Ordner Xcode/SUSBTerminal/build befindet sich ein einfaches Terminalprogramm, mit dem die Funktion der RS232 und der angeschlossenen Geräte geprüft werden kann.