Я пытаюсь улучшить свою библиотеку (она обеспечивает простой интерфейс между Windows и Arduinos через USB) и обнаружил, что вызовы WriteFile () иногда связывают мой код на неопределенное время.
Я провел некоторое исследование / тестирование и понял,это произошло из-за того, что Arduino не считывал отправленные данные достаточно быстро.В конечном итоге это привело к переполнению буфера вывода COM-порта.Это, в свою очередь, привело к зависанию WriteFile ().
Я хочу добавить функцию в моей библиотеке, которая вычисляет количество пустых байтов в выходном буфере COM-порта, сравните это с количеством байтов.Я хочу передать и определить, следует ли вызывать WriteFile ().
Первым моим достижением было использование значения cbOutQue в структуре COMSTAT.Вот код:
unsigned int WindowsSerial::availableOut()
{
unsigned int result;
ClearCommError(this->handler, &this->errors, &this->status);
result = (OUT_BUFF_SIZE - this->status.cbOutQue);
printf("OUT_BUFF_SIZE: %i, status.cbOutQue %i\n", OUT_BUFF_SIZE, this->status.cbOutQue);
// clamp output
if (result >= 0)
return result;
printf("ALERT: Output buffer size incorrectly specified in library header\n");
return 0;
}
Чтобы проверить этот код, я запустил код на моем Arduino, который фактически не считывал никакие байты, отправленные ему через мой код C ++, чтобы я мог вызвать переполнение буфера.Переполнение произошло, но при каждом вызове availableOut () значение cbOutQue всегда было равно 0.
Например, я буду отправлять строку "hi \ n" снова и снова в Arduino, пока не произойдет переполнение,При каждой передаче "hi \ n", availableOut () вызывался и cbOutQue = 0 каждый раз, хотя байты передавались без чтения.
Очевидно, я смотрю на неправильное значение / поле / структуру, но я не уверен, как еще попытаться определить количество байтов, которые я могу записать до зависания WriteFile ().
Есть идеи?