![]() |
bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
Hi,
ich habe eine PCTV von Pinnacle, das mitgelierte Steuerungsprogramm der Fernbedienung erfüllt nicht meine Wünsche, so wollte ich kurzer Hand eine eigene Software schreiben, leider geht das nicht so einfach, ich habe schon diverse ComPort Komponenten benutzt auch mich auch schon selber dran versucht, alles ohne Erfolg, ich erhalte keine Daten vom Comport ausser, wenn ich das Programm starte erhalte ich eine 1 Vielleicht wiss Ihr Rat ? ich neheme langsam an, das die software an die Hardware gedongelt ist :roll: |
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
Wie schauts aus mit Baudrate, Parity und Stopp-Bits?
Evtl. is da was falsch eingestellt..? Stephan |
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
gute Frage, ich hab keinen blassen Schimmer welche Werte ich da eintragen muss, kann, soll, darf
ich wüsste auch nicht, wo ich das rausbekommen kann :gruebel: |
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
Ich kann dir nur den Tipp geben, das Programm winLIRC zu verwenden.
Dies kannst du dann auf deine Fernbedienung programmieren und die Tasten benennen. Wenn das Programm läuft öffnet es einen TCP-Port, auf diesen connectest du dich einfach, empfängst die Befehle und führst die Aktionen aus. Hat auch den Vorteil, dass sich beliebig viele Programme connecten können. |
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
Wenn du ein eigenes Prog machen willst, kannst du auch z.B. mit portmon von
![]() |
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
danke für den hinweis :)
|
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
Also ich hab e soweit alles schon herausgefunden:
Baudrate: 1200 Stop Bits: 1 Daten Bits: 8 mehr konnte ich leider nicht feststellen. Hat es jemand schon geschafft? Er könnte es mir ja mal schicken. THX ddcool |
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
Zitat:
Pinnacle selber gibt über diese Fernbedienung überhauptkeine info raus, das hab ich bereits versucht. Daher hab ich das original Programm mittels Disassembler auseinandergenommen, und bestimmte funktionen per Hook abgefangen, um an die Parameter zu kommen. Ein recht aufwendiges Verfahren, aber es hat geklappt, mit den folgenden Ergebnissen: Zuerst musst du den Com-Port z.B. per CreateFile 'öffnen':
Delphi-Quellcode:
Das daraus resultierende Handle speicherst du dir möglichst in eine Variable.
CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
Diese Struktur mit den Daten, musst du an SetCommState übergeben, zum konfigurieren des Com-Ports.
Delphi-Quellcode:
SetCommMask aufgerufen mit dem Parameter EV_RXCHAR setzt einen speziellen Event (ich weis nimmer so genau wozu).
var
dcb : TDCB; ... with dcb do begin DCBlength := sizeof(dcb); BaudRate := 1200; Flags := 4481; wReserved := 0; XonLim := 2048; XoffLim := 512; ByteSize := 8; Parity := 0; StopBits := 0; XonLim := 17; XoffChar := #19; ErrorChar := #0; EofChar := #0; EvtChar := #0; wReserved1 := 0; end; Per SetCommTimeouts solltest du noch Timeouts für die Lese/Schreib-Operationen (schreib-timeouts auch zu setzen sollte nicht schaden ^^) setzen. Dann kannst du z.B. in einer Schleife ReadFile aufrufen (3 bytes einlesen versuchen), wobei du, nachdem diese Funktion einen Wert zurückgibt checken musst, ob auch 3 bytes gelesen wurden. Sollte dies nicht der fall sein, war es warscheinlich ein Timeout. Das Original-Programm liest eigentlich 3x jeweils 1 byte ein. In meinem Programm sind daher diese Bytes dann genau umgekehrt in dem buffer, aber ob die bytes verdreht sind, oder nicht, spielt meist keine große rolle, außer du willst den code entschlüsseln, aber dann kannst du die einzelnen bytes ja immernoch umdrehen ;) Der einfachste Weg die empfangenen Signale auszuwerten, ist warscheinlich ne case-anweisung, die das eingelesene mit hardgecodeten werten vergleicht, die du vorher natürlich herausfinden musst. Bei mir ist z.B. der KeyCode für Mute $3CB5FE . "Richtigherum" geschrieben wäre das dann $FEB53C . ReadFile sollte man in einem eigenen Thread ausführen, da ansonsten das ganze Programm nichtmehr reagiert. Bei längerem drücken einer Taste auf der Fernbedienung ändern sich die wiederholungs-tastencodes, damit du erkennen kannst, ob länger draufgedrückt wird/wurde. Willst du die einzelnen teile des codes "entschlüsseln", musst du die Bytes "richtig" anordnen, dann in binärzahlen umwandeln, und schliesslich die Bits nach einem speziellen Raster anordnen. Ich hab es nicht ganz geschafft draufzukommen was all das genau bedeutet, ich hab nur herausgefunden, dass der code dem RC5 bzw. dem RC5x "Protokoll" ähnelt. Das sollte dann so gehen:
Code:
ss is meineswissens nach eine "code erkennung". T sollte eigentlich bei jedem Tastendruck zwischen 1 und 0 wechseln (was es aber komischerweise nicht tut), was dddd ist ist mir schleierhaft, CCCCCC sollte eine art "system command" sein, und DDDDDD sollte der eigentliche Tastencode sein. Aber das sind nur vermutungen ... wenn du da weiterkommst, wäre ich dir dankbar, wenn du es hier veröffentlichst. ;)
TastenCode für Taste 1 (richtig angeordnet):
FE 9F 31 in Binärschreibweise: 11111110 10011111 00110001 Angeordnet in der Code-"Maske" (die sollte es zumindest sein ...): 11 1 11110 1001 111100 110001 ss T SSSSS dddd CCCCCC DDDDDD Ich denke, mit diesen Tipps solltest du dir problemlos ein Programm schreiben können, dass deinen Anforderungen gerecht wird. ciao, Philipp |
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
Hallo Philipp,
ich habe deinen Code versucht, scheitere aber schon am CreateFile. Mein Laptop hat eine eingebaute IR-Schnittstelle, die laut Bios am COM4 haengt. Jedoch gibt der Aufruf mit COM4 als Name immer -1 zurueck, bei COM1 bzw. COM3 immer 1888. Das macht mich dann doch etwas stutzig. Hat jemand eine Ahnung warum es nicht geht? PS: OS ist WinXP Pro SP2, nur falls das was ausmacht.... Greetz alcaeus |
Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
hmm ... das kann nun natürlich mehrere gründe haben ...
Vielleicht läuft ein programm, das bereits auf Com4 zugreift, oder der Com-Port ist nicht installiert (siehe im gerätemanager). Es kann alles mögliche sein ... vielleicht mag er auch einfach den namen "Com4" nicht ... du könntest es daher mal mit "\\.\COM4\" probieren. Oder lass einfach mal GENERIC_WRITE weg ... einfach nen bissl rumtesten ... Interessant könnte vielleicht auch noch GetLastError sein ... im Falle eines schon geöffneten Com ports krieg ich da nämlich 5 als fehlercode zurück ... was auch immer das bedeutet ... ciao, Philipp |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz