Проблемы с кодом C#

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012
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.

maksim
Offline
Зарегистрирован: 12.02.2012

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

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

 

leshak
Offline
Зарегистрирован: 29.09.2011

А кто вам сказал что "через 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 разбирать.

Или "забить на формочки" и делать простые консольные приложения.

 

 

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

Спасибо, сделал событием.