Последовательный порт, флажки, Threading - PullRequest
0 голосов
/ 24 февраля 2012

Привет, я все еще хочу получать 6 байтов от последовательного порта, только когда выбран TabItem1. И установить флажки состояния зависит от того байтов ... Пример: но он не работает: /

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();                
    }
}

1 Ответ

1 голос
/ 24 февраля 2012

Я думаю, что функция receiveData связана с событием SerialPort.DataReceived. Это на самом деле будет работать в другом потоке, чем ваш графический интерфейс. И вам нравится что-то менять в своем графическом интерфейсе, что приводит к показанной проблеме.

Чтобы разрешить эту работу, вы можете позвонить

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;
}));

Это переключится обратно в поток графического интерфейса для внесения этих изменений, и исключение должно быть удалено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...