У меня есть устройство, которое обменивается данными через RS485, и мне нужно сделать петлю в C #, которая получает мои данные и отправляет их обратно. Первый байт содержит информацию о длине поступающих данных. Иногда бывает, что 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), Event DataReceived будет иногда запускаться из нескольких частей. С Thread.Sleep (10) он работает правильно каждый раз.
Знаете ли вы, почему это происходит? Я ожидаю, что если я скажу, что хочу прочитать 40 байтов, SerialPort попытается получить все эти 40 байтов или произойдет исключение. Я пытался изменить свойство ReadTimeout, но без изменений.