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
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.
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? ;)
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 :/
Osti schrieb: > Jedoch, wenn ich versuche etwas zu senden, leuchtet der usb immer wenn > etwas gesendet wird Wer soll das verstehen?
Also in C# gibt es die Klasse SerialPort. Die hat, soweit ich weiß, eine Eigenschaft, mit der man die Steuerleitungen an und abschalten kann.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.