Kommunikation mit Taschenrechner via pyserial

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ich besitze einen Casio Taschenrechner, der über ein Kabel mit dem seriellen Port eines Computers Daten austauschen kann. Mit Hilfe des von Casio stammenden Windows-Programms funktioniert das.

Es gibt für Linux cafix und gafix, zwei Programme, die das ebenfalls leisten sollen, allerdings nicht für mein Modell. Der Versuch der Datenübertragung endet nach ca. 1 Sekunde mit einer allgemeinen Fehlermeldung auf dem TR-Display.

Ich habe nun - mal ganz naiv - mittels pyserial versucht, die Daten, die der TR beim Übertragen schickt, aufzusammeln, in der Hoffnung diese analysieren und dann selbst ein entsprechendes Programm schreiben zu können.

Diese Versuche enden im Prinzip so, wie die mit cafix/gafix: Fehlermeldung des TR. Vorher konnte ich eine Handvoll Bytes aufsammeln, die mir aber nicht weiterhelfen.

Meine Vermutung ist - auch ganz naiv -, dass der TR beim Übertragen (zunächst einmal nur TR -> PC) eine Kennung sendet und das Programm auf dem Computer eine entsprechende Kennung zurücksendet um anzuzeigen, dass Daten übertragen werden können. Da ich nicht weiß, was der TR vom PC erwartet, komme ich da nicht weiter.

Wenn es gelänge - auch ganz naiv gedacht -, den Port bei einer funktionierenden Übertragung durch das Windowsprogramm zu belauschen und die übertragenen Daten zu sammeln, dann käme ich damit vielleicht weiter. Ob so ein Belauschen (mit einfachen Mitteln) möglich ist, weiß ich nicht.

Das ganze ist nicht lebenswichtig, das Casio-Programm läuft auch unter wine, so dass mir eine Übertragung grundsätzlich möglich ist. Es wäre aber eine reizvolle Sache, so ein Programm mit Python selbst zu entwickeln.

Und jetzt die Frage: Wie stehen aus Expertensicht die Chancen, das zu realisieren?
Benutzeravatar
pyFan
User
Beiträge: 22
Registriert: Sonntag 4. Januar 2009, 15:44

Hallo!

Ich bin neu hier.
Das heisst, so ganz neu nicht.
Ich lese schon ein Jahr mit.
Finde die Beiträge hier sehr produktiv und
die Kentnisse der Betreiber und Poster hervorragend. Grosses Lob!!
Ihr habt mir schon viel geholfen.

Zum Taschenrechner:

Wenn es erst mal geht, würde ich unter Windows
mit dem Programm portmon den Datenverkehr mitschneiden.
So ein Programm gibts bestimmt auch unter Linux.

Dann muss man die Bytes, na ja, entschlüsseln.
Geht ja nicht anders. Allerdingst haben die Geräte, mit denen
ich per pySerial kommuniziert habe, immer "lesbare" Kommandos
gehabt.

Achtung beim Datenempfang per pySerial.
evtl muss man jedes Zeichen einzeln vom COM-Port abholen
und die Strings wieder zusammensetzten.

Gruss

pyFan
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

pyFan hat geschrieben:Wenn es erst mal geht, würde ich unter Windows
mit dem Programm portmon den Datenverkehr mitschneiden.
So ein Programm gibts bestimmt auch unter Linux.
Hallo pyFan, willkommen im Forum!

Danke für den Hinweis auf portmon. Leider läuft das Programm unter wine nicht, einen Windowsrechner habe ich gerade nicht zur Hand. Für Linux gibt es jpnevulator, mit dem man am seriellen Port schnüffeln kann. Im Prinzip scheint es auch zu funktionieren, jpnevulator laufen zu lassen und dann mit dem funktionierenden Casio-Programm unter wine die Daten zu übertragen. Leider nur "im Prinzip", denn der TR scheint es irgendwie zu merken, dass er belauscht wird und meldet wieder die schon bekannte Fehlermeldung. Es kommen also die im ersten Post schon erwähnten paar Byte, die ich auch mit pyserial aufschnappen konnte und dann bricht die Verbindung ab. :cry:
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix

Ich nehme an du hast das Internet schon nach Angaben betreffs dem Übertragungsprotokoll für den Casio-TR durchsucht?

Habe noch diverse Fragen:

1) Musst du auf dem Casio irgend etwas einschalten damit die Kommunikation TR<->PC funktioniert oder versucht der TR selber eine Kommunkation zu starten sobald etwas an seine serielle Schnittstelle angeschlossen wird?

2) Wie sieht die Schnittstelle zu deinem Rechner aus? Hast du ein USB-Port, welches über ein USB-Seriellkonverter mit dem Casio-TR verbunden ist?

3) Ist der Byte-Stream TR->PC immer der gleiche bis es zum Abbruch kommt? Wieviele Bytes sind es etwa?

4) Was ist die genaue Bezeichnung des Casio-TR?

Gruss wuf :wink:

P.S. Eventuell hilft dieser Link:
http://users.telenet.be/gp/casio/
unter Rubrik:
25.03.2001 : Communication between Casio & PC updated.
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

wuf hat geschrieben:1) Musst du auf dem Casio irgend etwas einschalten damit die Kommunikation TR<->PC funktioniert oder versucht der TR selber eine Kommunkation zu starten sobald etwas an seine serielle Schnittstelle angeschlossen wird?
Ich bereite den TR vor, bis dieser beim nächsten Tastendruck sendet. Er erwartet, dass der PC/Software lauscht und den ankommenden Datenstrom verarbeitet. Dazu starte ich die Software und dort dann den "Empfangen"-Button, der per Status anzeigt, dass jetzt gelauscht wird. Sobald ich dann die TR-Taste drücke, schickt der TR die Daten los, das Programm zeigt dies per Statusbalken an.
wuf hat geschrieben:2) Wie sieht die Schnittstelle zu deinem Rechner aus? Hast du ein USB-Port, welches über ein USB-Seriellkonverter mit dem Casio-TR verbunden ist?
Nein, serieller Port (COM1), unter Linux ist das /dev/ttyS0.
wuf hat geschrieben:3) Ist der Byte-Stream TR->PC immer der gleiche bis es zum Abbruch kommt? Wieviele Bytes sind es etwa?
Nein. Im Bereich von 5-12 Byte.
wuf hat geschrieben:4) Was ist die genaue Bezeichnung des Casio-TR?
Casio Algebra FX 2.0

Mittlerweile bin ich ein Stückchen weiter. Auf einem Windows-Rechner konnte ich mittels portmon den Datenverkehr "mitschneiden". Die log-Datei einer erfolgreichen Übertragung TR -> PC sieht so aus:

Code: Alles auswählen

0	0.00000640	FA123	VCOMM_EscapeCommFunction	0x0	0x700465	Unknown Func: 38	
1	0.00071760	FA123	VCOMM_OpenComm	COM1	SUCCESS		
2	0.00000640	FA123	VCOMM_SetupComm	COM1	SUCCESS	RxSize: 4096 TxSize: 4096	
3	0.23723760	FA123	VCOMM_SetCommState	COM1	SUCCESS	Mask: ffffffff Baud: 9600 Bits: 7 Stop: 1 Parity: Even	
4	0.00000480	FA123	VCOMM_SetCommEventMask	COM1	SUCCESS		
5	0.00000560	FA123	VCOMM_EscapeCommFunction	COM1	SUCCESS	GETCOMBASEIRQ	
6	0.00000640	FA123	VCOMM_PurgeComm	COM1	SUCCESS	Receive Queue	
7	0.00000560	FA123	VCOMM_PurgeComm	COM1	SUCCESS	Transmit Queue	
8	0.20988560	FA123	VCOMM_SetCommState	COM1	SUCCESS	Mask: ffffffff Baud: 65307 Bits: 8 Stop: 1 Parity: None	
9	0.00001040	FA123	VCOMM_EscapeCommFunction	COM1	SUCCESS	SETDTR	
10	0.00000720	FA123	VCOMM_ReadComm	COM1	SUCCESS	Length: 0: 	
11	0.00000560	FA123	VCOMM_ClearCommError	COM1	SUCCESS	NOERROR	
# usw usw. 
FA123 ist das Programm bzw. die Bezeichnung für das Casio "FX-Link-Kit".

