AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
Thema durchsuchen
Ansicht
Themen-Optionen

bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)

Ein Thema von Snoop007 · begonnen am 25. Jun 2004 · letzter Beitrag vom 13. Mär 2005
Antwort Antwort
Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#1

Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)

  Alt 14. Nov 2004, 18:49
Zitat von ddcool:
Hat es jemand schon geschafft?
Allerdings ... ich ... ^^ ... ich müsste exakt die gleiche fernbedienung haben. Ich hatte mal das gleiche problem, und hab mir daher das programm selber programmiert.
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':
CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0); Das daraus resultierende Handle speicherst du dir möglichst in eine Variable.

Diese Struktur mit den Daten, musst du an SetCommState übergeben, zum konfigurieren des Com-Ports.
Delphi-Quellcode:
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;
SetCommMask aufgerufen mit dem Parameter EV_RXCHAR setzt einen speziellen Event (ich weis nimmer so genau wozu).

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

Ich denke, mit diesen Tipps solltest du dir problemlos ein Programm schreiben können, dass deinen Anforderungen gerecht wird.

ciao, Philipp
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06: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