Com-Port-Buffer anzeigen und speichern



  • Hi Leutz!

    Nun knabbere ich schon seit zwei Wochen daran herum, Zeichen über eine serielle Schnittstelle zu lesen, diese mit CEditView anzuzeigen und zu speichern. 😞

    Gefunden habe ich eine auch eine eine Klasse CSerial und den entspechenden Code um die Klasse anzusprechen. Aber irgendwie reichen meine Kenntnisse nicht aus, um diesen Code weiter zu benutzen.

    C++-Code:

    void CRS232Doc::OnRs232Lesen()
    {
    // TODO: Code für Befehlsbehandlungsroutine hier einfügen
    CSerial serial;
    if (serial.Open(1, 9600))
    {
    char *lpBuffer = new char[500];
    int nBytesRead = serial.ReadData(lpBuffer, 500);
    delete []lpBuffer;
    }
    else
    AfxMessageBox("Failed to open port!");

    Wie kann ich in einer SDI mit CEditView diese Daten in eine Datei bringen (anzeigen und speichern) 😕 😕 😕

    Wer kann mir helfen???

    THX Markus

    P.S.: gibt auch ein gaaaaanz großes Lob 👍



  • Ich bin mir nicht ganz sicher mit meiner Antwort, bin ja selber noch neu und mit SDI habe ich bisher auch nur wenig gemacht. Daher ist mein Text hier mit Vorsicht zu geniessen, hehe

    int nBytesRead = serial.ReadData(lpBuffer, 500);
    

    Also ich verstehe hier nicht ganz, wo das Problem liegt, du hast ja die Daten im lpBugger (=lokale Variable) und wie viele Bytes im Buffer sind, kennst du auch.

    Mein Vorschlag ist nun, dass du die Daten in eine MemberVariable von Doc schreibt. Vielleicht so:

    for(int i=0; i<nBytesRead; i++){
     m_Data->Add(lpBuffer[i]);
    }
    // m_Data ist eine MemberVariable und vom Typ CByteArray
    

    so hättest du zumindest alle eingelesenden Daten in einem Bytearray abgelegt und kannst diese dann weiterverarbeiten -> z.B. dann eine View aufrufen und die Daten anzeigen lassen.



  • Hi, Sky... 😉

    Vom Gedanken her nicht schlecht. Da hätte ich selber drauf kommen können. Aber es gibt da zwei Fehlermeldungen. Mit Fehlermeldungen kann ich als Newbie nur selten was anfangen.

    Kannst du dir das mal ansehen und einen Tip geben?

    F:\My Projects\RS232\RS232Doc.cpp(118) : error C2819: Der Typ 'CByteArray' hat keinen ueberladenen Elementoperator '->'
    c:\programme\microsoft visual studio\vc98\mfc\include\afxcoll.h(65) : Siehe Deklaration von 'CByteArray'
    F:\My Projects\RS232\RS232Doc.cpp(118) : error C2227: Der linke Teil von '->Add' muss auf Klasse/Struktur/Union zeigen
    Fehler beim Ausführen von cl.exe.

    RS232.exe - 2 Fehler, 0 Warnung(en)

    THX



  • Ich nochmal!

    Hab nun in der Deklaration der Variablen m_Data die [] gesetzt. Dadurch habe ich 0 Fhler und 1 Warnungen erhalten. Nun werde ich versuchen eine Ausgabe hinzubekommen!
    🙄



  • mstank schrieb:

    Kannst du dir das mal ansehen und einen Tip geben?

    F:\My Projects\RS232\RS232Doc.cpp(118) : error C2819: Der Typ 'CByteArray' hat keinen ueberladenen Elementoperator '->'
    c:\programme\microsoft visual studio\vc98\mfc\include\afxcoll.h(65) : Siehe Deklaration von 'CByteArray'
    F:\My Projects\RS232\RS232Doc.cpp(118) : error C2227: Der linke Teil von '->Add' muss auf Klasse/Struktur/Union zeigen
    Fehler beim Ausführen von cl.exe.

    RS232.exe - 2 Fehler, 0 Warnung(en)
    THX

    Also der Unterschied von '.' und '->' ist ja Grundlegend 🙂

    Wenn du eine einfache Instanz hast, dann ist der Zugriffsoperator ein '.'

    //Bsp:
     CString str;
     str.GetLength()
    

    Der Speicher wird für die lokale Variable wieder automatisch freigegeben, wenn du aus der lokalen Funktion fällst..

    erstellst du hingegen ein Objekt mit dem 'new Operator', so ist der Zugriffsoperator ein '->'

    //Bsp
     CByteArray* myData = new CByteArray;
     myData->Add(0);
    

    beachte bei letzterem Bsp, dass du mit dem 'new' explizit Speicher für das Objekt anforderst und dass du den Speicher wieder freigeben musst, wenn du das Objekt nicht mehr benötigst. Java ist hier ein bissl besser, weil dort das automatisch mit dem Garbage Collector gemacht wird... however.

    // brauche das Objekt nicht mehr, also:
     delete myData;
    

    Das ist aber Grundlegendes C++ und nicht MFC - Findest du in jedem C++ Buch (sind Grundlagen).

    PS: Ob daten in deinem Array sind kannst du ja schnell überprüfen:

    CByteArray* myData = new CByteArray;
    myData->Add(0x01);
    myData->Add(0x02);
    
    int len = myData->GetSize(); // gibt Anzahl Elemente an (also 2)
    for(int i=0; i<len; i++){
     CString str;
     str.Format("Data: %d", myData->GetAt(i));
     AfxMessageBox(str);
    }
    

    Wenn du somit sicher bist, dass du überhaupt Daten über RS232 eingelesen und abgelegt hast, dann kannst du weiterfahren und beginnen, die Weiterverarbeitung in andere Funktionen/Klassen auszulagern...
    Good Luck!



  • Ist das richtig, daß nur Data: 1 und Data: 2 ausgegeben wird? Ich interprtiere den Code so, daß auch der Inhalt der Elemente ausgegeben wird!

    Wie kann ich den Inhalt von m_Data[] der Klasse CEditView zur Anzeige übergeben?

    THX Markus



  • Sky!

    Ich muß nun leider arbeiten. Bist du morgen auch wieder da?

    Markus



  • Hallo!

    Also anscheinend werden keine Daten über den Com-Port empfangen. Das Daten aber anliegen ist sichergestellt. Woran kann das nun wieder liegen? 😕

    Gruß Markus



  • Hallo!

    Ich glaube, ich habe das gleiche Problem wie Du. Ich muss Daten, die am Comport anliegen auslesen und anzeigen lassen. Ich habe aber leider Null-Ahnung. Klappt Dein Projekt schon? Kannst Du mir vielleicht einmal das Projekt zeigen, in dem das funktioniert?
    Vielen Dank
    Frank
    email: fanders@lycos.de


Anmelden zum Antworten