Rs232 Probleme mit Einlesen der Daten



  • Hallo Leute,

    ich sende von ein µC Daten über die RS232 mit 115200 BAUD. Momentan ist es nur 1 Wert, der zwischen 0 und 255 liegt.
    Diesen lassen ich mir mit der Applikation nur in einem Edit-Fenster anzeigen.

    Folgendes Problem:
    Das Senden ist abhängig von einer Drehzahl, die zwischen 0 und 10000 RPM liegen kann.
    Der µC schafft das ohne Probleme, aber meine Applikation mit den Builder nicht obwohl ich da noch nichts berechne. Einlesen, anzeigen, fertig.

    Wenn ich das Interface dauernd offen lasse, bekomme ich immer eine ganze Zahlenkolonne übertragen, obwohl der µC nur 1 Wert pro Umdrehung liefert.

    Ich muss es also hinbekommen, die RS232 zu öffnen, lesen und sofort wieder schließen.
    Das kann aber dazu führen, dass ich entweder kein Zeichen bekomme, nicht alle 3 Digits komplett übertragen werden oder ich wieder mehr als 3 Zeichen bekomme.

    Wie geht man da am Besten vor? Ich bin momentan etwas verwirrt 😕

    Oder muss ich etwa meinem Messwert ein führendes und endendes Zeichen mitgeben und das dann z.B. mit CommaText o.ä. auseinanderpuzzeln?

    Oder denke ich gar wieder viel zu kompliziert?

    Über die FAQ's und die SuFu bin ich leider überhaupt nicht weitergekommen.

    Gruß

    Uwe



  • Du kannst die Werte auch binär übertragen.

    Aber sobald es mehr als ein Wert ist, musst du den µC und deinen PC irgendwie syncronisieren. Dazu musst du dir eine Start- und/oder Endekennung ausdenken.
    Z.B. CR, LF, Komma, Semikolon, Leerzeichen oder auch Buchstaben.

    Wenn du sie als ASCII übertragst, hast due mehr als ein Zeichen.

    Warum musst du die Serielle Schnittstelle jedesmal öffnen und schließen?
    Öffne sie am Anfang, lies alle deine Daten ein und dann schließe sie wieder am Ende.



  • Hallo,

    hier ist mal mein Code.
    Der µC sendet mit ca. 100 Hz, aber ich bekomme keine Daten angezeigt.
    Keine Ahnung, warum.

    Wenn ich einen separaten Buttom für ÖFFNEN, LESEN und SCHLIEßEN mache, geht es, allerdings bekomme ich dann eine ganze Datenkolonne, weil das Interface zu lange auf ist und alles in den Buffer fließt.

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Interface_5.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "VaClasses"
    #pragma link "VaComm"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    String Daten;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::READClick(TObject *Sender)
    {
    
                 VaComm1->Open();
                 Daten = VaComm1->ReadText();
    
                 VaComm1->Close();
                 Edit1->Text = Daten;
    
    }
    //---------------------------------------------------------------------------
    

    Die Zeit zwischen öffnen und lesen scheint hier zu kurz zu sein.

    Was kann ich tun, damit ich 1 Übertragung sicher mitbekomme?

    Ich weiß einfach nicht weiter 😡

    Gruß

    Uwe



  • Sende ein CR-LF mit ("\r\n").
    Und dann liest du eine Zeile ein.
    Wie die Funktion heißt, kann ich dir nicht sagen.

    Unter C ist es fgets()



  • aerodactyl schrieb:

    Wenn ich das Interface dauernd offen lasse, bekomme ich immer eine ganze Zahlenkolonne übertragen, obwohl der µC nur 1 Wert pro Umdrehung liefert.

    Ich muss es also hinbekommen, die RS232 zu öffnen, lesen und sofort wieder schließen.

    .. keine gute Idee. Lies dies über Flusssteuerung oder klammere die Zahlen vom μC in <STX>/<ETX> (0x02/0x03) Starttext/Endetext.



  • So, ich habe es gelöst 🙂

    Ich sende von der Applikation ein Zeichen an den µC. Wer der das empfangen hat, aktiviere ich dort das Schreiben und sperre es anschließend wieder.

    Funktioniert prima.

    Ich muss aber noch einen Fehler im Builder abfangen, wenn der µC senden soll, aber nichts senden kann (weil keine Daten vorliegen).

    Was wird dann für ein Zeichen/Wert über die RS232 auf der Builder-Seite eingelesen?

    Gruß

    Uwe



  • Evtl. gar keins. Dann sollte der Timout zuschlagen.
    Du kannst aber auch ein Zeichen auf deinem µC wählen, was "Ungüliges Datum" bedeutet. So wie der NULL-Zeiger in C.



  • Hallo,

    wenn der Timeout zuschlägt, was wird dann gemacht? Setzt die RS232 irgendein Bit, dass man abfragen kann?

    Ich verwende die TMS Async32 und der Timeout für Read und Write ist jeweils auf 1 Sekunde eingestellt. Wenn nach 1 s nichts kommt, passiert also was, aber wie mitbekommen??

    Ahh, gerade gelesen: Das OnError Bit wird gesetzt. Damit sollte ich was anfangen können......

    Dann gibt es da noch ein coNullStrip Bit, das anscheinend ein empfangenens NICHTS automatisch verwirft. Kann mir jemand sagen, wie das genau funktioniert? Die Hilfe ist da gerade nicht so ergiebig 😕

    Gruß

    Uwe


Anmelden zum Antworten