C# ответ.Net Serial DataReceived Event также замедляются для данных высокого показателя

Я создал SerialDataReceivedEventHandler с основанной на формах программой в экспрессе VS2008. Мой последовательный порт настраивается следующим образом:

115200, 8N1

Dtr и РТС включены

ReceivedBytesThreshold = 1

У меня есть устройство, с которым я взаимодействую через интерфейс по Bluetooth, USB к Последовательному. Терминал Hyper получает данные очень хорошо на любой скорости передачи данных. Данные регулярно отправляются в 22-байтовых длинных пакетах. Это устройство имеет регулируемую процентную ставку, по которой отправляются данные. На низких скоростях передачи данных, 10-20Hz, код ниже работает отлично, никакие проблемы. Однако, когда я увеличиваю скорость передачи данных прошлые 25 Гц, там начинает получать mulitple пакеты на одном вызове. Под чем я подразумеваю, это - то, что должен быть триггер события для каждого входящего пакета. С более высокими нормами выработки я протестировал размер буфера (команда BytesToRead) immediatly, когда событие называют и существует несколько пакетов в буфере затем. Я думаю, что событие медленно стреляет и к тому времени, когда оно достигает кода, больше пакетов поразило буфер. Один тест, который я делаю, видят, сколько времени событие является триггером в секунду. На уровне 10 Гц я получаю 10 триггеров события, потрясающих. На уровне 100 Гц я получаю что-то как 40 триггеров события, не хороших. Моя цель для скорости передачи данных составляет 100 Гц, приемлемо, 200 Гц предпочтенный, и оптимум на 300 Гц. Это должно работать, потому что даже на уровне 300 Гц, который составляет только 52800 бит/с, меньше чем половина набора 115 200 скоростей в бодах. Что-нибудь я по взгляду?

    public Form1()
    {
        InitializeComponent();
        serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);            
    }


    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        this.Invoke(new EventHandler(Display_Results));
    }


    private void Display_Results(object s, EventArgs e)
    {
        serialPort1.Read(IMU, 0, serial_Port1.BytesToRead);
    }
6
задан Mike 17 October 2012 в 12:17
поделиться

1 ответ

Почему вы вызываете Invoke () вызов DisplayResults?

Это подталкивает его к MessageLoop, что создает ненужную задержку.

Было бы лучше, если бы DataReceived () помещал данные в (потокобезопасную) очередь для независимой обработки.

Я также думаю, что вы можете столкнуться с проблемами при разделении пакетов.

3
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: