Установление опций QSerialPort аналогичный boost::asio::serial_port::set_option();

340
05 января 2017, 06:34

Хочу портировать некий проект, работающий с ком-портом, написанный в boost'e на Qt

В этом проекте они пустили на устройстве самописный драйвер и для установления опций там (кроме всего прочего) вызывается boost::asio::serial_port::set_option() с параметром объекта класса, который пользуется данными из некоего бинарного файла, который сотворил автор этого драйвера.

На вопрос, есть ли альтернатива в виде "отдельных" опций, записанному в этом файле, автор драйвера отвечает, что единственный способ установить опции, это прочитать этот его файл.

И вот моя задача использовать данные из этого файла в классе QSerialPort

В QSerialPort, для установлений его опций есть только функции типа setЧтоНибудь, но не нашел аналога такой интересной функции буста, как boost::asio::serial_port::set_option(SettableSerialPortOption). Это такая template'ная функция, в котору надо вставить объект класса, который содержит функцию вида store(termios &storage, boost::system::error_code &ec) const;

Есть идеи как это осуществить?

Вот, например, что делает store() оригинального проекта:

boost::system::error_code
DataFrameSocketSAS::SASParityAlternative::store(termios &storage, boost::system::error_code &ec) const
{
    ec = boost::system::error_code();
    bool error = false;
    std::ifstream termios_in(TermiosSettingsFilename.c_str(), std::ifstream::binary);
    if (!termios_in)
    {
        error = true;
        ec = boost::system::error_code(boost::system::errc::no_such_file_or_directory, boost::system::generic_category());
    }
    if (!error)
    {
        termios_in.seekg(0, termios_in.end);
        int size = termios_in.tellg();
        termios_in.seekg(0, termios_in.beg);
        if (size != sizeof(termios))
        {
            error = true;
            ec = boost::system::error_code(boost::system::errc::invalid_argument, boost::system::generic_category());
        }
        if (!error)
        {
            termios_in.read(reinterpret_cast<char*>(&storage), sizeof(storage));
            if (!termios_in)
                ec = boost::system::error_code(boost::system::errc::io_error, boost::system::generic_category());
        }
        termios_in.close();
    }
    return ec;
}

(TermiosSettingsFilename.c_str(), как вы понимаете - имя "авторского" файла) Ссылки:

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/basic_serial_port/get_option.html

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/basic_serial_port/set_option.html

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/SettableSerialPortOption.html

P.S. Нашел, что можно использовать handle(): https://bugreports.qt.io/browse/QTBUG-38812

Хочу теперь получить хэндл и использовать tcsetattr чтобы установить опции через termios. Если получится, тут отчитаюсь

READ ALSO
Как подключить OpenGL в Qt Creator?

Как подключить OpenGL в Qt Creator?

Создал приложение Qt Widgets, создал класс для рисования, который называется MainScene, в этом классе переопределил три метода базового класса QGLWidget:...

410
Нетривиальная сортировка

Нетривиальная сортировка

Есть таблица, пусть для "синтетического" примера - просто таблица целых чиселЧисла могут повторяться и не могут принимать значение NULL

382
Выбор чисел Фибоначчи

Выбор чисел Фибоначчи

Задача не практическаяХочется оценить, какими подходами ее можно решить на SQL'ях разных диалектов (PostgreSQL, SQLite3, MySQL)

330
Ошибка в реализации метода Симпсона

Ошибка в реализации метода Симпсона

Может заголовок вопроса и не совсем правильный, извинитеСуть в том, что я пытаюсь реализовать нахождение определённого интеграла (используя...

299