Я разрабатываю личный проект для чтения 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: я пробовал использовать StringBuilder и добавлять каждый Char из Serial.Read; и в другой попытке: 2 цикла foreach; один, чтобы получить символы из входящих данных, другой, чтобы создать строку. Но никакого успеха.





Поскольку это полученные данные, вам нужно хранить входящие байты в буфере, пока вы не прочитаете достаточно.
Держите свой буфер отдельно как глобальную переменную/экземпляр,
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. Я имею в виду; начиная с конца?
Поскольку он проиндексирован 0, поэтому 0, 8 означает чтение 8 символов, начиная с позиции 0 (которая является 1-м символом). Substring(8) означает начало с позиции 8 (это 9-й символ) и чтение остальной части строки. Таким образом, в основном он вырезает первые 8 символов, поскольку мы уже имели с ними дело. Я поставил // может быть 9, потому что я не был уверен, что эта перегрузка имеет нулевой индекс, и мне было лень искать ее.
Похоже, вам нужно поместить чтение в своего рода цикл, чтобы вы могли продолжать чтение, пока не получите все необходимые данные.