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;   //48 für Bitkombination 00110000
  IntToStr(i,s);
  p:=chr(2)+'o'+chr(s)+chr(3);  //'o' ist der Befehl zum Setzen aller Ausgänge
  com.SendData(p,4);            //Übertrage 4 Zeichen an serielle Schnittstelle
end;

end.


Leider funktioniert es noch nicht. Ich erhalte folgende Fehler:
Zeile 8: Zu Viele Parameter
Zeile 9: Inkompatible Typen

Moderiert von user profile iconraziel: 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;   //30Hex für Bitkombination 00110000   
  s:=IntToStr(i);   
  p:=chr(2)+'o'+chr(s)+chr(3);  //'o' ist der Befehl zum Setzen aller Ausgänge 
  com.SendData(p,4);            //Übertrage 4 Zeichen an serielle Schnittstelle   
end;

die hervorgehobene zeile verstehe ich nicht ganz.
so wie es aussieht willst du aber 4 zeichen senden:

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:
 
// Start 
ApdComPort1.putchar(#2); // STX (StartTransmission)binär: 00000010 oder hexadezimal bzw dezimal: 2
//Daten
ApdComPort1.putchar(#48); // binär: 00110000  oder hexadezimal 30 oder dezimal: 48
//Ende
ApdComPort1.putchar(#3); // ETX (Endtransmission)binär: 00000011 oder hexadezimal bzw dezimal: 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;   //48 (dezimal) für Bitkombination 00110000
  s:=chr(2)+'o'+chr(i)+chr(3);  //'o' ist der Befehl zum Setzen aller Ausgänge
  p:=PChar(s);
  com.SendData(p,4);        //Übertrage 4 Zeichen an com    
end;


Könnte mir vielleicht jemand sagen, warum am I/O Board immer noch nix ankommt?

Moderiert von user profile iconraziel: 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