Einzelnen Beitrag anzeigen

Benutzerbild von c113plpbr
c113plpbr

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

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