串行端口、复选框、线程

本文关键字:线程 复选框 串行端口 | 更新日期: 2023-09-27 18:25:54

嗨,我只想在选择TabItem1时仍从串行端口接收6个字节。并且设置复选框状态取决于该字节。。。示例:但不起作用:/

private void receiveData()
{            
    for(int i = 0; i < 3; ++i)          
        inputs[i] = serialPort.ReadByte();
    for (int i = 0; i < 3; ++i)          
        outputs[i] = serialPort.ReadByte();
    checkBoxI1.IsChecked = inputs[0] == 32 ? true : false;
    checkBoxI2.IsChecked = inputs[1] == 32 ? true : false;
    checkBoxI3.IsChecked = inputs[2] == 32 ? true : false;
    checkBoxQ1.IsChecked = outputs[0] == 32 ? true : false;
    checkBoxQ2.IsChecked = outputs[1] == 32 ? true : false;
    checkBoxQ3.IsChecked = outputs[2] == 32 ? true : false;
}
// Tab change
private void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (tabControl1.SelectedItem == tabItem1)
    {                                     
        serialPort.Close();
        try
        {
            receiveThread.Abort();
        }
        catch (NullReferenceException)
        { 
        }
    }
    else if (tabControl1.SelectedItem == tabItem2)
    {                
        serialPort.Open();                
        receiveThread = new Thread(receiveData);
        receiveThread.Start();                
    }
}

串行端口、复选框、线程

我认为receiveData函数绑定到SerialPort.DataReceived事件。事实上,这将在不同于gui的线程上运行。并且您喜欢更改gui上的某些内容,这会导致显示的问题。

为了让这个工作,你可能应该打电话给

checkBoxI1.Invoke(new Action(() => 
{
    checkBoxI1.IsChecked = inputs[0] == 32;
    checkBoxI2.IsChecked = inputs[1] == 32;
    checkBoxI3.IsChecked = inputs[2] == 32;
    checkBoxQ1.IsChecked = outputs[0] == 32;
    checkBoxQ2.IsChecked = outputs[1] == 32;
    checkBoxQ3.IsChecked = outputs[2] == 32;
}));

这将切换回gui线程来进行这些更改,并且异常应该消失。