Читайте ком-порты, используя потоки в C # - PullRequest
0 голосов
/ 20 декабря 2011

Хотелось бы посоветовать что-то новое, так как я новичок в этом. Я прочитал несколько статей о многопоточности в Интернете.

Я читаю данные ком-портов. Я хотел бы использовать многопоточность, чтобы он считывал данные каждые 5 секунд и обновлял данные в списке. В настоящее время все данные читаются. Я не уверен, с чего начать.

С чего мне начать ставить коды нитей? Я использую форму Windows, c # VS2008.

Вот мои коды для чтения данных с ком-портов:

    void datareceived(object sender, SerialDataReceivedEventArgs e)
    {            
        myDelegate d = new myDelegate(update);
        listBox1.Invoke(d, new object[] { });

    }


    public void update()
    {           

        while (serialPortN.BytesToRead > 0)
            bBuffer.Add((byte)serialPortN.ReadByte());
        ProcessBuffer(bBuffer);

    }

    private void ProcessBuffer(List<byte> bBuffer)
    {            

        int numberOfBytesToRead = 125;

        if (bBuffer.Count >= numberOfBytesToRead)
        {            


                listBox1.Items.Add("SP: " + (bBuffer[43].ToString()) + "  " + " HR: " + (bBuffer[103].ToString()));


            // Remove the bytes read from the list
            bBuffer.RemoveRange(0, numberOfBytesToRead);

        }

    }        

Спасибо всем!

1 Ответ

2 голосов
/ 20 декабря 2011

Почему бы не использовать таймер? Поместите его в метод InitializeComponent соответствующей формы,

using System.Timers;

private void InitializeComponent()
{
    this.components = new System.ComponentModel.Container();
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.Text = "Form1";

    Timer timer = new Timer();

    timer.Interval = 5000;
    timer.Elapsed += new ElapsedEventHandler(TimerElapsed);

    //timer.Enabled = true; // you may need this, but probably not if you are calling the start method.
    timer.Start();
}

void TimerElapsed(object sender, ElapsedEventArgs e)
{
    // put your code here to read the COM port
}

Единственная другая проблема с этим кодом состоит в том, что вы получите исключение. Межпотоковая операция недопустима.

Вы должны будете изменить свой код следующим образом,

private void ProcessBuffer(List<byte> bBuffer)
{
    int numberOfBytesToRead = 125;

    if (bBuffer.Count >= numberOfBytesToRead)
    {
        this.Invoke(new Action(() =>
        {
            listBox1.Items.Add("SP: " + (bBuffer[43].ToString()) + "  " + " HR: " + (bBuffer[103].ToString()));
        });

        // Remove the bytes read from the list
        bBuffer.RemoveRange(0, numberOfBytesToRead);
    }
}

Причина в том, что метод ProcessBuffer будет работать в фоновом потоке. Фоновые потоки не могут получить доступ к компонентам пользовательского интерфейса в потоке пользовательского интерфейса. Поэтому вы должны вызвать this.Invoke, который запустит это обновление в список в потоке пользовательского интерфейса.

Посмотрите здесь, если хотите узнать больше о методе Invoke,

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

UPDATE:

Итак, в методе TimerElapsed вы захотите вызвать свой код, но мне не ясно, какую часть вашего кода он должен вызывать? Для чего нужен метод «datareceived», нет ничего вызывающего его в вашем фрагменте кода.

Так что я предполагаю, что это будет,

void TimerElapsed(object sender, ElapsedEventArgs e)
{
    Update();
}

public void Update()
{
    while (serialPortN.BytesToRead > 0)
        buffer.Add((byte)serialPortN.ReadByte());
    ProcessBuffer(buffer);
}

Не имеет смысла вызывать метод ProcessBuffer, потому что откуда берется буфер?

Если я не на правильном пути, возможно, расширьте ваш пример кода, и я буду рад помочь вам.

Обратите внимание на некоторые изменения стиля, которые я сделал в вашем коде (не стесняйтесь брать их или оставлять их), метод в C # должен начинаться с заглавной буквы, а вызов переменной bBuffer не является стандартным в C #. Другой момент, если этот метод вызывается только из класса, он должен быть закрытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...