Мониторинг ком порта на Visual С#
- Войдите на сайт для отправки комментариев
Пнд, 29/10/2012 - 18:52
З ардуино отправляется даные на компорт! Нужно постоянно выводить все ето в 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, но ето бесконечний цикл а вот нужно теперь добавить кнопки и другие елементы. Но так как пока работает етот цикл ничего в программе зделать нельзя, даже кнопку нажать. Помогите если ктото имел дело с етим. Спасибо.
Беда-огорчение, немного не отдюда вопрос, но не страшно.
Ваша программа, особенно если она WinForms - делает за миллисекнды множество действий, таких как отслеживание мышки и перерисовка контента под ней, отслеживание нажйтий кнопок и прочей дребедени. Вы даже не задумываетесь об этом, потому как это все возложено на плечи вашей ОС.
А вы берете и в бесконечном цикле основного потока нарушаете эту идиллию! Разумеется все будет виснуть тупить и склеивать ласты.
Почитайте первым делом по потоки. Там нет ничего сложного но все же это решит вашу проблему. Создаете поток, и в нем получаете данные и обновляете ваш текст бокс.
Все намного проще чем создвать отдельный поток.
Вот пример(код взят тут 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); } }Можно и так, в таком случае система сделает большую часть работы сама, через ивенты. Оданако это тоже работает не без потоков и по-хорошему, работу с ними тоже надо изучить чтобы не бояться их применять.