Невозможно получить полные серийные данные - PullRequest
0 голосов
/ 07 марта 2019

Я разрабатываю персональный проект для чтения RFID-меток от Arduino.Когда я читаю 1-й тег;Я получаю общее количество байтов и информация обрабатывается правильно.Однако при чтении в следующий раз;похоже, что мой ПК «видит» полученное событие для первого полученного байта (из 8);и затем обрабатывают данные, полученные за один раз;(когда в буфере только 6 байтов).После отправки этих 6 байтов для обработки он замечает поступление нового байта и обрабатывает его, а также следующие байты;создание результатов в двух сообщениях по 6 и 2 байта.

Пример результата:

1-е чтение: сообщение: 06DB0934

2-е чтение: сообщение 1: 06

2-е чтение: Сообщение 1: DB0934

Ниже приведен мой скромный код:

private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if (port.IsOpen)
    {
        byte[] data = new byte[1024];
        int bytesRead = port.Read(data, 0, data.Length);
        idTag = Encoding.ASCII.GetString(data, 0, bytesRead);

        // Custom Event that will update Information on Main Form
        OnTagReceived(); 
    }
}

Есть идеи, как обойти эту проблему?

1 Ответ

1 голос
/ 07 марта 2019

Так как это в полученных данных, вам нужно хранить входящие байты в буфере, пока вы не прочитали достаточно.

Храните ваш буфер отдельно как глобальную переменную / переменную экземпляра,

private string _tagBuffer;

Тогда в вашем методе

if (port.IsOpen)
{
    byte[] data = new byte[1024];
    int bytesRead = port.Read(data, 0, data.Length);
    _tagBuffer += Encoding.ASCII.GetString(data, 0, bytesRead);

    if (_tagBuffer.Length >= 8)
    {        
        idTag = tagBuffer.substring(0, 8);
        tagBuffer = tagBuffer.substring(8); // might be 9

        OnTagReceived();
    }
}

Может быть, лучше поместить тег в аргументы, отправляемые событию, вместо того, чтобы помещать их в idTag.

...