Здравствуйте. Я пытаюсь найти лучшее решение для непрерывного чтения буфера последовательного порта и парсинга данных в массив, последовательный последовательный порт в виде строки выглядит так:
"... G 130 g \ r \ nG 130 g \ r \ nG 124 г \ r \ nG 124 г \ r \ nG 124 г \ r \ nG ... "
Основная идея читается для примера последней 3 данные из широковещательной строки последовательного порта, анализ на двойной массив [124.0; 124,0; 124.0] и comapre, если равно.
Сейчас я использую этот простой код, но он недостаточно быстр:
_serialPortMainForm.DataReceived += new SerialDataReceivedEventHandler(Port_DataReceived);
.....
void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] data = new byte[_serialPortMainForm.BytesToRead];
_serialPortMainForm.Read(data, 0, data.Length);
string str = Encoding.ASCII.GetString(data);
RawSerialPortData += str;
if (RawSerialPortData.Length > Properties.Settings.Default.BufferSize) {
ProcessSerialPortData(RawSerialPortData);
RawSerialPortData = "";
}
}
И синтаксический анализ данных, подобных этому:
public void ProcessSerialPortData( string DataToProcess) {
int count = 0;
string PostFix = "";
DataToProcess = DataToProcess.Substring(DataToProcess.IndexOf('G') + 1);
DataToProcess = DataToProcess.Replace(" ", "");
DataToProcess = DataToProcess.Replace(Environment.NewLine, "|");
foreach (char c in DataToProcess) if (c == '|') count++;
ProcessedData = new double[count-1];
DataToProcess = DataToProcess.Replace("G", "");
if (DataToProcess.Contains("kg")) { PostFix = "kg"; DataToProcess = DataToProcess.Replace("kg", ""); }
if (DataToProcess.Contains("g")) { PostFix = "g"; DataToProcess = DataToProcess.Replace("g", ""); }
UnitsController(PostFix);
DataToProcess = DataToProcess.Replace(".", ",");
string[] SplitData = DataToProcess.Split('|');
int j = 0;
while (j < count - 1) {
Double.TryParse(SplitData[j], out ProcessedData[j]);
j++;
}
}
Кг не имеют значения для этой ситуации, потому что граммов достаточно для этой ситуации
У кого-нибудь есть идея или простое и лучшее решение, как сделать это лучше и быстрее ??