Я установил SerialDataReceivedEventHandler с программой на основе форм в экспрессе VS2008. Мой последовательный порт настроен следующим образом:
115200, 8N1
Dtr и Rts включены
ReceivedBytesThreshold = 1
У меня есть устройство, с которым я взаимодействую через Bluetooth, Serial. Гипертерминал получает данные просто отлично с любой скоростью передачи данных. Данные отправляются регулярно в виде пакетов длиной 22 байта. Это устройство имеет регулируемую скорость передачи данных. При низких скоростях передачи данных, 10-20 Гц, приведенный ниже код работает отлично, никаких проблем. Тем не менее, когда я увеличиваю скорость передачи данных за 25 Гц, там начинает принимать несколько пакетов за один вызов. Под этим я подразумеваю, что для каждого входящего пакета должен быть триггер события. При более высоких скоростях вывода я сразу же протестировал размер буфера (команда BytesToRead), когда вызывается событие, и тогда в буфере есть несколько пакетов. Я думаю, что событие происходит медленно, и к тому времени, когда оно достигает кода, больше пакетов попало в буфер. Один тест, который я делаю, это посмотреть, сколько раз событие срабатывает в секунду. На 10 Гц я получаю 10 триггеров событий, потрясающе. На частоте 100 Гц я получаю около 40 триггеров событий, не очень хорошо. Моя цель для скорости передачи данных - 100 Гц, приемлемо, 200 Гц предпочтительно и 300 Гц оптимально. Это должно работать, потому что даже на частоте 300 Гц, то есть всего 52800 бит / с, это меньше половины установленной скорости 115200 бод. Что-нибудь, что я просматриваю?
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);
}