И ещё, а зачем в THICOMEX.ExecuteRd вот это ReadStr := BufferRd + #0 ?
По-моему, должно быть так:
// Вместо этого:
//SetLength(BufferRd, FStat.cbInQue);
// Это:
if FStat.cbInQue > Length(BufferRd) then SetLength(BufferRd, FStat.cbInQue); // Экономим перераспределение памяти
// Вместо этого:
//ReadStr := BufferRd + #0;
//SetLength(ReadStr, BytesTrans);
// Это:
ReadStr := Copy(BufferRd, 1, BytesTrans);
//SetLength(BufferRd, FStat.cbInQue);
// Это:
if FStat.cbInQue > Length(BufferRd) then SetLength(BufferRd, FStat.cbInQue); // Экономим перераспределение памяти
// Вместо этого:
//ReadStr := BufferRd + #0;
//SetLength(ReadStr, BytesTrans);
// Это:
ReadStr := Copy(BufferRd, 1, BytesTrans);