Не удалось получить полные серийные данные

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

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

1st Read: Message: 06DB0934

2nd Read: Message 1: 06

2nd Read: Message 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(); 
    }
}

Любая идея, как обойти эту проблему?

Похоже, вам нужно поместить чтение в своего рода цикл, чтобы вы могли продолжать чтение, пока не получите все необходимые данные.

NibblyPig 07.03.2019 13:02

Привет @NibblyPig: я пробовал использовать StringBuilder и добавлять каждый Char из Serial.Read; и в другой попытке: 2 цикла foreach; один, чтобы получить символы из входящих данных, другой, чтобы создать строку. Но никакого успеха.

Ricardo Garcia 07.03.2019 13:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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.

Превосходно! Сработало отлично! Большое вам спасибо. Вот как вы считаете байты! Он работает с 8 символами. Но я понял, что пробел или линия могут вызвать увеличение этого значения. Чего я не понял, так это почему «StartIndex» tagBuffer = tagBuffer.Substring(8); также 8. Я имею в виду; начиная с конца?

Ricardo Garcia 07.03.2019 13:39

Поскольку он проиндексирован 0, поэтому 0, 8 означает чтение 8 символов, начиная с позиции 0 (которая является 1-м символом). Substring(8) означает начало с позиции 8 (это 9-й символ) и чтение остальной части строки. Таким образом, в основном он вырезает первые 8 символов, поскольку мы уже имели с ними дело. Я поставил // может быть 9, потому что я не был уверен, что эта перегрузка имеет нулевой индекс, и мне было лень искать ее.

NibblyPig 07.03.2019 13:45

Другие вопросы по теме