Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi bekomme keine Daten vom ComPort (Pinnacle Fernbedienung) (https://www.delphipraxis.net/24743-bekomme-keine-daten-vom-comport-pinnacle-fernbedienung.html)

Snoop007 25. Jun 2004 13:04


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:

Steve 25. Jun 2004 13:45

Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
 
Wie schauts aus mit Baudrate, Parity und Stopp-Bits?
Evtl. is da was falsch eingestellt..?

Stephan

Snoop007 25. Jun 2004 15:14

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:

Vjay 29. Jun 2004 09:59

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.

scp 29. Jun 2004 11:34

Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
 
Wenn du ein eigenes Prog machen willst, kannst du auch z.B. mit portmon von Sysinternals "abhören", was das Original-Programm an den COM-Port sendet und empfängt. Evtl. ist ja nur eine kleine Init-Sequenz oder so erforderlich, die dem Gerät sagt, das die Software gestartet wurde.

Snoop007 30. Jun 2004 07:04

Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
 
danke für den hinweis :)

ddcool 14. Nov 2004 13:14

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

c113plpbr 14. Nov 2004 18:49

Re: bekomme keine Daten vom ComPort (Pinnacle Fernbedienung)
 
Zitat:

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':
Delphi-Quellcode:
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

alcaeus 13. Mär 2005 13:59

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

c113plpbr 13. Mär 2005 14:48

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.
Seite 1 von 2  1 2      

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