Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запись в буфер и чтение из него!

62K
22 мая 2012 года
femmill
40 / / 18.04.2012
День добрый!
Среда разработки visual basic 2010.
C com порта идут данные такого типа:
53 24 756 259
т.е четвре цифры разделенные пробелом.
Проблема в их обработке, т.е нужно их принять и разделить по окошкам.
Самый разумный вариант (по моему), записать их в какой то буфер и за тем уже считывать. Прошу показать как это реализовать.
БУДУ ОЧЕНЬ ПРИЗНАТЕЛЕН!
  • И еще - может есть символ конца строки? или критерий только "4 цифры"? от D129, 22 мая 2012 года
  • Пример на C# поможет? Не хочу ломать голову над вибишным синтаксисом... от D129, 22 мая 2012 года
62K
22 мая 2012 года
femmill
40 / / 18.04.2012
с com порта могу присылать и с символами(разными) на конце цифр этих если поможет
данных может быть и 5 и6....
Давайте на C# поробую разобраться
40K
22 мая 2012 года
D129
228 / / 18.04.2012
Код:
string m_serialData; // data needs to besaved beetween events
        bool m_readEnd = false;
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            char dataChar = ' ';
            while (serialPort1.BytesToRead > 0)
            {
                dataChar = (char)serialPort1.ReadChar();
                if (dataChar != 'N')// reading only beetween 'N' ..... 'N'
                {
                    m_serialData += dataChar; // collecting the data
                }
                else
                {
                    m_readEnd = true;
                    break;
                }
            }
            if (m_readEnd) // next 'N' found - needs to send collected data
            {
                SetTextToTextboxes(m_serialData);//end reading  send string of data to main thread
                m_serialData = ""; // data sent, ready for next
                m_readEnd = false;
            }

        }

        delegate void SetTextToView(string textData);
        private void SetTextToTextboxes(string textData)
        {
            if (this.InvokeRequired)
            {
                SetTextToView tempDelegate = new SetTextToView(SetTextToTextboxes);
                this.Invoke(tempDelegate, new object[] { textData });
            }
            else
            {
                textData = "55,43,23,12,32,22,12,44,";  // example string   - i cannot get anything from my port...
                // now string contains only numbers and commas
                string[] separatedData = textData.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // now string contains only numbers and commas

                if (separatedData.Length == 8)
                {
                    this.Text = "Data Ok";                 
                    textBox1.Text = separatedData[0]; // this is more optimal for this task
                    textBox2.Text = separatedData[1]; // instead common solution
                    textBox3.Text = separatedData[2]; // to set all needed data in one delegate
                    //textBox4.Text = separatedData[3];
                    //textBox5.Text = separatedData[4];
                    //textBox6.Text = separatedData[5];
                    //textBox7.Text = separatedData[6];
                    //textBox8.Text = separatedData[7];
                }
                else
                {
                    this.Text = "Data error";
                }
            }
        }
    }
62K
22 мая 2012 года
femmill
40 / / 18.04.2012
так так, как я понял мне нужно разобраться с функцией Split и все ок будет...
40K
22 мая 2012 года
D129
228 / / 18.04.2012
Цитата: femmill
с com порта могу присылать и с символами(разными) на конце цифр этих если поможет
данных может быть и 5 и6....
Давайте на C# поробую разобраться



Конечно поможет.

Вы можете точно знать, когда сообщение готово (принятно всё)

Я обьясню - событие ком-порта поднимается в другом потоке, и сразу по приему первого байта (по умолчанию)
Компьютер работает намного быстрее ком порта.
То есть, мы получим отдельные байты в разных вызовах.
чтобы их собрать, нужен буфер (это вы правильно поняли) на уровне класса, между вызовами хранить данные.
Когда придет конец строки - очень желательно это иметь в сообщении от устройства - мы можем буфер распределить по контролам формы.
Но! делать это надо через инвок - обработка же в другом потоке.
Вот синтаксиса инвока на виби я и не знаю.
:-)

Этот код - я американцу одному помогал.

62K
22 мая 2012 года
femmill
40 / / 18.04.2012
СПС большое!
Суть я понял, тока я тоже синтаксиса не знаю), попробую нашаманить...
62K
22 мая 2012 года
femmill
40 / / 18.04.2012
Цитата: D129
синтаксиса инвока на виби я и не знаю.



Что за инвок можно чуть по подробнее..?

62K
22 мая 2012 года
femmill
40 / / 18.04.2012
на С++ нет примера?
40K
24 мая 2012 года
D129
228 / / 18.04.2012
Цитата: femmill
на С++ нет примера?



Ну это же разные системы. С чего вдруг сразу на С++?

Invoke - это набор функций, обертка, которая позволяет поставить в очередь заданий делегата (ну функцию-акцию) а очередь эта выполняется в основном потоке приложения.
А надо это для изменения содержимого Control ов, кнопок, текстбоксов итп....
Менять их свойства из другого потока (созданного программистом - в данном случае использование ком-порта) можно, но нельзя. :-)

(Если примитивизировать - они же перерисовываются на экране (при событии OPaint итп) а если они перерисовываются, а вдруг придет какое-то другое значение цвета, текста - что с этим делать?)

вот для этого и инвок - ставим в очередь сообщений формы (или отдельного контрола) функцию, когда до нее дойдет очередь, тогда и ....

:-)

62K
24 мая 2012 года
femmill
40 / / 18.04.2012
уже не нужно. На vb все сделал.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог