PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rs232 mit Delphi



Static
18.04.2005, 19:46
Hallo, ich arbeite gerade an einer Steuerungsoftware für meinen selbst gebauten Plotter. Ich hab vor das mit Delphi zu machen (da ich das schon ein bisschen kenne und in der Schule eh Pascal lernen muss/darf). Die Kommunikation läuft über den Com Port und ich benutze diese vorgefertigten Funktionen hier um diesen anzusteuern:

http://www.swissdelphicenter.ch/de/showcode.php?id=841

Ich habe in einem Bascom Programm schon ein paar Befehle einprogrammiert, auf die er reagieren soll wenn diese über rs232 reinkommen. Wenn ich nun diese Befehle übers Bascom Terminal schicke funktioniert dies auch Tadellos.
Mein improvisiertes Terminal mit Delphi funktioniert auch soweit, dass der MC die Befehle empfängt und auch scheinbar korrekt auf dem LCD ausgiebt.
Das Merkwürdige ist nur: Er reagiert nicht auf die Befehle!
Selbst wenn ich den MC so programmiere, dass er den ersten Befehl der ankommt auf eine Variable speichert und bei allen weiteren Eingaben die den selben Inhalt haben (wie diese Variable) eine Aktion ausführt, passiert nichts! Das ist irgendwie ziemlich merkwürdig...

Ich dachte erst, dass es vielleicht daran liegt, das Delphi die Zeichen einzeln nacheinander sendet und der MC dann jedes einzelne Zeichen als eine Eingabe ansieht, doch dann müsste die Ausgabe (er sendet immer die Eingegangenen Befehle zurück) komplett anders sein.

Könnte es vielleicht hier dran liegen:

An den übergebenen String einen Zeilenumbruch (#13 + #10) hängen
}
s := s + #13 + #10;

Also an dem Zeilenumbruch, der an den String gehängt wird, welcher dann auf dem Comport ausgegeben wird? Ich weiß zwar nicht wirklich was die "+ #13 + #10" machen, aber ohne sendet er garnichts :-k

Achso zur Information, ich benutze (da ich am Laptop keine Comports habe) den USB-RS232 Adapter von Reichelt. Bisher hatte ich aber damit keine Probleme und mit Bascom und Megaload funktioniert er sehr zuverlässig.

Okay, schonmal vielen Dank fürs lesen, ich hoffe hier gibt es wen der auch RS232 mit Delphi macht.

NumberFive
18.04.2005, 20:06
Also das es am 13+10 liegt kann ich mir nicht vorstellen den das interresiert nur den empänger und nicht den comport. die beiden zeichen markieren nur das ende einer zeile.

#13 = wagen rücklauf (schreibmachine)
#10 = zeilen vorschub

Die RS ist sehr zeit empfindlich kann mit nicht vorstellen das es ohne Thread geht beim lesen. Hast du mal an der anderen seite ein Terminal gehängt ? passt die baudrate ?
was steht in BytesWritten ?
nach dem schreiben ?

Leider habe ich in delphi bis jetzt immer nur gelesen das schreiben ist zwar programmiert aber ich habe es noch nicht geteste da ich auf c++ um gestiegen bin. Welches Delphi benutzt du ?

Mfg

Static
18.04.2005, 21:55
achso, ja am andern Ende hängt ein Mega32 Microcontroller. Die Baudrate habe ich auf beiden Seiten auf 9600 gestellt. Die Eingaben scheinen ja auch richtig anzukommen (ich geb sie auf einem LCD was an den mc angeschlossen ist aus und der mc sendet die Eingabe nochmal zurück als bestätigung). Aber irgendwie scheint der Microcontroller in zwei von mir identisch eingetippten Eingaben doch noch einen Unterschied zu sehen, also scheint da ja irgendwas nicht zu funktionieren.
Dann werd ich wohl mal ausprobieren auf die andere Seite auch einen Pc zu hängen und mal gucken was da "wirklich" raus kommt. Sehr merkwürdig...
Ich benutze Delphi 2005 auf win xp

RCO
18.04.2005, 23:22
Hast du den Anhang: "+ #13 + #10;" jetzt mal weggelassen?

Static
19.04.2005, 14:43
jaja, hab ich mal weg gelassen. Dann kommt aber scheinbar gar nichts an.
Wenn ich die Zeit finde werde ich heute mal einen Computer ans andere Ende hängen und gucken was da wirklich raus kommt.
Oder hat vielleicht schonmal jemand in Delphi ein Programm für rs232 geschrieben, was er mir zum test zur verfügung stellen könnte?
Das war bloß die einfachste Variante die ich finden konnte.

RCO
19.04.2005, 14:54
Ja habe ich, sendet aber bestimmte Zeichen, ist also in dem Sinne kein Terminal. Es ist im Zuge meines ToS-Projektes entstanden:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=8248

Könntest es zumindest zum senden von "Datenmüll" verwenden.

NumberFive
19.04.2005, 19:02
Ich habe da noch eine Idee was es sein könnte.

ich weiß ja nicht was in deinem prg das Ende des Befehls makiert wenn
aber zu beispiel das chr(10) ist dann würde es mir erklären warum du auf
dem lcd was siehst aber der befehl nicht erkannt wird.

Das LCD stell sicher kein sonder zeichen da dann sieht man nur den text aber im string für den befehl steht dann befehl+chr(13) und das ist nicht gleich befehl.

Kannst du mir folgen ?

Gruß

Static
19.04.2005, 20:07
also das in dem gesendeten String sozusagen noch irgendwas hinter steht, womit der MC nichts anfangen kann?
Das könnte sein, ich habe einfach einen string mit 10 Zeichen als Variable genommen. Würde zwar trotzdem nicht erklären warum das mit delphi gesendet anders ist als das vom bascom terminal, aber ich werds mal ausprobieren einfach nur einen Buchstaben zu benutzen.

Static
19.04.2005, 20:31
Also ich hab jetzt was noch merkwürdigeres festgestellt. Wenn ich vorher das Bascom Terminal zum benutzen des plotters nehme, es schließe und dann mein Programm starte, funktioniert der erste Befehl den ich Eingebe anständig, alles weiter nicht.
Wenn ich die Eingabe am MC auf eine Variable mit nur einem Zeichen einlese funktioniert anscheind nur die erste Eingabe, bei allen weiteren Eingaben zeigt er nichts an und sendet auch nichts zurück.
Da stimmt wohl wirklich was nicht mit dem Delphi Algorithmus. Ich glaub der baut einfach hint der Eingabe irgendwie ein Leerzeichen bzw. diesen Absatz ein und schon funktionierts nichtmehr.
Ich denk ich schau mich besser mal nach einem anderen Code für den COM-Port um lol, einen anderen Computer dran zu hängen um zu gucken was wirklich raus kommt hab ich leider nicht mehr geschafft.

Static
21.04.2005, 15:50
argh!! Ich bastel hier 2 Tage lang rum und wundere mich warum das nicht funktioniert und dabei lag es doch an diesem Zeilen umbruch ](*,) :


An den übergebenen String einen Zeilenumbruch (#13 + #10) hängen
}
s := s + #13 + #10;
WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
s := '';

Wenn man die 13 und die 10 weg nimmt gehts gar nicht mehr, mit denen gehts nur einmal und wenn man die 10 weg macht und die 13 da lässt funktionierts O:)
Juhu, jetzt kann ich endlich weiter machen und malwieder meine eigene Frage beantworten lol.

NumberFive
25.04.2005, 18:31
dann hatte ich doch recht genal das hatte ich gemeint.

Gruß