串口和复选框更新

时间:2012-03-28 17:26:58

标签: c# checkbox serial-port

在我的应用程序中'我正在从串口接收数据并将它们保存到两个 bool 阵列中。
并取决于这些数组我正在设置复选框。但是只有当我更改选项卡时,复选框才会更新....
这就是我在做什么(也许有更好的方法)

private void comboBoxCommunication_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (serialPort.IsOpen)
  {
    recieveThread.Abort();
        serialPort.Close();               
  }
  ComboBoxItem cbi = (ComboBoxItem)comboBoxCommunication.SelectedItem;
  portCommunication = cbi.Content.ToString();
  serialPort.PortName = portCommunication;
  try
  {
    serialPort.Open();
    recieveThread = new Thread(dataRecieving);
        prijmiThread.Start();                                
    checkBoxI1.IsChecked = vstupy[0] ? true : false;
    checkBoxI2.IsChecked = inputs[1] ? true : false;
    checkBoxI3.IsChecked = inputs[2] ? true : false;
    checkBoxQ2.IsChecked = outputs[3] ? true : false;                                           
  }
  catch (IOException ex)
  {
        MessageBox.Show(ex.ToString(), "Error!", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
    }
}

private void dataRecieving()
{ 
    if (serialPort.IsOpen)
  {                    
    int i = serialPort.ReadChar();
    if (i == 'A')
    {
        inputs[0] = true;
    }
        else if (i == 'a')
        {
        inputs[0] = false;
    }
    if (i == 'B')
    {
        inputs[1] = true;
    }
    else if (i == 'b')
    {
        inputs[1] = false;
    }
    if (i == 'C')
    {
        inputs[2] = true;
    }
    else if (i == 'c')
    {
        inputs[2] = false;
    }
    if (i == 'D')
    {
        outputs[0] = true;
    }
    else if (i == 'd')
    {
        outputs[0] = false;
    }                        
  }           
}

1 个答案:

答案 0 :(得分:1)

假设你想要启动一个检查串口的线程,然后让你的GUI近乎实时更新到串口线程的变化,你可能需要做几件事。

  1. 当复选框改变状态时,我会从串行读取代码中引发事件
  2. GUI可以订阅此事件您必须了解交叉线程。也就是说,您不能让事件的处理程序直接更新由单独线程拥有的GUI元素。
  3. 因此,在您的事件处理程序中,您需要通过拥有线程调用更新。
  4. 我在成语上写了blog entry一次,用于处理Winform应用上的交叉线程。

    我也不确定你的输入数组是如何定义的,但一般来说,没有某种控制机制,两个线程访问共享数据并不是一个好主意。如果您的数组基于执行原子读/写的数据类型,则可能没问题,但通常您要考虑当另一个线程读取或写入相同数据时,如果一个线程处于非原子写入的中间会发生什么。您可能希望熟悉的线程安全性很多。