Qt: последовательная библиотека, поддерживающая скорость передачи данных 250 000 бод.

Я попробовал и QSerialPort, и QExtSerialPort, и ни один из них не может правильно поддерживать 250 КБ. QExtSerialPort, похоже, поддерживает его, поскольку он указан в списке типов передачи данных, но всякий раз, когда я использую его для подключения к плате, все, что я получаю, - это ненужные данные, например, скорость передачи данных установлена ​​неправильно. Я проверил все остальные настройки, и плата действительно работает более 250 000, поскольку я тестировал ее с помощью miniterm. Существуют ли какие-либо другие библиотеки или я должен попробовать что-то другое с QExtSerialPort?


person Nicholas Smith    schedule 17.10.2013    source источник
comment
Вы уверены, что говорите о Минитерм, а не о Миникоме или о чем-то другом? Miniterm — это вспомогательное приложение для OS/X, само по себе его использовать нельзя. Если вы про Миником, то я могу посмотреть его исходники и сравнить с QSerialPort.   -  person Kuba hasn't forgotten Monica    schedule 18.10.2013
comment
Ах, извините, я должен был быть более точным, это miniterm.py.   -  person Nicholas Smith    schedule 19.10.2013
comment
Можете ли вы сообщить мне, где именно вы скачали свой miniterm.py и какая у него версия? Кажется, там есть множество копий.   -  person Kuba hasn't forgotten Monica    schedule 21.10.2013


Ответы (1)


Я предполагаю, что ваша платформа должна быть Linux, так как в Windows есть только один способ установить скорость передачи данных, и если он не работает, то он не будет работать для всех.

Есть проблема с округлением. QSerialPort код просто делит базовые часы генератора бода на вашу скорость передачи. Это целочисленное деление и делается с усечением. Если какая-либо скорость передачи данных, которую вы выберете, точно не поддерживается оборудованием, усечение может сместить ее в недопустимом направлении - мог быть более близкий делитель, который больше, а не меньше. Вы должны проверить базовую частоту генератора и соответственно выбрать скорость передачи.

Существует множество способов установки скорости передачи в Linux. QSerialPort не поддерживает два метода из трех в приведенном ответе. Таким образом, он не будет поддерживать некоторые драйверы, которые поддерживают только два из трех методов. Я не знаю навскидку, сколько водителей может страдать от этой проблемы - в конце концов, это может быть отвлекающим маневром.

Пожалуйста, поделитесь, какой именно драйвер используется для вашего устройства в Linux и какая версия ядра. Я могу посмотреть и проверить, не вызовет ли этот драйвер проблемы с текущим кодом QSerialPort.

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

// This must be at the very top of the .cpp file
#define private public
#include <QSerialPort>
#include "private/qserialport_p.h"
#include "private/qserialport_unix_p.h"
#undef private

QSerialPort * port;
...
// after the port was opened
int baudBase = port->d_ptr->currentSerialInfo.baud_base;

В файле .pro нужно QT += core-private, а это для Qt 5. Для Qt 4 нужно иметь Qt с доступными исходниками.

Настоящее исправление, конечно же, относится к QSerialPort. Я ничего не знаю о QExtSerialPort.

person Kuba hasn't forgotten Monica    schedule 18.10.2013
comment
Я попробую сегодня. Он отлично работает, если плата имеет скорость передачи данных 115 КБ, но 200 КБ просто не подходят, так что, по крайней мере, есть вариант резервного копирования. - person Nicholas Smith; 18.10.2013
comment
Только одну вещь, которую я забыл упомянуть, это кроссплатформенное приложение, поэтому я пытался использовать QSerialPort Qt, чтобы немного его абстрагировать. В настоящее время собираю его на OS X. - person Nicholas Smith; 18.10.2013
comment
В OS X код QSerialPort также использует только один из двух способов установки пользовательской скорости передачи данных, фактически он пропускает более простой способ сделать это, который может поддерживаться большим количеством драйверов. Он использует IOSSIOSPEED ioctl вместо использования c_ispeed и c_ospeed в структуре termios (доступной через cfsetpspeed(...)). - person Kuba hasn't forgotten Monica; 18.10.2013
comment
да, он отлично работает с Miniterm и подключением более 250 тыс. Я думаю, что это FTDI, аппаратное обеспечение не является моей областью опыта. - person Nicholas Smith; 18.10.2013
comment
@ Куба Обер: можете ли вы рассказать, как этого добиться с помощью Qt5.5, поскольку qserialport_unix_p.h недоступен для Mac. - person steffenmauch; 03.03.2016
comment
@steffenmauch Зачем вам это нужно? - person Kuba hasn't forgotten Monica; 03.03.2016
comment
Что ж, мое приложение отлично работает в Windows с FT232R. Прямо сейчас я попробовал это с Mac, и там он работает только с 115200 вместо 2000000. Он использует QT5.5 в Mac OS X 10.11. - person steffenmauch; 03.03.2016