Autor Beitrag
boozzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66

Win XP, Win 2000, SuSe Linux

BeitragVerfasst: Di 17.05.05 22:14 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 17.05.05 22: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66

Win XP, Win 2000, SuSe Linux

BeitragVerfasst: Mi 18.05.05 12: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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Mi 18.05.05 12: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:
ausblenden 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:

  • 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).

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
boozzz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66

Win XP, Win 2000, SuSe Linux

BeitragVerfasst: Mi 18.05.05 16: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Do 19.05.05 08: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 !


ausblenden 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

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
boozzz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66

Win XP, Win 2000, SuSe Linux

BeitragVerfasst: Do 19.05.05 13: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:

ausblenden 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
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 21.05.05 15: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