Мониторинг ком порта на Visual С#

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

 З ардуино отправляется даные на компорт! Нужно постоянно выводить все ето в textBox непрерывно

 for (int i = 0; i <= 1; )       //початок циклу опитування потру 
            {
                Timer t = new Timer();            //затримка для читання порту
                t.Interval = 50;
                t.Enabled = true; //старт таймера
                
                c = serialPort1.ReadLine();
                textBox1.Text = с;
                serialPort1.DiscardInBuffer();      //очистка буферу прийому порту
            }

все работает, все даные которые приходят на порт с дуины отображаются в textBox1, но ето бесконечний цикл а вот нужно теперь добавить кнопки и другие елементы. Но так как пока работает етот цикл ничего в программе зделать нельзя, даже кнопку нажать. Помогите если ктото имел дело с етим. Спасибо.

Мининова
Offline
Зарегистрирован: 08.06.2012

Беда-огорчение, немного не отдюда вопрос, но не страшно.
Ваша программа, особенно если она WinForms - делает за миллисекнды множество действий, таких как отслеживание мышки и перерисовка контента под ней, отслеживание нажйтий кнопок и прочей дребедени. Вы даже не задумываетесь об этом, потому как это все возложено на плечи вашей ОС.

А вы берете и в бесконечном цикле основного потока нарушаете эту идиллию! Разумеется все будет виснуть тупить и склеивать ласты.
Почитайте первым делом по потоки. Там нет ничего сложного но все же это решит вашу проблему. Создаете поток, и в нем получаете данные и обновляете ваш текст бокс.

ILexV
Offline
Зарегистрирован: 11.11.2012

Все намного проще чем создвать отдельный поток.

Вот пример(код взят тут http://msdn.microsoft.com/ru-ru/library/system.io.ports.serialport.datareceived.aspx):



using System;
using System.IO.Ports;

class PortDataReceived
{
    publicstaticvoid Main()
    {
        SerialPort mySerialPort = new SerialPort("COM1");

        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }

    privatestaticvoid DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }
}

 

Мининова
Offline
Зарегистрирован: 08.06.2012

Можно и так, в таком случае система сделает большую часть работы сама, через ивенты. Оданако это тоже работает не без потоков и по-хорошему, работу с ними тоже надо изучить чтобы не бояться их применять.