Witam.
Piszę programik, komunikujący się z urządzeniem przez port szeregowy. Używam do tego celu klasy SerialPort.
Nie mam problemów z połączeniem, ani wysyłaniem danych. Problem pojawia się przy odbiorze danych:
System.IO.Ports.SerialPort comport; //zmienna globalna
/*wykonywane przy starcie programu*/
comport = new System.IO.Ports.SerialPort();
comport.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(DataReceived);
/**/
/*Procedura obsługująca zdarzenie otrzymania danych:*/
public void DataReceived(object sender, EventArgs e)
{
//!!!!!!!! <- Problem!
}
Wiem, że to, co zrobiłem, zrobiłem poprawnie - rzeczywiście, przy otrzymaniu danych, procedura DataReceived jest uruchamiana. Problem w tym, że nie mam w niej dostępu do żadnych zmiennych ani obiektów zadeklarowanych poza nią. Próba odwołania się do jakiejkolwiek kontrolki, czy zmiennej globalnej kończy się wysypaniem programu. Właściwie jedyne, co udało mi się w niej umieścić, to messagebox.
Udało mi się doczytać, że spowodowane jest to tym, że procedura ta jest uruchamiana w oddzielnym wątku, który nie ma dostępu do żadnych danych. Tymczasem w takiej formie jest ona dla mnie zupełnie bezużyteczna - chciałbym, aby program po otrzymaniu danych między innymi wykonywał operacje na pliku (otwartym przy innej okazji) i wyświetlał je w kontrolce.
Co więc muszę zrobić, aby z innego wątku "dostać się" do kontrolek i zmiennych?
EDIT:
W dokumentacji znalazłem w przykładzie inny sposób odbioru danych - "ręcznie" stworzony nowy wątek i w nim pooling z próbą odczytu - ale w tym przykładzie dane są i tak wyrzucane na konsolę, a nie do głównego wątku...