Autor Beitrag
Onkel_Willi
Hält's aus hier
Beiträge: 6

Win 7 / Win 10
Delphi 10.1 Berlin Starter
BeitragVerfasst: Do 09.08.18 15:22 
Hallo liebe Delphi-Gemeinde,

ich habe bei Conrad eine 4fach Relaiskarte 393905 (CP2104) gekauft und möchte sie im Modellbahnbereich einsetzen. Da ist eine umfangreiches Softwarpaket dabei, u.a. ein "Relay_Card_Demo_SRC" in VB 2010, ein C++ Projekt und Entwicklerhinweise von Conrad als PDF(Anhang). Leider kein Delphiprojekt.
Ich scheitere bei der Übersetzung der Beispiele in Delphi. Habe leider nur Grundkenntnise in Delphi, bisher waren die aber für Steuerungsaufgaben ausreichend.
Relevant ist für mich eigentlich nur die Write Funktion.

Kann mir jemand helfen?

Mein bisheriger QuellCode:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
unit USB_4_Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, CPort, CPortCtl;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
 
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  USBDevice: THandle; {type THandle = Integer;}
  Byt: Byte;
  Count: DWORD;
  Str: String;

implementation

{$R *.dfm}

{Funktionen CP210x}
function CP210xRT_WriteLatch(Handle: Integer; Mask: Byte; Latch: Byte): Integer; stdcall ; external 'CP210xRuntime.dll';

//ComPort öffnen
procedure TForm1.Button1Click(Sender: TObject);
begin
  USBDevice := CreateFile('\.\COM6',GENERIC_READ or GENERIC_WRITE,0,NIL, OPEN_EXISTING,FILE_Attribute_Normal or FILE_FLAG_Overlapped,0);
  Byt := 85;
  WriteFile(Handle,Byt,1,Count,NIL);
  CloseHandle(USBDevice);
  Label2.Caption := InttoStr(USBDevice); //-> ergibt 4294967295
end;
//ComPort schließen
procedure TForm1.Button2Click(Sender: TObject);
begin
  //
end;
// Relais 0 schalten
procedure TForm1.Button3Click(Sender: TObject);
begin
  USBDevice := CreateFile('\.\COM6',GENERIC_READ or GENERIC_WRITE,0,NIL, OPEN_EXISTING,FILE_Attribute_Normal or FILE_FLAG_Overlapped,0);
  CP210xRT_WriteLatch(USBDevice,1,1);  // -> läuft durch ohne Fehlermeldung und ohne Formular
  CloseHandle(USBDevice);
end;
end.


Das Programm läuft durch, kein Form1, keine Fehlermeldung. Wenn ich CP210xRT_WriteLatch... als Kommentar kennzeichne, öffnet sich zumindest das Formular.

Wo habe ich was falsch gemacht?

Gibt es eine Möglichkeit, die CP210x.dll mit der ComPort Libray anzusprechen? Wie?


Danke für die Hilfe

Gert
Einloggen, um Attachments anzusehen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2038
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 09.08.18 16:55 
Guten Tag Onkel_Willi,

entweder schlägt das Datei-Handle direkt fehl, von Anfang an:
ausblenden Delphi-Quelltext
1:
USBDevice := CreateFile('\.\COM6',GENERIC_READ or GENERIC_WRITE,0,NIL, OPEN_EXISTING,FILE_Attribute_Normal or FILE_FLAG_Overlapped,0);  // Wert unbekannt					

oder es wird durch CloseHandle ungültig gemacht:
ausblenden Delphi-Quelltext
1:
2:
CloseHandle(USBDevice);
Label2.Caption := InttoStr(USBDevice); //-> ergibt 4294967295

Dein auskommentierter Wert entspricht:
ausblenden Delphi-Quelltext
1:
2:
const
  INVALID_HANDLE_VALUE = DWORD(-1); // = 4294967295 bzw. $FFFFFFFF

