2017-11-15 17 views
-2

Ich habe ein Problem beim Verbinden eines seriellen Geräts mit einem eingebetteten Gerät, für das ich Code schreibe.C UART funktioniert nicht die ganze Zeit

Das Gerät, das ich schreibe, hat zwei serielle Anschlüsse, einen eingehenden von meinem Laptop und einen ausgehenden zu einem externen Gerät.

Wenn ich beide Terminals an meinen Laptop anschließe und die Daten sehe, bekomme ich genau die Daten, die ich erwarte.

Wenn ich meinen Laptop direkt an das externe Gerät anschließe, bekomme ich genau das, was ich erwarte, und eine Antwort.

Wenn ich den Laptop und das externe Gerät an das eingebettete Gerät, an dem ich arbeite, anschließe, sendet der Laptop Daten an ihn, er empfängt es, es gibt es an das externe Gerät weiter. Dies funktioniert wie erwartet.

Das externe Gerät sendet jedoch keine Antwort zurück.

Wenn ich Daten vom eingebetteten Gerät an das externe Gerät sende, kann jede neue Nachricht die ursprüngliche Antwort senden.

Ich weiß, dass die erste Nachricht richtig durchgereicht wurde, weil das externe Gerät zu leben beginnt, und ich weiß, wann es die Antwort sendet und Logic Analyzer auf dem tx/rx comms und den Verkehr anzeigen.

Ich dachte, dass das eingebettete Gerät die RX-Leitung hält und seine Übertragung verhindert, aber ich sehe nicht, wie das im Code möglich ist. Auch wenn das der Fall ist, sollte es nicht funktionieren, wenn ich beide Leitungen an meinen Laptop anschließe.

Ich dachte auch, dass die DTR nicht hoch eingestellt war, aber dies überprüft und es scheint hoch eingestellt zu sein.

Kennt jemand einen Grund, der verhindern würde, dass ein Gerät antwortet?

Hinweis: Wenn ich Serielle Anschlüsse sage, beziehe ich mich auf den UART, wenn ich auf das eingebettete Gerät verweise. Alle Geräte verwenden einen DB9-Anschluss, auf dem RS232 ausgeführt wird.

Bearbeiten: Betriebssystem auf dem Laptop ist Windows 10. Embedded-Gerät ist ein Atmega324p.

Edit 2: Hat noch mehr getestet. Es scheint, dass es manchmal funktioniert und manchmal nicht.

Ich habe ein Bild hinzugefügt, die ein fast perfektes Signal der Antwort zeigen. Logic Analyser 1

Der blaue Bereich ist eine Lücke im Signal, die nicht da sein sollte.

+0

Die Sprache C verfügt über keine Bibliothek für die serielle Schnittstelle. Sie sollten zunächst angeben, welches Betriebssystem Sie verwenden. Zum Beispiel verwenden POSIX-kompatible Betriebssysteme den '' Header. –

+0

OS? Was ist ein Betriebssystem? Er sagte Embedded-Gerät. Hört sich an, als müsstest du das Oszilloskop für diesen ausbrechen.Erstens, finde heraus, ob du tatsächlich an das externe Gerät sendest - nicht nur, dass dein Code sagt, dass etwas gesendet wurde, sondern dass das Signal tatsächlich passiert. Es ist auch praktisch, wenn Sie einen dritten Ausgabekanal vom eingebetteten Gerät zum Debuggen verwenden. Vielleicht ein dritter UART, oder vielleicht schreibe Debug-Informationen in Flash, die nach dem Lauf gelesen werden können. –

+0

@ Julien-L Aktualisierte meine Frage, um etwas spezifischeres bezüglich UART anstelle des seriellen Hafens zu reflektieren. – Daniel

Antwort

0

Endete, eine Lösung zu finden.

Die RTS-Leitung wurde über das eingebettete Gerät bei 1,2 V gehalten, während der PC es bei 5,2 V hielt.

Das Ziehen der RTS-Linie bis 5v behob das Problem.

+0

Es klingt riskant - Sie sollten herausfinden, warum es bei 1.2v war. Was ist der Logikpegel des dafür verwendeten I/O-Pins? War es tatsächlich als Push/Pull-Ausgang konfiguriert? –

Verwandte Themen