Hallo,
ich habe ein Projekt in der Schule laufen bei dem ich eine CNC-Maschine
über einen Microcontroller steuere, was sehr gut funktioniert. Der
Microcontroller wird allerdings wiederum vum Delphi geteuert, denn in
Delphi rechne ich alle wichtigen Înformationen aus und sende sie dann
weiter an Microcontroller. Das Senden erfolg auch ohne weidere
Probleme(SENDBYTE), (ich verwenden in delphi die Port.dll). So und jetzt
kommt das Problem :
Damit keine größere Warte Zeiten entstehen, habe ich einfach in einer
whileSchleife den READBYTE eingesetzt mit einem delay von 500ms, nach
kurzen zeiten bekommt er noch was zurück, doch ab einen gewissenen
Distanz schiesst Delphi den opencom ab oder macht sonst was, so dass eng
den FERTIG von Micorcontrolelr nicht mehr kann empfangen.
Es liegt nicht am microcontroller, der empfangt und sendet wie er soll!
Hab auch schon Probiert mit anderen Methoden, doch bis jetzt ohne
erfolg!
z.b. nicht mit while sondern in einem Timer .... repeat until ...
Ich bitte um Hilfe, DANK
p.s. : bei unverstaendnissen meiner Aussage, einfach nachfragen :)
hallo,
Zeig doch erstmal deinen Delphi-Code, und am Besten gleich noch den
(relevanten Teil vom) Mikrocontroller-Code.
Nach deiner Beschreibung gehe ich aber mal davon aus dass du ohne
Plausibilitätskontrolle arbeitest?
Bei einer CNC-Steuerung würde ich unbedingt bei jedem Befehl per RS232
eine Checksumme mitschicken, damit der Empfänger einen allfälligen
Fehler mitbekommt und das Datenpaket nochmals vom Sender anfordern kann.
Es wäre möglich dass bei deinen Tests irgendwann mal ein Byte verloren
geht oder sich ein Geisterbyte einschleicht, dann wird deine Auswertung
wohl schon überfordert sein. (Reine Vermutung da ich den Code ja nicht
anschauen konnte!)
Die Zeit, welche für die Plausibilitätskontrolle draufgeht, wirst du ja
wahrscheinlich eh haben, da vermutlich die Maschine das langsamste Glied
im Informationsfluss darstellt...
>doch ab einen gewissenen Distanz schiesst Delphi den opencom ab
Wie ist das zu verstehen? Meinst du mit "Distanz" die Kabellänge oder
eine längere Wartepause? Was meinst du mit "schiesst Delphi den opencom
ab"?
Ist die Schnittstelle noch geöffnet, wenn der Fehler auftritt oder
nicht? Bei geschlossener Schnittstelle liegt der Fehler bei deinem
Delphi-Programm. Delphi schiesst sicher nicht von selbst die
Schnittstelle ab, das passiert nur dann, wenn dein Sourcecode das
irgendwo anordnet. Es ist deine Aufgabe als Programmierer, die korrekte
Handhabung der Schnittstelle sicherzustellen. Bau doch eine zusätzliche
Sicherheitsabfrage in deine Sende- bzw- Empfangsroutinen ein. Teste VOR
jedem Zugriff auf die Schnittstelle, ob diese geschlossen oder geöffnet
ist und gib eine entsprechende Fehlermeldung aus, wenn es Probleme gibt.
Weitere mögliche Fehlerquelle:
Ist die Schnittstelle im PC, die du verwendest, eine echte serielle
Schnittstelle mit UART oder bloss ein USB-RS232-Adapter? Bei einem
USB-Adapter kann es sein, dass der in "Suspend Mode" geht, wenn er
längere Zeit nichts zu tun hat. Der Suspend-Mode wird wiederum von
Windows selber ausgelöst, in diesem Fall musst du die entsprechenden
Einstellungen in deinem Betriebssystem ändern. Siehe dazu den
angehängten Text.
Rufus Τ. Firefly schrieb:> Wozu braucht man eine "port.dll", wenn eine serielle Schnittstelle> verwendet wird?
das habe ich mich auch gefragt, aber es steht ja nirgends da das er die
Serielle schnittstelle verwendet. Keine ahnung auf was SENDBYTE geht.
Peter schrieb:> aber es steht ja nirgends da das er die> Serielle schnittstelle verwendet
Wie interpretierst Du dann das hier?
> doch ab einen gewissenen Distanz schiesst Delphi den opencom
Hallo,
Ja ich benutzte eine richtige Serielle Schnittstelle und keine USB to
Seriel Adabter!
Also es ist so dass ich Kordinaten zu dem Microcontroller sende ... und
dann läuft mein delphi in eine whiile schleife um immerwiederabzufragen
ob der Microcontroller fertig ist mir dennen Kordinaten, um sofirt die
naecksten zu senden !
==========
//senden
=========
======================
// empfangen
Temp := readbyte;
while chr(Temp) <> '*' do
begin
delay(500); //damit eer nicht dauernt duerchläuft eine kleine
paus
Temp := readbyte;
end;
=========================
so wenn ich jetzt kleiner Schritte fahre, dass heisst er ist nicht so
lange in der Schleife (dempfangen) funktioniert es ... fals länger
Kordinaten gesenden wurden, bekommt er keinen * obwohl microcontoller
einen senden ... ich GLAUBE dass in eine gewissenen Zeit den com
geschlossen wird ... dass ich das einzige was passen würde, doch
allerdings ist dat schwer forstellbar , das ist wohl war ...
lies dir doch erstmal genau durch wie
readbyte
arbeitet, meine vermutung ist das er wartet bis ein zeichen da ist, du
musst nicht selber danach warten. So ist es zumindest in den meisten
programmiersprachen wenn man nicht auf den "nichtblockierendnen" modus
umschaltet.
david schrieb:> Wie möchte man sont mit delphi etwas an den com schnittstelle senden> ????
windows bietet dafür eine API an, die Port.dll braucht man nur wenn man
direkt auf die IO-Adresse zugreifen will. Das ist hier aber überhaupt
nicht notwendig
Hab noch nie mit API gearbeitet .. desswegen keine ahnung :S
OPENCOM
Parameter: Zeichenkette als nullterminiereter String
Öffnen der seriellen Schnittstelle
Rückgabe: Bei Fehler 0.
SENDBYTE
Parameter: Ein Byte (0..255)
Senden eines Bytes über die serielle Schnittstelle. Diese muß zuvor mit
OpenCom geöffnet worden sein.
READBYTE
Parameter: keine
Lesen eines Bytes von der seriellen Schnittstelle. Diese muß zuvor mit
OpenCom geöffnet worden sein.
Rückgabewert: -1 bei Fehler, sonst das empfangene Byte
david schrieb:> READBYTE> Parameter: keine> Lesen eines Bytes von der seriellen Schnittstelle. Diese muß zuvor mit> OpenCom geöffnet worden sein.> Rückgabewert: -1 bei Fehler, sonst das empfangene Byte
da muss es doch noch mehr doku geben, wie werden timeouts behandelt?
Kann es sein das du RSCOM-DLL verwendest und nicht port.dll?
mach doch einfach mal ein test
while TRUE do
begin
Temp := readbyte;
end
sende aber nicht an die Schnittstelle. Dann sollte das programm
eigentlich keine CPU zeit brauchen -> readbyte warten auf daten. Wenn
dein Programm docht CPU-zeit braucht dann blockiert der aufruf von
readbyte nicht -> doku genau lesen wie es dann richtig geht.
true ist ein boolscher Ausdruck, wie '1' in C.
API Call:
function CreatePortHandle(PortID: string; PortNumber: cardinal):
THandle;
begin { CreatePortHandle }
PortID := '\\.\' + UpperCase(PortID) + IntToStr(PortNumber);
Result := CreateFile(PChar(PortID), // name
GENERIC_READ or GENERIC_WRITE, // access
attributes
0, // no sharing
nil, // no security
OPEN_EXISTING, // creation action
FILE_ATTRIBUTE_NORMAL, // attributes
0); // no template
end; { CreatePortHandle }
wenn ich diese Funktion einbinde... und wie oben angegeben whiel TRUE do
abfrage ich das automatisch ne abfrag für den COM ? das true muss doch
mit irgendetwas in verbindung seten Z.B: while Test = true do ....
und
wie kann ich mit dieser funktion etwas senden und empfangen ?
david schrieb:> das true muss doch> mit irgendetwas in verbindung seten Z.B: while Test = true do
ich glaube du solltet dich erstmal noch ein wenig mit den grundlagen von
Delphi beschäftigen.
wenn das geht:
var x: Boolean;
x := true;
if x then
println("test");
warum sollte dann
if true then
println("test");
nicht auch gehen. Es wird bei if geprüft ob der wert wahr ist. Und true
ist nun mal wahr.
Man könnte auch schreiben
if true=true then
println("test");
oder
if false=false then
println("test");
oder
if true<>false then
println("test");
http://www.delphipraxis.net/57121-ueber-den-umgang-mit-boolean.html
(sind bestimmt noch fehler drin, mein delphi zeit ist leider schon viele
jahre her, da heiß es noch pascal)
ja ok ... also mit den grundlagen von delphi kennen ich mich schon ein
wenig aus ... hab nur nicht den sinn in dieser schleife gesehn , well du
bleibs ja immer in dieser schleife ...
aber ja ich sage dir trotzdem vielen vielen dank für deine(eure) Hilfe,
sehr net.
mfg
david
david schrieb:> hab nur nicht den sinn in dieser schleife gesehn , well du> bleibs ja immer in dieser schleife ...
genau das war der sinn, ich wollte damit nur ermittln ob die Readbyte
auf daten wartet oder ob es immer sofort zurückkehrt. Normalerweise
wartet es auf das nächste byte also brauchst du nicht selber ein sleep
danach zu machen. Ein sleep in einem Programm ist oft nur der versucht
einen Fehler zu beheben der eigentlich in dem Programm ablauf selber
liegt.