Forum: Mikrocontroller und Digitale Elektronik UART am PC


von Sebastian (Gast)


Lesenswert?

Die Frage passt jetzt nicht 100%ig hier rein, aber trotzdem:

Ich versuche mit meinem AVR über UART zu kommunizieren. Der AVR
arbeitet einwandfrei das habe ich mit einem Terminalprogramm getestet.

Wenn ich jetzt jedoch Daten aus meinem Delphi-Programm sende,
funktioniert es nicht. Die Daten können irgendwann nicht übertragen
werden, wenn die Daten etwas größer sind (zum Beispiel ein String)
Ich gebe jedes Zeichen des Strings einzeln ins UART:
WriteFile(Hcom, S[I], 1, test,nil);
text ist irgedwann <> 1, es können also keine Daten mehr übertragen
werden.

Wie kann ich mit der WinAPI erkennen, ob das UART bereit fürs Daten
senden ist?

von Steffen (Gast)


Lesenswert?

Mit WaitCommEvent kannst Du relativ einfach feststellen ob der
Sendepuffer lehr ist. Aber wieso sendest Du jedes Byte einzeln?

WriteFile(HCom,S,Anzahl,test,nil) sendet Dir doch auch den ganzen
Puffer auf einmal.

Steffen

von Henning (Gast)


Lesenswert?

ich verwende die komponente SerialPortNG. Warscheinlich ist das
einfacher als sich selbst um alles kümmern zu müssen.

kann den link raussuchen, aber müsste recht schnell auf der delphi
super page poland zu finden sein

von Steffen (Gast)


Lesenswert?

Dann verstehe ich aber nicht, warum Du mit WriteFile die Daten
rausschickst. Stellt die Komponente da keine Funktionen zur Verfügung?

So wild ist das Senden und Empfangen über die serielle Schnittstelle
nicht. Das machen im Prinzip alles die Windows API Funktionen.

Schau dir mal folgende Funktionen an:

CreateFile, SetupComm, SetCommMask, EscapeCommFunction

Nach Einmaliger Initialisierung kannst Du mit WriteFile Daten schreiben
und mit Readfile Daten lesen.

Steffen

von Sebastian (Gast)


Lesenswert?

Was stelle ich am besten bei den Timeouts ein?
(SetCommTimeouts)

von Steffen (Gast)


Lesenswert?

Ich verwende immer folgende Einstellungen:

CommTimeouts.ReadIntervalTimeout:=4;
CommTimeouts.ReadTotalTimeoutMultiplier:=1;
CommTimeouts.ReadTotalTimeoutConstant:=10;
CommTimeouts.WriteTotalTimeoutMultiplier:=10;
CommTimeouts.WriteTotalTimeoutconstant:=100;
SetCommTimeouts(m2,CommTimeouts);

Wenn die Schnittstelle mit FILE_FLAG_WRITE_THROUGH geöffnet wird, dann
sind die Werte wenn ich mich recht erinnere fast egal.

Steffen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.