Entwickler-Ecke
Sonstiges (Delphi) - serielles I/O Board ansteuern
boozzz - Di 17.05.05 21:14
Titel: serielles I/O Board ansteuern
Hallo,
ich bin noch Neuling in Delphi. Könnte mir bitte die Unterschiede und Zusammenhänge der Datentypen char, pchar, String und Integer erklären? Wie funktionieren die Befehle chr() und IntToStr() ?
Ich möchte nämlich eine Bitkombination über die serielle Schnittstelle an einem digitalen 8-Bit Interface ausgeben. Kann mir hierbei bitte jemand helfen?
Wenn ich z.B. die Bitkombination 0000 0011 ans Interface übertragen will, wäre das dezimal die Zahl 3 (als Integer), die ich übertragen muss. Aber wie kann ich sie übertragen? :(
Um ein Datenpaket zu senden, muss es mit den Hexwerten 02h (Anfang) und 03h (Ende) abgegrentzt werden.
delfiphan - Di 17.05.05 21:20
Wie man die serielle Schnittstelle ansteuert: Suche mal im Forum. Das hatten wir schon viele Male.
Char ist ein Character, d.h. 1 Zeichen. z.B. 'a', oder '1'.
PChar ist ein Pointer auf ein Character. Man benützt es oftmals, um einen String zu übergeben (man übergibt dabei den Pointer auf das erste Zeichen des Strings.
String ist eine Zeichenkette (mind. 0 Zeichen, max. 2GB gross. z.B. 'Hallo');
Chr() wandelt eine Zahl in das entsprechende Ascii-Zeichen um. 'A' ist z.B. das Zeichen mit der Nummer 65. => Chr(65) = 'A'. Die Umkehrfunktion lautet Ord().
IntToStr() wandelt eine Zahl in einen String um. IntToStr(123) ist deswegen '123'. Die Umkehrfunktion lautet StrToInt().
Du solltest mal einige Tutorials durchschauen und bei Fragen zu konkreten Funktionen die Delphi-Hilfe konsultieren.
boozzz - Mi 18.05.05 11:28
Vielen Danke delfiphan. Das hat mich schon ein Stück weitergebracht.
Die bisherigen Forumsbeiträge zur seriellen Schnittstelle sind alle ziemlich anspruchsvoll und für einen Anfänger wie mich einfach zu hoch.
Wäre super, wenn mir da nochmal jemand helfen könnte.
Also, es soll beispielsweise die Bitkombination 00110000 ans I/O Board übertragen werden. Das wäre in Byte die Zahl 48, richtig?
Anschließend muss ich diese Integer-Zahl mit IntToStr() in einen String umwandeln, richtig?
Danach muss das Datenpaket mit 02h (Anfang) und 03h (Ende) begrentzt werden. Zusätzlich muss der Befehl 'o', der für das Setzen der Ausgänge steht, eingefügt werden.
Zu guter Letzt wird das ganze mit com.SendData(p,4) abgeschickt (com ist der Name der seriellen Schnittstelle).
Das ganze passiert, wenn auf den Button geklickt wird.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; s: string; p: pchar;
begin i:=48; IntToStr(i,s); p:=chr(2)+'o'+chr(s)+chr(3); com.SendData(p,4); end;
end. |
Leider funktioniert es noch nicht. Ich erhalte folgende Fehler:
Zeile 8: Zu Viele Parameter
Zeile 9: Inkompatible Typen
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
patrick - Mi 18.05.05 11:46
:hair:
das liegt daran, das du die funtionen total falsch anwendest.
außerdem würde ich lieber das HEX zahlensystem verwenden, da du das leichter umrechenen kannst.
eine hex zahl kannst du schreiben indem du einfach vor dem wert ein "$" setzt.
ich hat deinen code mal soweit umgeschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; s: string; p: pchar;
begin i:=$30; s:=IntToStr(i); p:=chr(2)+'o'+chr(s)+chr(3); com.SendData(p,4); end; |
die hervorgehobene zeile verstehe ich nicht ganz.
so wie es aussieht willst du aber 4 zeichen senden:
- zum einen 0000 0010
- dann der binärwerr des strings 'o' oder soll das eine 0(Null) sein?
- den wert 0011 0000
- und den wert 0000 0011
richtig?
so geht das leider nicht will du versucht 4 zeichen in einem zeichen (p) zu speichern.
mir geht leider grad die zeit aus. ich hab noch nen wichtigen termin.
aber ich würde dir empfehlen dir n delphibuch zu besorden. mit variablentypen sollte man sich zumindest auskennen. sonst läuft man sehr schnell an eingendlich unwichtigen dingen auf (wie bei dir ja passiert ist).
boozzz - Mi 18.05.05 15:10
Delphi Buch hab ich schon, da steht aber nicht drin, wie man die serielle Schnittstelle ansteuert. Wuerde mich daher freuen, wenn sich das nochmal jemand anschauen wuerde.
Die Datenpakete müssen mit den Befehlen <STX> und <ETX> begrentzt werden. STX=>02h (Anfang) und ETX=>03h (Ende). Daher auch chr(2) und chr(3) am Anfang und am Ende des Befehls.
Der Befehl zum Senden der Ausgaenge ist ein o (keine Null).
Der Fehler in Zeile 8 ist jetzt beseitigt. In Zeile 9 kommt aber immer noch die Fehlermeldung Inkompatible Typen. :(
chrisw - Do 19.05.05 07:58
Hier in Beispiel mit der Freeware Komponente Async Pro:
Dies setzt vorraus, dass die Komponente bereits installiert ist !
Du bringst die TApdComport Komponente auf dein Form und setzt die Parameter für die Schnittstelle im Object Inspector
(Schnittstellennummer, Baudrate, Start-Stopbits, Handshake) und öffnest die Schnittstelle (Open im OI auf True).
Jetzt kann es losgehen !
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| ApdComPort1.putchar(#2); ApdComPort1.putchar(#48); ApdComPort1.putchar(#3); |
boozzz - Do 19.05.05 12:27
Danke euch allen
Ich hab das Programm jetzt so weit bekommen, dass es fehlerfrei compiliert. Am Interface kommen aber noch keine Signale an. :(
Hier mein Programm zum Senden der Bitkombination 00110000:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var i, a: integer; s: string; p: pchar;
begin i:=48; s:=chr(2)+'o'+chr(i)+chr(3); p:=PChar(s); com.SendData(p,4); end; |
Könnte mir vielleicht jemand sagen, warum am I/O Board immer noch nix ankommt?
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
Hudel - Sa 21.05.05 14:37
Hi :-)
Ein paar Fragen :
Welche Komponente verwendest du ?
Wie und wo wird die Schnittstelle initialisiert ?
Sind die Schnittstellen Parameter korrekt (Baudrate, Parität, Stopbits) ?
Gruß
Hudel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!