Außerdem habe ich einen Blick in die Quelltexte von (lib)cafix und gafix geworfen - leider alles in C bzw. z.T. in Perl; beides beherrsche ich nicht, so dass es für mich mühselig ist, zu verstehen, was genau da gemacht wurde. Hilfreich ist auf jeden Fall der sourcecode von gafix, weil da z.B. die ganzen Hexcodes in die entsprechenden Zeichen übersetzt werden.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix

Danke für deine Antwort. Hier noch etwas, welches ich aus Angaben vom Internet zusammengestellt habe:

Code: Alles auswählen

COMMUNICATION GRAPH 100 AND ALGEBRA FX:
--------------------------------------
Since I don't own a Graph 100 or an Algebra FX, this information isn't complete, but it should give you a good start.

PORT SETTINGS:
-------------
Set your COM-port to 1 startbit, 8 databits, no parity, 2 stopbits, 38400 baud

TRANSMIT/RECEIVE:
----------------
The communication process doesn't change, whether you transmit to your calculator or receive from it.
So the transmitter will be referred as T, and the receiver as R. Both calculator and PC can be T or R.

SCHEME:
------
This is the main scheme, for details about MAINHEADER, FILEHEADER, DATA and END, see HEADERS

--------------------------------------------
    Transmit                  Receive
--------------------------------------------
1 | 16h                     |
2 |                         |   13h
3 | <MAINHEADER>            |
4 |                         |   <MAINHEADER>
5 | 6h                      |
6 |                         |   6h
7 | <FILEHEADER>            |
8 |                         |   6h
9 | <DATA>                  |
10|                         |   6h
11| if there is still       |
    data to be send, goto 3 |


HEADERS:
-------
In this table you can find the data each header contains. Only values with a 'h' are to interpreted as
a hexadecimal value, all the others are ASCII tokens. All headers are 40 bytes long, except from DATA,
which is variable. Checksum is the value that makes the modulus 256 of the sum of all bytes in the header
equal to 3Ah (ie : the sum of each byte, including the checksum byte, is A ; when you divide A it by 256,
the rest should be 3Ah). This is used to check that all data is received well.

-----------------------------------------------
MAINHEADER      FILEHEADER      DATA        END
-----------------------------------------------
3Ah             3Ah             3Ah         3Ah
M               M               00h         E
D               C               00h         N
L               S               00h         D
1               1               00h         1
Z               00h             00h         FFh
X               00h             00h         FFh
9               00h             00h         FFh
4               Size High Byte  00h         FFh
5               Size Low Byte   00h         FFh
FFh             00h     00h     FFh
0               Name or FFh     Data        FFh
3               Name or FFh     Data        FFh
8               Name or FFh     ....        FFh
4               Name or FFh     Data        FFh
0               Name or FFh     Data        FFh
0               Name or FFh     00h         FFh
N               Name or FFh     Checksum    FFh
1               Name or FFh                 FFh
2Eh             FFh                         FFh
1               FFh                         FFh
0               FFh                         FFh
00h             FFh                         FFh
00h             FFh                         FFh
10h             FFh                         FFh
00h             FFh                         FFh
00h             FFh                         FFh
00h             FFh                         FFh
04h             FFh                         FFh
00h             FFh                         FFh
00h             FFh                         FFh
00h             FFh                         FFh
01h             FFh                         FFh
00h             FFh                         FFh
07h             FFh                         FFh
FFh             FFh                         FFh
FFh             FFh                         FFh
FFh             FFh                         FFh
FFh             FFh                         FFh
Checksum        Checksum                    Checksum
Habe ich gefunden unter:
http://users.telenet.be/gp/casio/
Rubrik:
26.05.2001 : The communication protocol for Graph 100 and Algebra FX2.0 is added.

FESTSTELLUNG:
Die Kommunikation startet scheinbar mit einer 0x16 und erwartet eine 0x13 zurück.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@wuf: Danke für deine Mühe. Bei nächster Gelegenheit werde ich mit den nun verfügbaren Informationen mal versuchen, ein Stück weiter zu kommen. Da dieses Programm auf meiner "ToDo" Liste aber eine niedrige Priorität hat, wird es wohl etwas dauern ... :wink:
Antworten