Запись в буфер и чтение из него!
Среда разработки visual basic 2010.
C com порта идут данные такого типа:
53 24 756 259
т.е четвре цифры разделенные пробелом.
Проблема в их обработке, т.е нужно их принять и разделить по окошкам.
Самый разумный вариант (по моему), записать их в какой то буфер и за тем уже считывать. Прошу показать как это реализовать.
БУДУ ОЧЕНЬ ПРИЗНАТЕЛЕН!
данных может быть и 5 и6....
Давайте на C# поробую разобраться
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";
}
}
}
}
данных может быть и 5 и6....
Давайте на C# поробую разобраться
Конечно поможет.
Вы можете точно знать, когда сообщение готово (принятно всё)
Я обьясню - событие ком-порта поднимается в другом потоке, и сразу по приему первого байта (по умолчанию)
Компьютер работает намного быстрее ком порта.
То есть, мы получим отдельные байты в разных вызовах.
чтобы их собрать, нужен буфер (это вы правильно поняли) на уровне класса, между вызовами хранить данные.
Когда придет конец строки - очень желательно это иметь в сообщении от устройства - мы можем буфер распределить по контролам формы.
Но! делать это надо через инвок - обработка же в другом потоке.
Вот синтаксиса инвока на виби я и не знаю.
:-)
Этот код - я американцу одному помогал.
Суть я понял, тока я тоже синтаксиса не знаю), попробую нашаманить...
Что за инвок можно чуть по подробнее..?
Ну это же разные системы. С чего вдруг сразу на С++?
Invoke - это набор функций, обертка, которая позволяет поставить в очередь заданий делегата (ну функцию-акцию) а очередь эта выполняется в основном потоке приложения.
А надо это для изменения содержимого Control ов, кнопок, текстбоксов итп....
Менять их свойства из другого потока (созданного программистом - в данном случае использование ком-порта) можно, но нельзя. :-)
(Если примитивизировать - они же перерисовываются на экране (при событии OPaint итп) а если они перерисовываются, а вдруг придет какое-то другое значение цвета, текста - что с этим делать?)
вот для этого и инвок - ставим в очередь сообщений формы (или отдельного контрола) функцию, когда до нее дойдет очередь, тогда и ....
:-)