Forum: PC-Programmierung C# UART DTR-Pin


von Osti (Gast)


Lesenswert?

Hallo!

Ich arbeite mit dem Mikrocontroller Mini2440 mit WinCE.
Ich programmiere normale Apps für diesen Mikrocontroller mit Visual 
Studio 2008.

Die RS232 Schnittstelle funktioniert super, jedoch nur mit RS232 zu 
RS232. Ich benötige aber RS232 zu RS485. Ich habe bereits einen 
Konverter. Jedoch arbeitet dieser Konverter nur wenn er auch ein Signal 
bekommt, ob der Mikrocontroller jetzt sendet oder empfangen will. 
(DTR-Pin)

Ich habe leider keine Ahnung wie ich dieses Pin in C# enablen kann.
Die mitgelieferte Doku von diesem Mikrocontroller ist leider auf 
chinesisch. Ich habe mir zwar schon englische Versionen runtergeladen, 
aber leider nichts für meine Anforderungen gefunden.


Also falls mir irgendwer helfen könnte wäre ich sehr dankbar ;)

Ich will einfach nur wissen, wie man die zusätzlichen Pins der UART in 
C# enablen kann.. (DTR-Pin hauptsächlich)


Danke schon einmal im vorhinein ;)



Mfg. Osti

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die API der seriellen Schnittstelle wird ja vom Betriebssystem zur 
Verfügung gestellt, und das ist Windows CE. Das ist verhältnismäßig 
brauchbar dokumentiert, die hier zu verwendende Funktion heißt 
EscapeCommFunction 
http://msdn.microsoft.com/en-us/library/ms885213.aspx.

Damit kannst Du den Pegel von DTR verändern.

Du hast Dir damit aber ein Problem eingehandelt -- nämlich Dein Programm 
muss vor jedem gesendeten Telegramm die DTR-Leitung in den richtigen 
Zustand versetzen und sie danach wieder zurücksetzen. Da aber die 
Hardware der seriellen Schnittstelle i.d.R. über einen Sendepuffer 
verfügt, wirst Du Schwierigkeiten haben, den korrekten Zeitpunkt zu 
bestimmen, denn unmittelbar nach dem Übertragen der zu sendenden Daten 
an das Betriebssystem wäre das viel zu früh.

Also wirst Du Dir einen Timer aufziehen müssen, der Deinem Programm nach 
soundsovielen Bytezeiten (halt so lang, wie Dein Telegramm ist) Bescheid 
stößt, daß die Handshakeleitung deaktiviert werden kann.

Beliebig viel Zeit hast Du dafür nicht, weil die angesprochene 
Gegenstelle ja irgendwann mit dem Antworten anfängt, was aber nur 
empfangen werden kann, wenn DTR deaktiviert ist.

Das wird bereits bei so niedrigen Baudraten wie 9600 kritisch, oder aber 
Du musst auf beiden Seiten der Kommunikation mit großzügig 
dimensionierten Totzeiten arbeiten.


Wesentlich günstiger ist hier die Verwendung einer UART-Hardware, die 
diese Sender/Empfänger-Umschaltung in Hardware unterstützt, wie es z.B. 
die beliebten USB-Seriell-Bridges von FTDI tun.

von Osti (Gast)


Lesenswert?

Ich werde es nun anders versuchen..

Ich arbeite nicht mehr mit dem normalen COM-Port, sondern gehe über die 
USB-Schnittstelle mit einem USB zu RS485 converter direkt weg..

Das heißt, dass ich nun ein virtuelles COM-Port habe, jedoch weiß ich 
nicht wie ich dieses herausfinde, bzw. im Programm einstelle, dass er 
über diese virtuelle Schnittstelle alles sendet..

Hättest du vielleicht eine Idee? ;)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nö, keine Ahnung, wie so etwas unter CE funktioniert.

von Osti (Gast)


Lesenswert?

hab jetzt ein eigenes Programm geschrieben, dass die COM-Ports ausließt 
(es ist COM0)

Jedoch, wenn ich versuche etwas zu senden, leuchtet der usb immer wenn 
etwas gesendet wird, aber ich bekomme komischer weise nichts zurück :/

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Osti schrieb:
> Jedoch, wenn ich versuche etwas zu senden, leuchtet der usb immer wenn
> etwas gesendet wird

Wer soll das verstehen?

von Sven H. (dsb_sven)


Lesenswert?

Also in C# gibt es die Klasse SerialPort. Die hat, soweit ich weiß, eine 
Eigenschaft, mit der man die Steuerleitungen an und abschalten kann.

von Ralf (Gast)


Lesenswert?

Wenn ich die SerialPort-Klasse richtig im Kopf habe kann die einen 
Interrupt auslösen, wenn nix mehr im Sendepuffer ist. Wenn die 
CE-Variante das auch kann, dann kannst du mit diesem Interrupt deine 
DTR-Leitung umschalten.

Ralf

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Allerdings ist bei leerem Sendepuffer die UART noch nicht mit dem Senden 
des letzten Bytes fertig, der "Sendepuffer leer"-Interrupt kommt eine 
Zeichenzeit vor dem Ende der Übertragung. Das muss vor allem bei 
niedrigen Baudraten berücksichtigt werden.

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.