Я создал 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);
}
Почему вы вызываете Invoke () вызов DisplayResults?
Это подталкивает его к MessageLoop, что создает ненужную задержку.
Было бы лучше, если бы DataReceived () помещал данные в (потокобезопасную) очередь для независимой обработки.
Я также думаю, что вы можете столкнуться с проблемами при разделении пакетов.