Visual C++ CLR(.net2012) Serialport, Empfang
-
Hallo
Ich habe eine Frage, ich habe in einer eigenen Klasse(RS232) eine RS232
Behandlung geschrieben.
Ich kann über ein Form die RS232 einstellen, Öffnen und Schließen.
Nun möchte ich von der Klasse RS232 die empfangenden Daten
weiterleitern.Was ich bisher gemacht haben ist mir ein Event in meiner RS232 Klasse zu
schreiben und nun wollte ich ganz einfach die_serialport->DataReceived +=gcnew SerialDataReceivedEventHandler(DataReceivedHandler);
nutzen um in dem:
void DataReceivedHandler(Object^ sender,SerialDataReceivedEventArgs^ e) { SerialPort^ sp = (SerialPort^)sender; String^ indata = sp->ReadExisting(); Console::Write(indata); }
mir ein Event auszulösen und die Daten im "indata" weiterzureichen um im
Form damit zu arbeiten.Aber leider ist der DatareceivedHandler ein eigenes Thread und ich steh
gerad auf dem Schlauch wie ich die Daten rüberbekomme.Hat einer eine Idee?
Invoke ist wohl ein Stichwort aber der scheint das in dem Punkt nicht zu
kennen.Der Handler wird in meiner RS232_init() bereit gestellt:
int RS232_class::RS232_init() { try { _serialport->DataReceived +=gcnew SerialDataReceivedEventHandler(DataReceivedHandler); _serialport->ReadTimeout=500; _serialport->WriteTimeout=500; _serialport->Open(); } catch(System::IO::IOException^ e) { return 0; } return 1; }
-
Ich versuch es bisher so:
//Eventhandler delegate void RS232_EmpfangEventHandler(String^); ref class RS232_class { private: static SerialPort^ _serialport = gcnew SerialPort; String^ d; public: // delegate int RS232_init(SerialPort^ _serialport); delegate void RS232_close(SerialPort^ _serialport); delegate void RS232_config(SerialPort^ _serialport_in, SerialPort^ _serialport_out); delegate String^ RS232_getport(void); // event RS232_EmpfangEventHandler^ RS232_empfang; //interne void RS232(void); bool RS232_anfrage_open(void); int RS232_init(); void RS232_close(); void RS232_config(SerialPort^ _serialport_in); String^ RS232_getport(void); bool RS232_senden(String^ Sin); };
void DataReceivedHandler(Object^ sender,SerialDataReceivedEventArgs^ e) { SerialPort^ sp = (SerialPort^)sender; String^ indata = sp->ReadExisting(); Console::Write(indata); // RS232_class::RS232_empfang("test"); // gibt fehler, da keine statische Member? } int RS232_class::RS232_init() { String^ s; s="test hallo"; try { _serialport->DataReceived +=gcnew SerialDataReceivedEventHandler(DataReceivedHandler); _serialport->ReadTimeout=500; _serialport->WriteTimeout=500; _serialport->WriteBufferSize=100; _serialport->Open(); // Console::WriteLine(Thread::CurrentThread->GetData); RS232_class::RS232_empfang("test"); } catch(System::IO::IOException^ e) { return 0; } return 1; }
Das es so nicht geht, bedeutet das der Thread vom Empfangen nicht auf meine Klasse zugreifen kann?
Ich muss also irgendein zwischenteil benutzen damit ich die Daten vom Empfang zu meinem neuen Eventhandler rüberschaufeln kann, aber ich hab keine Idee mehr wie...Hat einer vielleicht ein Tip?