Prüfe daher das Handle auf seine Gültigkeit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if USBDevice <> INVALID_HANDLE_VALUE then
begin
  // usw. 
end;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Onkel_Willi Threadstarter
Hält's aus hier
Beiträge: 6

Win 7 / Win 10
Delphi 10.1 Berlin Starter
BeitragVerfasst: Do 09.08.18 19:30 
Hallo Frühlingsolle,

danke für die schnelle AW:

ich habe es mal überprüft:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//ComPort öffnen
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(InttoStr(INVALID_HANDLE_VALUE));  //-> 4294967295
  USBDevice := CreateFile('\\\.\\COM6',GENERIC_READ or GENERIC_WRITE,0,NIL, OPEN_EXISTING,FILE_Attribute_Normal or FILE_FLAG_Overlapped,0);
  Byt := 85;
  WriteFile(Handle,Byt,1,Count,NIL);
  if USBDevice <> INVALID_HANDLE_VALUE then
  begin
    ShowMessage('Händel gültig');  //keine Anzeige
    ShowMessage(InttoStr(USBDevice));
  end;
...


Du hast recht, das Händel ist ungültig.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2038
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 09.08.18 19:52 
Laut der Doku und der Headerdatei ist die Funktion anders deklariert:

ausblenden C++-Quelltext
1:
2:
3:
4:
CP210xRUNTIMEDLL_API CP210x_STATUS WINAPI
CP210xRT_WriteLatch(HANDLE cyHandle,
                    WORD    mask,
                    WORD latch);

Probier' daher folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
const
  CP210x_SUCCESS = 0;
  CP210x_INVALID_HANDLE = 1;
  CP210x_INVALID_PARAMETER = 2;
  CP210x_DEVICE_IO_FAILED  = 3;
  CP210x_FUNCTION_NOT_SUPPORTED = 4;
  CP210x_GLOBAL_DATA_ERROR = 5;
  CP210x_FILE_ERROR = 6;
  CP210x_COMMAND_FAILED = 8;
  CP210x_INVALID_ACCESS_TYPE = 9;
  CP210x_DEVICE_NOT_FOUND = $FF;

function CP210xRT_WriteLatch(Handle: THandle; Mask, Latch: Word): Integer; stdcallexternal 'CP210xRuntime.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  hUSBDevice: THandle;
  status: Integer;
begin
  hUSBDevice := CreateFile(PChar('COM3'), GENERIC_READ or GENERIC_WRITE, 0nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hUSBDevice <> INVALID_HANDLE_VALUE then
  begin
    status := CP210xRT_WriteLatch(hUSBDevice, 11);
    // if status = CP210x_SUCCESS then
    // ShowMessage('Kein Fehler');
    ShowMessage(IntToStr(status));
  end;
end;

Die Funktion CP210xRT_WriteLatch() liefert beim ungültigen Handle ebenso einen Wert (CP210x_INVALID_HANDLE = 1) zurück.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Onkel_Willi Threadstarter
Hält's aus hier
Beiträge: 6

Win 7 / Win 10
Delphi 10.1 Berlin Starter
BeitragVerfasst: Fr 10.08.18 15:10 
Hallo,

das Programm läuft mit Deinen Änderungen wie gehabt durch, kein Formular, keine Fehlermeldung.

Wenn ich
ausblenden Delphi-Quelltext
1:
//status := CP210xRT_WriteLatch(hUSBDevice, 1, 1);					

als Kommentar markiere, öffnet sich zumindest das Formular.

Sil Labs hat für die dll mehrere Dokumentaionen veröffentlicht. Conrad liefert auch die AN223 (Anhang) und die AN197 mit.
Vielleicht hilft die AN223 weiter.

Gert
Einloggen, um Attachments anzusehen!
Onkel_Willi Threadstarter
Hält's aus hier
Beiträge: 6

Win 7 / Win 10
Delphi 10.1 Berlin Starter
BeitragVerfasst: Fr 10.08.18 15:15 
Ich noch mal.

Die AN978 beschreibt eine andere DLL: CP210xManufacturing.DLL
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2038
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 10.08.18 17:35 
Die Funktion CP210xRT_WriteLatch() ist im AN978 und AN223 deckungsgleich beschrieben. :gruebel:
Zum Testen habe ich zwar keinen COM-Port parat, bekomme aber von der genannten Funktion den Wert 255 / $FF / CP210x_DEVICE_NOT_FOUND zurück, sobald ich einen falschen Port angebe.
Da verschwindet weder ein Fenster noch sonst was. :nixweiss:

Wichtig ist, dass CreatFile() ungleich INVALID_HANDLE_VALUE liefert (Adminrechte sind hierbei notwendig) und die DLL im gleichen Ordner sich befindet, wie die EXE. Das Datei-Handle gehört zum Schluss noch mit CloseHandle() freigegeben, das wärs auch schon.

Die CP210xRuntime.dll habe ich von hier.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Onkel_Willi Threadstarter
Hält's aus hier
Beiträge: 6

Win 7 / Win 10
Delphi 10.1 Berlin Starter
BeitragVerfasst: So 12.08.18 17:29 
Hallo,

danke für den Tipp mit der DLL. Mit der neuen DLL lief das Programm sofort.Ich habe schon an mir gezweifelt, und sicher nicht nur ich.
Mein Testprogramm funktioniert, ich kann alle Relais schalten. Allerdings kann ich die Logik der Latch-Werte nicht nachvollziehen.

Folgende Werte habe ich eingegeben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
const
  CP210x_GPIO_0 = 1;
  CP210x_GPIO_1 = 2;
  CP210x_GPIO_2 = 4;
  CP210x_GPIO_3 = 8;


In die Funktion CP210xRT_WriteLatch(Mask, Latch)

GPIO_0
ON 1, 0
OFF 1, 1

GPIO_1
ON 2, 0
OFF 2, 10

GPIO_2
ON 4, 0
OFF 4, 12

GPIO_3
ON 8, 0
OFF 8, 11

Das Zustandekommen Latch-Werte ist mir völlig unklar. Ich habe sie durch probieren gefunden.
Kannst Du mir das nochmal erklären?
Danke
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2038
Erhaltene Danke: 376

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 12.08.18 22:22 
Ich verstehe es leider auch nicht, tut mir leid.
Der Doku nach beschreibt Mask den jeweiligen Pin auf der Karte, der verändert/eingestellt werden soll, und Latch beschreibt einen Wert für eine Verriegelung. :nixweiss:

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9855
Erhaltene Danke: 1044

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: So 12.08.18 22:46 
Moin!

user profile iconOnkel_Willi hat folgendes geschrieben Zum zitierten Posting springen:
Das Zustandekommen Latch-Werte ist mir völlig unklar. Ich habe sie durch probieren gefunden.
Sieht nach inverser Logik auf einem GeneralPurposeInputOutput-Register aus (wieviel Bit insgesamt?). :nixweiss: Das ist nicht so ganz unüblich, da man dann mit PullUp-Widerständen arbeiten kann, was die inverse Logik erzwingt. :idea:

Funktioniert folgendes? (sollte es eigentlich, da deine Off-Werte das jeweilige Bit auch enthalten haben)
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
**GPIO_0
ON  1, 0
OFF 1, 1

**GPIO_1
ON  2, 0
OFF 2, 2

**GPIO_2
ON  4, 0
OFF 4, 4

**GPIO_3
ON  8, 0
OFF 8, 8

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Onkel_Willi Threadstarter
Hält's aus hier
Beiträge: 6

Win 7 / Win 10
Delphi 10.1 Berlin Starter
BeitragVerfasst: Mo 13.08.18 07:55 
Danke Narses,danke Frühlingsrolle
es funktioniert mit den Werten.

Hätte ich ohne Eure Hilfe nicht geschafft.