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?


Anmelden zum Antworten