2014-01-13 4 views
0

У меня есть следующая программа на C# с кнопкой GetForceButton и многострочным текстовым полем ForceTextbox. Вот код, у меня есть на данный момент:Непрерывное чтение последовательных данных в текстовое поле

public Form1() 
{ 
    InitializeComponent(); 
    System.ComponentModel.IContainer components = new System.ComponentModel.Container(); 
    serialPort1 = new System.IO.Ports.SerialPort(components); 
    serialPort1.PortName = "COM7"; 
    serialPort1.BaudRate = 9600; 
    serialPort1.DtrEnable = true; 
    serialPort1.Open(); 
    serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
} 

bool buttonpressed = false; 

public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadLine(); 
    if (buttonpressed == true) 
    { 
     ForceTextbox.Text = indata + "\n"; 
    } 
    else 
    { 
     ForceTextbox.Text = "No data received"; 
    } 
} 

private void GetForceButton_Click(object sender, EventArgs e) 
{ 
    buttonpressed = true; 
} 

Когда я пошагово код, входные данные, получает значение из SerialPort в «0,00 \ г» (в том числе речевых скобок).

После перехода на ForceTextbox.Text = indata + "\ n"; line, исключение вызывается, говоря:

Необработанное исключение типа «Исправление System.InvalidOperationException» произошло в System.Windows.Forms.dll. Дополнительная информация: Неверная операция поперечного потока: Control 'ForceTextbox', доступ к которому осуществляется из потока, отличного от потока, на котором он был создан.

Что это значит или что я делаю неправильно, пожалуйста?

+0

Если я вытащил строки «ForceTextbox.Text» и заменил их «Messagebox.Show», тогда все будет работать. Есть ли что-то не так с тем, как я называю «ForceTextbox» для записи на ??? –

ответ

1

Вам необходимо прочитать this link.

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

Вы будете использовать InvokeRequired, как показано на этой ссылке.

Вы должны сделать это на C# повсюду, к сожалению. One other tutorial из Microsoft.

Смежные вопросы