У меня есть устройство, которое обменивается данными через RS485, и мне нужно сделать петлю на С#, которая получает мои данные и отправляет их обратно. Первый байт содержит информацию о длине поступающих данных. Иногда случается так, что C# запускает событие в нескольких частях. Мне нужно, чтобы я получил их только одной частью, чтобы я мог отправить обратно за один раз.
var buffer = new byte[1000];
port = new SerialPort(ConfigParams.PORT, 115200, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.DtrEnable = true;
port.DataReceived += (sender, e) =>
{
var length = port.ReadByte();
Thread.Sleep(10);
var bytes = port.Read(buffer, 1, length);
buffer[0] = (byte)length;
port.Write(buffer, 0, length + 1);
mainForm.Log("Port (" + (length + 1).ToString() +"): " + Encoding.UTF8.GetString(buffer, 0, length + 1)+"\n");
mainForm.Log("Data was sended.\n");
};
На первом этапе я читаю первый байт, чтобы получить количество поступающих байтов. Затем я прочитал остальные байты. Если я не вставлю туда строку Thread.Sleep(10), событие DataReceived иногда будет срабатывать в нескольких частях. С Thread.Sleep(10) он каждый раз работает корректно.
Вы знаете, почему это происходит? Я ожидаю, что если я скажу, что хочу прочитать 40 байт, SerialPort попытается получить все эти 40 байт или вызовет исключение. Я попытался изменить свойство ReadTimeout, но без изменений.