Так как это в полученных данных, вам нужно хранить входящие байты в буфере, пока вы не прочитали достаточно.
Храните ваш буфер отдельно как глобальную переменную / переменную экземпляра,
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
.