Ändert der RS ​​485-zu-RS 232-Konverter den Halbduplexmodus in den Vollduplexmodus?

Ich verwende eine serielle RS 485-Verbindung, über die ich S19-Dateien für mein Bootloader-Projekt senden muss. Da es sich um einen Halbduplex-Verbindungsmodus handelt, muss ich vor dem Senden und Empfangen einen dedizierten Pin umschalten. Ich verwende diese Terminalanwendung. Ich habe die gewünschte Ausgabe erhalten, als ich eine Zeichenfolge gesendet habe.Geben Sie hier die Bildbeschreibung ein

Aber ich konnte keine Ausgabe erhalten, wenn ich versuche, eine Datei zu laden (s19-Datei, um genau zu sein). Liegt es an der Halbduplex-Verbindung, die ich verwende? Ändert ein RS 485-zu-RS 232-Konverter den Modus von Halbduplex auf Vollduplex?

AKTUALISIEREN

Ich arbeite an dem Mikrocontroller MKE02Z64VLD2 von Freescale. Ich habe gerade herausgefunden, dass es in meinem Controller keinen RTS CTS-Pin gibt. (Siehe Kommentar Link 1)

Dies ist die serielle Verbindung, die ich verwende,Geben Sie hier die Bildbeschreibung ein

Und die Terminal-Anwendung ist keine Bootloader-GUI, ich habe sie auf dieser Seite gefunden. (Siehe Kommentar Link 2) Vielen Dank für Ihre Hilfe. Ich poste die Links im Kommentarbereich, weil ich nicht genug Reputation habe, um mehr als 2 Links zu posten

