Проблемы с кодом C#
- Войдите на сайт для отправки комментариев
Чт, 20/06/2013 - 21:24
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SerialPort serialPort1 = new SerialPort("COM3", 9600);
serialPort1.Open(); //открываем COM-порт
string data = "";
while (true)
{
if (serialPort1.BytesToRead > 0)
{
data += serialPort1.ReadExisting().ToString();
if(data.Contains("\n")) {
label1.Text = data;
data = "";
}
}
}
}
}
}
Проблема в том что не выводится само окно программы, если вставляю MessageBox.Show то покзывает, а окно программы не выводит, проблема мне кажется из-за while, но подскажите как правильно считывать через while.
Не знаю как в С#, но выхода из бесконечного цикла я не наблюдаю. Попробуйте так:
while (true) { if (serialPort1.BytesToRead > 0) { data += serialPort1.ReadExisting().ToString(); if(data.Contains("\n")) { label1.Text = data; data = ""; break; } } }или так:
boolean end = false; while(end == false) { if (serialPort1.BytesToRead > 0) { data += serialPort1.ReadExisting().ToString(); if(data.Contains("\n")) { label1.Text = data; data = ""; end = true; } } }А кто вам сказал что "через while" вообще правильно?
Если уже хочется "через while" - запускать в отдельном потоке. А так вы заблокировали UI-шных поток, в конструкторе Form1 и форма никогда не может завершить свое создание. Но даже в отдельном потоке - while будет дышать, но это в корне неправильно. загрузка проца и проч. радости.
Правильно - это вешатся на события. Считывать данные в обработчике события. Но тут важно не забыть, что обновлять интерфейс из другого потока - нельзя (сами запустили отдельный поток, или "в обработчике события", которые тоже отдельный поток - не важно). UI-шку можно обновлять только через диспатчер.
Пример чего-то подобного нагуглить можно через "C# Serial WinForms sample". К примеру:
http://www.codeproject.com/Tips/361285/Serial-Port-Communication
А вообще, раз есть попытки сделать while в конструкрторе формы - лучше взять какую-нибудь книжечку по C# WinForms (хотя я, лично, предпочел бы более современную WPF вместо WinForms) - и поучится вообще делать Формочки/UI-шки, разобратся с потоками, событиями, жизненным циклом формы и проч. Бо, подозреваю, что хотя я ответ вам выше и дал, но все это прозвучало как "нужно делать через тирьям-пам-пацию" :) А уж потом - работу с Serial разбирать.
Или "забить на формочки" и делать простые консольные приложения.
Спасибо, сделал событием.