Estoy haciendo un pequeño proyecto casero para aprender a manejar C# y WPF. Para ello tengo una aplicacion con varias ventanas. Para simplificar la pregunta pongamos 2 ventanas: Mainwindow y PuertoSerie
La ventana Mainwindow es la que se ejecuta nada mas iniciar la aplicacion y tiene varios controles. como botones, checkbox y combobox.
Un comboBox lo utilizo para mostrar los puertos series que tiene el PC y mediante el boton, abro el puerto.
Hasta aqui todo bien y funciona correctamente.
Mediante un checkbox abro/cierro la segunda ventana, que simplemente tiene un control de texto para escribir todo lo que recibo a traves del puerto serie.
Para ello, tengo una variable puerto de tipo SerialPort con un evento:
puerto.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
En esta funcion es donde intento escribir el texto que recibo por el puerto serie al textBox de la segunda ventana, pero me devuelve una excepcion:
- Código: Seleccionar todo
- Excepción no controlada del tipo 'System.InvalidOperationException' en WindowsBase.dll
- Información adicional: El subproceso que realiza la llamada no puede obtener acceso a este objeto porque el propietario es otro subproceso.
Alguien me podria decir como hacerlo correctamente?
Pongo el codigo para que podais comprobar como lo estoy haciendo:
PuertoSerie.xaml.cs
- Código: Seleccionar todo
- namespace MyProyecto
- {
- /// <summary>
- /// Lógica de interacción para Window1.xaml
- /// </summary>
- public partial class PuertoSerieDlg : Window
- {
- public PuertoSerieDlg()
- {
- InitializeComponent();
- }
- public void ActualizarTexto(string Texto)
- {
- SerialPortDlgText.AppendText(Texto);
- }
- }
- }
MainWindow.xaml.xs
- Código: Seleccionar todo
- namespace MyProyecto
- {
- /// <summary>
- /// Lógica de interacción para MainWindow.xaml
- /// </summary>
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- AddSerialPorts();
- InitWindows();
- }
- private void InitWindows()
- {
- // Localizacion de la ventana principal
- MainGrid.Width = VentanaPrincipal.Width;
- VentanaPrincipal.Left = 0;
- VentanaPrincipal.Top = 0;
- }
- private void AddSerialPorts()
- {
- // Se insertan los puertos serie en el combobox
- string[] strNamePorts = SerialPort.GetPortNames();
- for(int i = 0; i<strNamePorts.Length; i++)
- ComboSelCOM.Items.Add(strNamePorts[i]);
- }
- // *******************************
- // Combo
- // *******************************
- private void ComboSelCOM_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
- {
- // Al seleccionar un puerto COM, se activa el boton conectar
- object puertoSeleccionado = ComboSelCOM.SelectedItem;
- if (puertoSeleccionado != null)
- {
- ConnectCOMButton.IsEnabled = true;
- puerto.PortName = puertoSeleccionado.ToString();
- }
- }
- // *******************************
- // Boton conectar-Desconectar
- // *******************************
- private void OnConnectCOMClick(object sender, RoutedEventArgs e)
- {
- // Conexion con el puerto serie seleccionado
- puerto.BaudRate = 9600;
- puerto.Parity = Parity.None;
- puerto.StopBits = StopBits.One;
- puerto.DataBits = 8;
- puerto.Handshake = Handshake.None;
- puerto.Open();
- if (puerto.IsOpen)
- {
- ComboSelCOM.IsEnabled = false;
- ConnectCOMButton.Visibility = Visibility.Hidden;
- DisconnectComButton.Visibility = Visibility.Visible;
- }
- }
- private void OnDisConnectCOMClick(object sender, System.Windows.RoutedEventArgs e)
- {
- puerto.Close();
- DisconnectComButton.Visibility = Visibility.Hidden;
- ConnectCOMButton.Visibility = Visibility.Visible;
- ComboSelCOM.IsEnabled = true;
- }
- // *******************************
- // Mostrar y ocultar ventanas
- // *******************************
- private void CB_SerialPort_Checked(object sender, System.Windows.RoutedEventArgs e)
- {
- myPuertoSerie.Visibility = Visibility.Visible;
- }
- private void CB_SerialPort_Unchecked(object sender, System.Windows.RoutedEventArgs e)
- {
- myPuertoSerie.Visibility = Visibility.Hidden;
- }
- // **********************************
- // RECIBO DATOS DE PUERTO SERIE
- // **********************************
- public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
- {
- SerialPort sp = (SerialPort)sender;
- string indata = sp.ReadExisting();
- myPuertoSerie.ActualizarTexto(indata);
- }
- }
- }


