String von Serieller Schnittstelle an TextBox anzeigen

  • Hallo,

    ich beschäftige mich nun seit einiger Zeit mit C++ 2008 und Versuche gerade einen String, den ich über eine Serielle Schnittstelle einlese, in einer TextBox anzuzeigen.
    Wenn ich das Programm ohne Debug starte, läuft es und der String wird auch angezeigt. Doch wenn ich es mit Debug strate, kommt immer folgende Fehlermeldung, sobald das Event der Seriellene Schnittstelle auf die TextBox der Form1 schreibend zugreifen will.

    „Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.

    Zusätzliche Informationen: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement textBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.“

    Ich habe nun schon in einegen Foren nachgelesen und auch in Büchern nachgeschlagen, doch eine gute Erklärung bzw. Problemlösung habe ich noch nirgends gefunden.

    Könnte mir da vielleicht jemand weiterhelfen?
    Hier ist noch mein Quellcode der Form1 Anwendung.

    Mit freundlichen Grüßen

    Julian


    [CODE]
    #pragma once

    namespace Hauptprojektdatei
    { using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
    Form1(void)
    { InitializeComponent();
    serialPort1->Open();
    serialPort1->Write("bf");
    serialPort1->Write("#\r");
    }

    protected:
    ~Form1()
    { if (components)
    {
    delete components;
    }
    }
    private: System::Windows::Forms::TextBox^ textBox1;
    protected:
    private: System::IO::Ports::SerialPort^ serialPort1;
    private: System::ComponentModel::IContainer^ components;
    private:
    #pragma region Windows Form Designer generated code

    void InitializeComponent(void)
    {
    this->components = (gcnew System::ComponentModel::Container());
    this->textBox1 = (gcnew System::Windows::Forms::TextBox());
    this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));
    this->SuspendLayout();
    // textBox1
    this->textBox1->Location = System::Drawing::Point(12, 100);
    this->textBox1->Name = L"textBox1";
    this->textBox1->Size = System::Drawing::Size(261, 22);
    this->textBox1->TabIndex = 0;
    // serialPort1
    this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::received_date);
    // Form1
    this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
    this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    this->ClientSize = System::Drawing::Size(292, 150);
    this->Controls->Add(this->textBox1);
    this->Name = L"Form1";
    this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
    this->Text = L"Form1";
    this->ResumeLayout(false);
    this->PerformLayout();
    }
    #pragma endregion
    private: System::Void received_date(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
    { String^ daten;

    daten=serialPort1->ReadTo("#\r");
    textBox1->Text=daten;
    }
    };
    }
    [\Code]

  • Schau mal nach "Mutex", vielleicht macht der das nur, wenns entsprechend geschützt ist.
    Aber warum lernst du eigentlich VisualC++ und nicht Standard-C++? Mit ISO-C++ bist du von etwaigen Launen Microsofts unabhängig und es ist garantiert, dass deine Programme auch mit anderen Compilern oder Systemen laufen.

    Noch ein Hinweis:
    Verwende die "using namespace"-Direktive nicht innerhalb eines Namespaces sondern außerhalb, sonst machst du ja noch deinen eigenen Namespace kaputt.

    Viele liebe Grüße
    The User