串口通讯显示

时间:2014-10-08 23:02:32

标签: c# wpf serial-port

我试图与串口通信进行聊天。这个聊天必须在WPF项目中有一个界面,我已经创建了我的界面和所有内容。我被困在通过串口接收响应。我已经尝试从串口添加一个DataReceived事件,但我担心我错误地使用它,因为我之前从未在C#中编程。这是一个非常简单的代码。 我需要做的是从串口接收信息并将其显示在文本块中,就像在简单的聊天窗口中看到的那样。

        InitializeComponent();
        _serialPort = new SerialPort();

        foreach (string s in SerialPort.GetPortNames())
        {
            listaComs.Items.Add(s);
        }


    }

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        visor.Inlines.Add("Data Received:");
        visor.Inlines.Add(indata);
    }
    private void enviarClick(object sender, RoutedEventArgs e)
    {
        _serialPort.WriteLine(escribir.Text);
        visor.Inlines.Add("Yo: " + escribir.Text + Environment.NewLine);
    }

    private void cambiarTexto(object sender, MouseButtonEventArgs e)
    {
        if (escribir.Text == "Escriba su texto")
        {
            escribir.Text = "";
        }
    }

    private void inicializarSerial()
    {
        // Poner las propiedades correctas.
        _serialPort.BaudRate = 9600;
        _serialPort.Parity = Parity.None;
        _serialPort.StopBits = StopBits.One;
        _serialPort.DataBits = 8;
        _serialPort.Handshake = Handshake.None;
        _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        // Poner los timeouts de escritura y lectura
        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;
    }

    private void conectarCom(object sender, RoutedEventArgs e)
    {
        string seleccion = listaComs.SelectedItem.ToString();
        _serialPort.PortName = seleccion;
        inicializarSerial();
        _serialPort.Open();
        _continue = true;
        visor.Text = "";
    }

    private void desconectarCom(object sender, RoutedEventArgs e)
    {
        _serialPort.Close();
    }

当我在.exe文件中运行它时,它崩溃了InvalidOperationException内部异常(已翻译):

  

"实现呼叫的子进程无法获得对此的访问权限   object,因为propietary是另一个子进程。"

1 个答案:

答案 0 :(得分:1)

事件是从调用它们的线程触发的,对于串行端口(或任何通信层),这将肯定不在UI线程上。

但是,UI操作必须在UI线程上完成。所以下面的代码将会失败:

    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    visor.Inlines.Add("Data Received:");
    visor.Inlines.Add(indata);

因为您正在从错误的线程修改UI元素。解决方案是使用BeginInvokeMSDN)将操作封送到UI线程:

    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();

    Dispatcher.BeginInvoke(() =>
    {
       visor.Inlines.Add("Data Received:");
       visor.Inlines.Add(indata);
    }, null);

PS。你的例外翻译似乎没有问题;如果这是问题,您将看到的例外是(英文):

  

跨线程操作无效:从其他线程访问控制   而不是它创建的线程。

(或类似的东西)。我没有认识到提供的文本,并且根据您的代码,看起来这就是您遇到的内容。