qextserialport сбрасывает данные в Windows, что я могу с этим поделать?

Фон

На данный момент у меня есть частицы TelosB, которые используются для собирать данные датчиков, а затем передавать их через последовательный порт USB со скоростью 115200 бод.

В прошлом я использовал Python для разработки программы, которая будет взаимодействовать с мотом, но GIL Python имеет свою долю проблем с многопоточностью, которые можно решить, только не используя Python (мне был нужен его параллелизм после начальной фазы тестирования), поэтому я перешел на C++/Qt. Я провел много времени с Qt, так как у меня не было предварительных знаний, я изучил большинство его лучших практик и все работало идеально. Все, кроме этой проблемы.

Проблема

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

Это происходит, когда я использую qextserialport, но не с pySerial.

Вот как я инициализирую порт с помощью qextserialport:

port.setName("COM3");
port.setQueryMode(QextSerialPort::EventDriven);
port.setBaudRate(BAUD115200);
port.setParity(PAR_NONE);
port.setDataBits(DATA_8);
port.setStopBits(STOP_1);
port.setFlowControl(FLOW_OFF);

и pySerial:

port = Serial('COM3', 115200)

Вопрос

Поэтому я подозреваю, что две библиотеки инициализируют порт по-разному, но у меня нет опыта последовательного программирования, и я могу ошибаться.

Кто-нибудь знает, что может быть причиной этой ошибки?


person Alex Koay    schedule 15.03.2012    source источник
comment
Скорее всего, это связано с тем, что входной буфер для последовательного порта заполняется быстрее, чем вы его читаете. Вероятно, вам нужно либо читать/проверять его быстрее или чаще, либо найти способ увеличить размер буфера. Но я не знаю, как это сделать, поэтому это комментарий, а не ответ :-P   -  person Wes Hardaker    schedule 15.03.2012


Ответы (1)


Оказывается, я ошибочно использовал QextSerialPort::bytesAvailable() вместо QextSerialPort::atEnd(). Я видел это в другом вопросе, и это помогло мне избавиться от сообщений об ошибках, которые в основном блокировали мое приложение в ожидании тайм-аута, и

Комментарий Уэса привел к решению другой моей проблемы, заключавшейся в том, что моту не хватило памяти, выделенной для хранения всех данных, что привело к потере данных.

person Alex Koay    schedule 15.03.2012