![]() |
String über Serielle Schnittstelle
Hallo, habe kurze und wichtige frage: Habe Delphi6 und benutze die PORT.DLL. Möchte die im Edit Feld eingegebene Tel. Nr. Seriell an einem Microkontroller übertragen. Die Kommunikation ansonst läuft, nur irgendwie komm ich net weiter. Übertragen wird immer nur ein Byte. Es soll aber Ziffer für Ziffer (Bsp.: 0171 >>> 30h,31h,37h,31h) übertragen werden. (00h,01h,07h,01h würde auch gehen, hauptsache die eigentlichen Zahlen tauchen auf, der rest kann der MC "wegschneiden". Habe auch schon im Forum gesucht, aber nichts passendes gefunden. Hier Programm-"Ausschnitt":
Delphi-Quellcode:
Ich danke jetzt schonmal an dieses schön aufgebaute Forum, finds gut, weiter so...
procedure TForm1.COM41Click(Sender: TObject);
begin OpenCom (pchar('com4:19200,N,8,1')); end; procedure TForm1.Beenden1Click(Sender: TObject); begin close; end; procedure TForm1.Button1Click(Sender: TObject); var ziffer : integer; s:string; begin if Edit1.Text <> '' then begin ziffer := strtoint(Edit1.Text); sendbyte (ziffer); end else showmessage ('Telefon-Nummer eingeben!'); end; MFG GierigeSau [edit=sakura] [delphi]-Tags Mfg, sakura[/edit] |
Re: String über Serielle Schnittstelle
Hi und herzlich Willkommen in der DP :dp:
An sich hast du mehrere Möglichkeiten dein Problem zu lösen. Das Erste was mir eingefallen ist (entspricht nicht ganz einer echten Lösung) wäre die Verwendung von TComPort (gibt's bei SourceForge). Hier findest du eine sehr schöne Kapselung, die auch ohne eine Dll auskommt (du brauchst nur die .exe die Delphi erstellt). Hier gibt sowohl Methoden, die Bytes als auch solche, die Strings verschicken. Was dein eigentliches Problem angeht, so ist StrToInt einfach die falsche Funktion. StrToInt wandelt den String in eine interpretierte Zahl um. Ist halt dann wichtig, wenn eine Benutzereingabe eine Zahl ist (und als solche interpretiert werden soll). Was du hier gerne hättest ist der Ordinale Wert des Zeichen. An sich besteht ein String aus einer Menge von Charactern. Ein Character ist (hier) genau ein Byte. Ord liefert dir den Ordinalen Wert dieses Zeichens. Umgekehrt würde Chr dir wiederum das Zeichen liefern, dass hinter einer Zahl steckt. Was den Code angeht, den du gepostet hast, so gibt es hier im Forum so genannte Tags zur Auszeichnung von Code. Dieser kann dann leichter als solcher erkannt werden. Die Tags findest du über dem Beitragseditor. Delphi-Code ist hier der Knopf den du verwenden kannst. Hier öffnet sich dann der Bereich des Codes und der Schalter trägt ein *. Dieses zeigt dir, dass du das Tag noch nicht geschlossen hast. Ein weiterer Click beendet dann den Codetag. Das ganze sieht dann so aus:
Delphi-Quellcode:
Wobei das Einrücken von mir erledigt wurde. Ist doch leserlicher, oder?
procedure TForm1.COM41Click(Sender: TObject);
begin OpenCom (pchar('com4:19200,N,8,1')); end; procedure TForm1.Beenden1Click(Sender: TObject); begin close; end; procedure TForm1.Button1Click(Sender: TObject); var ziffer : integer; s : string; begin if Edit1.Text <> '' then begin ziffer := strtoint(Edit1.Text); sendbyte (ziffer); end else begin showmessage ('Telefon-Nummer eingeben!'); end; end; Ok, jetzt nochmal zum Senden des String. Du möchtest diesen Byteweise verschicken, was auch heißt, dass du über den gesamten String laufen musst. Hier kannst du dann jedes zeichen einzeln umwandeln:
Delphi-Quellcode:
Gruß Der Unwissende
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer; begin if Edit1.Text <> '' then begin // über den ganzen String iterieren // Achtung, Strings sind 1 indiziert, dynamische Arrays beginnen bei 0! for i := 1 to length(Edit1.Text) do begin // Edit1.Text[i] = das i-te Zeichen aus Edit1.Text // ord(ZEICHEN) = der Ordinale Wert des ZEICHEN sendbyte(ord(Edit1.Text[i])); end; end else begin showmessage ('Telefon-Nummer eingeben!'); end; end; |
Re: String über Serielle Schnittstelle
Sau GEIL... Danke, läuft und habe was dazu gelernt... Nochmals Dankeschön...
MFG GierigeSau |
Re: String über Serielle Schnittstelle
Zitat:
Na dann viel Spaß damit Gruß Der Unwissende |
Re: String über Serielle Schnittstelle
emm, noch ne kurze frage, wie bekomm ich die Anzahl der stellen raus (i), bevor ich die einzelnen Bytes übertrage, müsste die Anzahl der stellen vorher übertragen. Danke nochmal, ansonsten klappt es jetzt super... :coder2:
MFG GierigeSau (Delphi-beginner :wiejetzt: ) |
Re: String über Serielle Schnittstelle
Ja, dazu müsstest du zuerst die Anzahl der Stellen übertragen.
|
Re: String über Serielle Schnittstelle
hmm, genau das möcht ich ja, nur erst die Anzahl der Ziffern und dann die einzelnen Ziffern. Letzteres klappt nu ja schon...
MFG GS |
Re: String über Serielle Schnittstelle
length(s) gibt dir die Länge des Strings s zurück. Dies wäre dann aber ein Integer Wert. Hier musst du also aufpassen, da du diese Zahl als Byte überträgst. Wenn du sicher sein kannst, dass du hier nie über 255 Zeichen überträgst kannst du das auch casten:
Delphi-Quellcode:
Hier aber wirklich vorsichtig sein, du schneidest alles andere einfach ab. Ansonsten musst du halt 4 Byte zusammenfassen und als 32 Bit Wert interpretieren.
var laenge : Byte;
begin laenge := Byte(length(s)); end; Gruß Der Unwissende |
Re: String über Serielle Schnittstelle
Klappt natürlich wieder... :dp: Göttlich... *anbet* Dankeschön...
Der Unwissende = :angel: MFG GS |
Re: String über Serielle Schnittstelle
Hi, ich bins wieder. Beim letzten mal hat es auf anhieb geklapt, nur leider hab ich die surce verschlampt :gruebel: . Nu bekomm ich es einfach nicht mehr auf die reihe... Das Prog soll ja zuerst die anzahl der stellen und dann die eigentliche nummer übertragen, letzteres funktioniert auch tadellos, nur das übertragen der stellenanzahl nicht, habe alles probiert, klappt einfach nicht... Vllt habe ich auch nur einen Denkfehler :wall: . Beim letzten mal hab ich das Prog so weggetippt. Kann mir jemand helfen???
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 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