C# - Получение данных из последовательного порта становится слишком медленным при скорости выше 200 кбит / с. - PullRequest
0 голосов
/ 03 августа 2020

Я создал приложение 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);

        }
...