Vorab eine kleine Erklärung: Habe 3 Geräte, die über RS232 mit einem anderen Partner kommunizieren können sollen. Gerät 1: WindowsXP mit emulierten COM-Port. Darauf greift ein C++ Programm. Gerät 2: Ein Psion Revo mit einem Terminal Emulator Programm Gerät 3: Ein Atmega128 mit Programmierter UART Schnitstelle Rein theoretisch sollten alle Geräte miteinadner kommunizieren können. Können sie aber nicht. Der Psion kann vom µC Zeichen empfangen und senden. Der Psion kann vom PC Zeichen empfangen und senden. Der Pc kann aber nicht mit dem µC kommunizieren. Weder senden noch empfangen. Weder mit Hyperterminal noch Docklight. Komisch an der Sache ist auch, dass der Psion anscheinend Sonderzeichen falsch interpretiert. z.B. wird aus einer # ein Pfund Zeichen. Komisch komisch. woran das wohl liegen kann. Als Besonderheit bei der Verbindung von µC zu PC ist zu sagen, dass ich mit einem Kabel weiblich-weiblich zum umstecken arbeiten muss. Woran kann das denn liegen?
Wahrscheinlich schickt der uC die Zeichen zu schnell. Selbst ein Z80 mit 4 MHz kann einem GHz-Pc die Zeichen seriell um die Ohren hauen, daß der nichts mehr versteht. Erst recht die Emulation über einen USB-Port kann die Zeichen nicht schnell genug verarbeiten. Abhilfe: Handshake per Hard oder Software, oder Wartezeiten zwischen den Zeichen einbauen. Ich nehme mal an, daß Baudrate Stoppbits, Parity etc richtig eingestellt sind. Hyperterminal hat noch die Unart, Einstellungen erst nach einem Neustart zu übernehmen, obwohl alles richtig angezeigt wird.
ASCII, wie du schon sachst... guck mal, mit welchen Kodierungen deiner Partner reden. Windows und COM ist schon nit-so-dolle (Erfahrungswert), dann noch Cplusplus, da kräuseln sich mir die Zehennägel. Das sind Vorurteile, weiß ich ja, aber auf dem Weg von C++ über Windows und Portemulator bis zur Hardware kann ganz schön viel passieren. Was die Geschwindigkeit angeht: Wenn du x Kilobaud einstellst, müsste wenigstens das erste Zeichen ankommen. X kb sind x kb, da könnte nur noch ein Überlauf ganzer Zeichen auftreten, aber die einzelnen Zeichen müssten trotzdem korrekt ankommen (eben wenn überhaupt). Evtl. Benutzt du auch Parität oder krumme Wortlängen bei der Übertragung (7 bit, 9 bit oder sowas). Dabei könnte dann z.B. das Umschaltbit (8. Bit) flöten gehen, was dann u.U. auf den erweiterten ASCII-Zeichenvorrat umschaltet.
Das mit emuliertem Com Port auf Windows und C++ ist mir auch nicht so ganz geheuer. Aber außer C++ weiß ich jetzt auch nicht wie ich meinen Empfänger auf dem PC gestalten soll. Evlt .Net, aber da kenn ich mich ja noch weniger aus. Grundsätzlich muss ich noch hinzufügen, dass ich mit 8N1 und 9600 Baud arbeite. Das ich mal die Baud runter stelle, darauf bin ich noch garnicht gekommen :) Das wär wohl die schönste Lösung für mich. Ich probier das mal aus wenn ich mal wieder Zeit dafür hab. Das mit dem Handshake kapier ich gar nicht so recht. Wenn ich mit meinem µC einfach ein paar Zeichen raus Schick, indem ich ganz simpel die Daten in die UDR lade, kann ich dann ein Handshake auf der Gegenseite benutzen, oder muss ich dazu noch was machen an meinem µC-Programm?
Handschütteln meint ja vereinfacht gesagt, dass auf zusätzlichen Signalleitungen signalisiert wird: * Hallo, ich höre * Pass auf, jetzt fang ich an zu quatschen * Habsch verstanden Ist wie beim Telefon, wenn du nicht vorher wählst (könnte z.B. DTR beim seriellen Verkehr sein: Data Terminal Ready), kommt an der Gegenstelle auch nix an. Probier mal Mikrocontroller -> Mikrocontroller. Ach, noch was: du hast doch nen Pegelwandler (MAX232 oder sowas) verbaut?!
Auf dem Board war schon ein MAX3221 verbaut. Hab jetzt ein bißchen gespielt. Alles in allem sehr sehr komisch. Ich habe mal alle Baudraten durchprobiert. Eine Kommunikation von µC und meinem C++ Programm fand erst ab einer Baudrate von 9600 und aufwärts statt. Allerdings hatte ich ein paar Probleme mit C++ und den Threads, deshalb bin ich auf C# (sehr schön) umgesattelt und da läuft die Kommunikation Psio-PC sehr gut. Nur mit dem µC garnicht, was ich garnicht verstehen kann Mit dem µC schicke ich zyklisch einfach mal den String "hallo"+CR+LF, wobei CR = 0x0a und LF=0x0d (also die Delimiter) sind. Bei meinem Psion wieder mal perfekt, bei meinem C# Programm rein garnichts. Ich lese die Daten mittels der DataReceived Action von SerialPort aus, aber da springt mein Programm anscheined garnicht mal rein. Irgendwas läuft da mächtig schief. Blos was?
Oh mein Gott. Ich habs jetzt rausgefunden was ich falsch gemacht hab. Das Probelm war eingentlich eine Kombi aus 2 Problemen. 1. Hab ich teilweise bein meiner UART0 Initialiserung in die UART1 Parameter geschrieben, was dazu führte, dass evtl die Schnitstelle auf 9N1 stand. Das hat aber meinen Psion nicht gestört. Super. Damit hab ich das schon mal lange nicht in Betracht gezogen. 2. ist der USB-to-COM Wahnsinn ein großer Klumpen Müll. Mit einem anderen geht jetzt alles. Ich weiß zwar nicht warum dieser plötzlich nicht mehr geht, bzw. nur mit dem Psion, aber der neue ist irgendwie besser. So, nun ists raus. Danke für alle beim miträtseln :)
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.