none
Как узнать, что все данные с serialPort прочитались? RRS feed

  • Вопрос

  • Есть программа которая отправляет данные на СОМ порт и принимает их с того же СОМ порта (через пару секунд максимум). Причем считывает она их в backgroundWorker.

    static bool _continue = true;
    static SerialPort _serialPort;
    static int a = 0;
    
    private void button3_Click(object sender, EventArgs e)
            {           
                    textBox2.Text = "";
    
                    if (textBox1.Text != "")
                    {
                        Encoding win_1251 = Encoding.GetEncoding("windows-1251");//.ASCII;
                        // Convert the string into a byte array.
                        byte[] asciiBytes = win_1251.GetBytes(textBox1.Text);
    
                        _serialPort.Write(asciiBytes, 0, asciiBytes.Length); //отправляю массив байт в СОМ порт
                        this.backgroundWorker1.RunWorkerAsync(); //начинаю ожидать возвращение данных с СОМ порта
                    }
                    a = 0;
                    _continue = true;
                    timer2.Start();
            }
    
    private void timer2_Tick(object sender, EventArgs e)
            {
                a++;
                if (a >= 10) { // 10 секунд до срабатывания таймера (откл. прием данных с СОМ порта)
                    _continue = false; timer2.Stop(); }
            }
    
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                while (_continue)
                {
                        textBox2.AppendText(_serialPort.ReadExisting());
                        Application.DoEvents();
                }
            }
    

    Сейчас сделано все очень по «дубовому». Т.е. данные ушли в СОМ порт. Программа в течении 10 секунд принимает ответ. Принимает она ответ какую-то секунду, а все остальное время крутится в цикле. Через 10 секунд цикл запрещается.

    Как сделать, что бы по окончанию приема из СОМ порта отключался backgroundWorker? Ну, что бы таймер не использовать (не ждать контрольные 10 секунд).

    Т.е. как определить, что ПК уже все что нужно получил с СОМ порта?

    30 июня 2012 г. 21:50

Ответы

  • У порта есть свойство BytesToRead;

    я реализовывал это так: Создал порт sp и List<byte> array. 

    sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Recieve);

    private void Recieve(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //прием { while (sp.BytesToRead != 0) { byte b = (byte)sp.ReadByte(); array.Add(b);

    // мне надо было в зависимости от данных делать разные вещи. и поэтому тут у меня стоят нужные проверки на информацию }




  • Принимайте данные как в примере у Вячеслава - с помощью события SerialPort.DataReceived - событие, оно асинхронное, запускается в отдельном потоке, никак не тормозит UI. В нем считывайте данные как и сейчас с помощью ReadExisting - далее через Invoke обновляйте контрол на форме, т.к. событие вызывается в отдельном потоке.


    Для связи [mail]

    • Помечено в качестве ответа sg6336 3 июля 2012 г. 7:32

Все ответы

  • У порта есть свойство BytesToRead;

    я реализовывал это так: Создал порт sp и List<byte> array. 

    sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Recieve);

    private void Recieve(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //прием { while (sp.BytesToRead != 0) { byte b = (byte)sp.ReadByte(); array.Add(b);

    // мне надо было в зависимости от данных делать разные вещи. и поэтому тут у меня стоят нужные проверки на информацию }




  • Принимайте данные как в примере у Вячеслава - с помощью события SerialPort.DataReceived - событие, оно асинхронное, запускается в отдельном потоке, никак не тормозит UI. В нем считывайте данные как и сейчас с помощью ReadExisting - далее через Invoke обновляйте контрол на форме, т.к. событие вызывается в отдельном потоке.


    Для связи [mail]

    • Помечено в качестве ответа sg6336 3 июля 2012 г. 7:32