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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Kommunikation mit Taschenrechner via pyserial

Beitragvon numerix » Sonntag 4. Januar 2009, 14:14

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

Beitragvon pyFan » Sonntag 4. Januar 2009, 15:53

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

Beitragvon numerix » Sonntag 4. Januar 2009, 17:20

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: 1374
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Sonntag 4. Januar 2009, 18:14

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

Beitragvon numerix » Sonntag 4. Januar 2009, 19:58

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: 1374
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Sonntag 4. Januar 2009, 23:15

Hallo numerix

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

[code=]
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[/code]


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

Beitragvon numerix » Montag 5. Januar 2009, 10:42

@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:

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder