Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   USB-Port, Python to Delphi, Delphi XE3 (https://www.delphipraxis.net/199002-usb-port-python-delphi-delphi-xe3.html)

newIndy 18. Dez 2018 11:53

USB-Port, Python to Delphi, Delphi XE3
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo, schön dass es die 'Delphi-Praxis' noch gibt.

Ich habe folgendes Problem, an dem ich schon einige Tage hänge.
Ein externer Baustein(ein Sensor) wird über USB angesprochen.
Dazu sind simple ASCII-Kommandos erforderlich.
Leider gibt es nur einen Python-Beispielcode.
Das Problem ist also genau gesagt der Verbindungsaufbau und die Decodierung.

Ich habe den Sourcecode mit dem, was ich bisher erreicht habe und
ein Bild der TestForm angehängt
und würde mich sehr über eure Antworten freuen.

Sherlock 18. Dez 2018 12:11

AW: USB-Port, Python to Delphi, Delphi XE3
 
Zunächst mal: Man kann mit Delphi auch Konsolenanwendungen schreiben, dann muss man sich nicht mit SchnickSchnack beschäftigen und kann sich auf das wesentliche konzentrieren. Es wäre dann auch viel einfacher den Python-Code zu übertragen. Mir fällt dabei dann auf, daß Dein Delphi JustSendCommand nicht dem Python justSendCommand entspricht.
Die ser.write Methode in Python entspricht ziemlich genau der ser.Write Methode in Delphi. Warum Du also nach dem "/n" was "new line" bedeutet, noch ein Carriage Return und Line Feed hängst, verstehe ich nicht. Edith formuliert das mal etwas um: Das /n wird von Python und vielen anderen Sprachen als New Line interpretiert. Delphi macht das IIRC nicht. Darum lässt du das /n weg und packst Dein CR+LF dazu. Vielleicht tut es auch einfahc nur das LF, wie es in Deinen Kommentaren eigentlich auch steht.

Ab da geht vermutlich schon die Antwort in die Binsen. Versuch es halt erstmal einfacher.

Sherlock

newIndy 18. Dez 2018 14:46

AW: USB-Port, Python to Delphi, Delphi XE3
 
Hallo Sherlock. Erst mal vielen Dank für deine Antwort.

Das ein "/n" und CR an das Kommando angehängt wird, habe ich der (leider schlechten) Dokumentation entnommen, aber hier hast du wohl recht.:)
Der Sensor schickt nun nach "! #13#10" etwas zurück, was aber leider nicht lesbar ist. Hier ist wohl die Decodierung falsch.
Wie kann man das 'encode' und 'decode' korrekt in Delphi einsetzen.

ser.write(str.encode(command+"\n"))

reply = ser.readline().decode("utf-8")

Sherlock 18. Dez 2018 15:04

AW: USB-Port, Python to Delphi, Delphi XE3
 
Ja, das decode ist etwas schwieriger. Ich weiß leider nicht, was das für ein Serialport-Objekt ist, mit dem Du da in Delphi arbeitest. Gut wäre es, wenn es beim readline lieber eine Bytefolge im Stile eines Array of Byte zurückgäbe. Im String könnte bereits etwas verloren gehen. Oder Du musst dem Ding irgendwo noch mitteilen, wie es die Bytes zu interpretieren hat. Das da String rauskommt, ist etwas unglücklich.

Sherlock

newIndy 18. Dez 2018 15:19

AW: USB-Port, Python to Delphi, Delphi XE3
 
Ok danke. Ich werde da später nochmals experimentieren und die 'function Readline' umschreiben.

dummzeuch 18. Dez 2018 16:14

AW: USB-Port, Python to Delphi, Delphi XE3
 
Wie Sherlock schon schreibt: "\n" ist Python nur ein Linefeed (#10).
Ansonsten kannst Du davon ausgehen, dass Sensoren bei serieller Kommunikation immer nur ASCII-Zeichen senden und empfangen. Je nachdem, welche Serial Port Komponenten Du verwendest, konvertiert die die Bytes fehlerhaft. Am Besten Du liest und schreibst nicht Strings sondern RawByteArray's.

newIndy 18. Dez 2018 17:04

AW: USB-Port, Python to Delphi, Delphi XE3
 
Danke an euch beide. :-D
Lesen und schreiben klappt jetzt.
Ich habe die 'ReadLine' entsprechend umgeschrieben.

Function TSerialPort.ReadLine:String;
var d: array[1..100] of Byte;
s: string;
i: Integer;
BytesRead:Cardinal;
begin
BytesToRead := SizeOf(d);
Result := '';
if not ReadFile(ComFile, d, BytesToRead, BytesRead, nil) then
begin
{ Raise an exception }
MainForm.Memo1.Lines.Add('Fehler, BytesRead: '+IntToStr(BytesRead));
end else MainForm.Memo1.Lines.Add('BytesRead: '+IntToStr(BytesRead));
s := '';
for i := 1 to BytesRead do s := s + Chr(d[i]);
Result := s;
end;
Schöne Feiertage:lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz