Я создал приложение wpf для управления и мониторинга сенсора, изобретенного в моем университете. Я подключаюсь к устройству с двумя портами, один из которых предназначен исключительно для отправки данных с устройства. Устройство кодирует каждый набор данных до 5 байтов и начинает их отправлять, как только я отдаю ему заказ через другой компорт. Внутренний буфер датчика составляет ~ 40 килобайт.
Проблема: Он отлично работает, пока не будет выбрана частота дискретизации выше 25 кГц (25000 раз по 5 байтов в секунду). Затем данные кажутся потерянными, и устройство отправляет сообщение об ошибке, что внутренний буфер заполнен (что объясняет потерянные данные)
Я пробовал несколько подходов, но безуспешно, последний пытался применить это решение: https://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport
Я не понимаю, что определяет, как часто я получаю событие, которое захватывает данные с последовательного порта. Проблема не в том, является ли моя программа быстрой или медленной ... всегда ~ 25 кГц = ~ 200 КБ / с
Код:
private SerialPort _comPortData;
_comPortData.DataReceived += new SerialDataReceivedEventHandler(PortDataReceived);
The Connect () урезанная функция:
void connect()
{
comPort.BaudRate = 115200;
comPort.DataBits = 8;
comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "One");
comPort.Parity = (Parity)Enum.Parse(typeof(Parity), "None");
comPort.PortName = port;
comPort.Open();
Console.WriteLine(comPort.PortName + " opened | Baud Rate: " + comPort.BaudRate);
}
(отредактированная) функция PortDataReceived:
private void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (!_comPortData.IsOpen) return;
// Obtain the number of bytes waiting in the port's buffer
int numberOfBytes = _comPortData.BytesToRead;
// Create a byte array buffer to hold the incoming data
byte[] buffer = new byte[numberOfBytes];
// Read the data from the port asynchronously and store it in the buffer
await _comPortData.BaseStream.ReadAsync(buffer, 0, numberOfBytes);
}