Hast du CTS angeschlossen? Wenn nicht, sollten Sie das Handshaking auf „none“ oder „xon/xoff“ ändern. Andernfalls sendet der PC nicht, weil er glaubt, dass das andere Ende nicht bereit ist, Daten zu empfangen.
Klingt sowohl nach einem Protokoll als auch nach einem Hardware-Miss-Match-Problem. Damit dies funktioniert, benötigen Sie ein genaues Verständnis Ihrer s19-Daten in Bezug auf Signalprotokolle, dann können Sie vielleicht ein Stück Code für eine geeignete Schnittstelle schreiben. Was genau passiert, wenn Sie einen String senden? Schauen Sie in die feinen Details. Möglicherweise müssen Sie etwas Bit-Bashing durchführen, damit dies funktioniert.
@BruceAbbott. Danke, ich werde versuchen, das Handshaking auf eines der 2 zu ändern und nach der Ausgabe zu suchen.
@ Sparky256 Dies ist mein Code, der die Zeichenfolge für (;;) { GPIO_PDD_TogglePortDataOutputMask (GPIOA_BASE_PTR, GPIO_PDD_PIN_21) sendet; CLS1_SendStr("Hallo Welt!\r\n", CLS1_GetStdio()->stdOut); WAIT1_Waitms(1000); CLS1_SendStr("Willkommen Ganesh!\r\n", CLS1_GetStdio()->stdOut); Damit erhalte ich die gewünschte Ausgabe.
"Ich habe die gewünschte Ausgabe erhalten, als ich eine Zeichenfolge gesendet habe ... Aber ich konnte keine Ausgabe erhalten, wenn ich versuche, eine Datei zu laden (s19-Datei, um genau zu sein)." S19-Dateien sind Zeichenfolgen. Ihr Problem ist also nicht, dass Ihr Bootloader die s19-Datei nicht empfangen kann, sondern wie er die Daten verarbeitet. Wenn Sie keine Flusskontrolle haben (xon/xoff oder RTS/CTS, falls verfügbar), kann der Bootloader möglicherweise nicht mit der eingehenden Datenrate Schritt halten, während er gleichzeitig in Flash schreibt.
Streichen Sie das - in link1 geben Sie zu, dass Sie auch keine Antwort erhalten, wenn Sie einen String senden. Vielleicht empfängt die MCU die Zeichenfolge, oder vielleicht nicht. Aber Sie würden es nicht wissen, weil Sie 'while(1);' bevor Sie die Antwort senden.

Antworten (2)

Nein. Ein Konverter ändert lediglich die elektrische Signalisierung und gibt Ihnen eine explizite (typischerweise Modem-Steuerleitungswiederverwendung) oder automatische (zeitbasierte) Steuerung der Sendefreigabe.

Die Anpassung an ein Halbduplex-Schema muss von der Software an jedem Ende vorgenommen werden.

Warum genau Ihr Setup fehlgeschlagen ist, lässt sich mit den begrenzten Informationen nicht beantworten, aber Software, die nicht für diese Kommunikationsart geschrieben wurde, könnte ein wesentlicher Teil des Problems sein.

An dieser Stelle sollten Sie Ihre Frage um weitere Details erweitern: Welches MCU-Board verwenden Sie, welchen RS485-Transceiver verwenden Sie (Verkabelung), auf der PC-Seite welchen RS232 / 485-Konverter? Wenn Ihr Bootloader (PC und MCU) im Halbduplexmodus arbeitet, der PC Daten sendet und auf ACK von der MCU wartet, die MCU auf Daten wartet und nach dem Empfang eine ACK sendet, besteht niemals eine Kommunikation in beide Richtungen. Nur dann können Sie das Terminal so einstellen, dass es RTS auf TX verwendet - dies impliziert, dass der RS232/485-Konverter RTS von RS232 verwendet, um die Übertragung auf RS485 zu aktivieren/deaktivieren (es ist ein bestimmter Konverter). Dasselbe muss auf der MCU erfolgen, anstatt den Toggle-Befehl use set/reset zu verwenden. Der Erfolg ist jederzeit fraglich, wenn Sie keinen vollen Zugriff haben, um den Bootloader zu patchen, indem Sie zusätzliche Zeitüberschreitungen, HW-Handsake usw. hinzufügen. Ist das Terminalfenster auf Ihrem Bild eine Bootloader-GUI?

Ich habe die Frage erweitert, Sir. Ich habe keine Änderungen im Bootloader-Code in Bezug auf Halbduplex vorgenommen. Ich habe den Code geschrieben, weil ich dachte, dass es sich um eine Vollduplex-Verbindung handelt. Aber später, als ich nur den Code testete, stellte ich fest, dass ich das Hauptproblem hier verpasst hatte (das Halbduplex ist). SO dachte ich daran, einfache Codes zum Senden und Empfangen von Zeichenfolgen zu testen und dann zu versuchen, eine .s19-Datei zu senden. Wenn ich damit erfolgreich bin, kann ich die gleiche Logik in meinen Bootloader-Code einbauen. LINK 1: community.freescale.com/message/643594#comment-643594 LINK 2: sites.google.com/site/terminalbpp
Ich bin mit diesen Geräten nicht vertraut, aber eine möglicherweise einfache Lösung besteht darin, RTS festzulegen, dann die zu sendenden Daten in ein mit DMA-> UART_TX gebundenes Fifo zu übertragen und zu suchen, ob das DMA in der Lage ist, einen Interrupt auszugeben, wenn das Fifo leer wird ( bedeutet, dass alle Zeichen gesendet wurden), an diesem Punkt setzen Sie das RTS zurück
Da liegt das nächste Problem. RTS- und DMA-Modus sind in meiner IDE (Kinetis Design Studio) verfügbar, aber der Controller (MKE02Z64VLD2), für den ich den Bootloader entwerfe, unterstützt CTS, RTS nicht.
Ja, das habe ich. Nennen wir es stattdessen TX_EN (ein GPIO), ändern Sie jetzt in meinem vorherigen Kommentar RTS mit TX_EN. Richten Sie die Übertragung über DMA ein und setzen Sie den Interrupt bei DMA Tx fifo auf leer.
Sie brauchen DMA nicht, um mit einer moderaten Baudrate wie der gezeigten 38400 (oder sogar 115200) Schritt zu halten, und der Versuch, sie zu verwenden, wird die Verwaltung der Verbindungsrichtung wahrscheinlich nur komplizierter machen, insbesondere für jemanden mit der offensichtlichen Unerfahrenheit des Fragestellers.
@ChrisStratton Was OP benötigt, ist ein Interrupt, der, nachdem alle Zeichen gesendet wurden, Trigger auslöst, zu diesem Zeitpunkt muss ein GPIO (TX_EN) -Pin auf Low gehen. Vor dem Senden der Zeichen an UART müsste GPIO hoch eingestellt werden. Das ist es. Jetzt finde ich nicht die richtigen Worte, um es zu erklären.
Ja - obwohl eines der Dinge, auf die Sie achten müssen, der Unterschied zwischen dem Status oder der Unterbrechungsbedingung ist, die anzeigt, dass der Sender ein neues Datenwort akzeptieren kann (was normalerweise interessant ist), und dem, der anzeigt, dass er tatsächlich fertig ist Herausschalten auf den Draht - für dieses Schema ist letzteres erforderlich, um den Sendetreiber zu deaktivieren.