C ++: получить количество пустых байтов в буфере Windows USB TX - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь улучшить свою библиотеку (она обеспечивает простой интерфейс между 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 ().

Есть идеи?

...