Я попробовал и QSerialPort
, и QExtSerialPort
, и ни один из них не может правильно поддерживать 250 КБ. QExtSerialPort
, похоже, поддерживает его, поскольку он указан в списке типов передачи данных, но всякий раз, когда я использую его для подключения к плате, все, что я получаю, - это ненужные данные, например, скорость передачи данных установлена неправильно. Я проверил все остальные настройки, и плата действительно работает более 250 000, поскольку я тестировал ее с помощью miniterm. Существуют ли какие-либо другие библиотеки или я должен попробовать что-то другое с QExtSerialPort
?
Qt: последовательная библиотека, поддерживающая скорость передачи данных 250 000 бод.
Ответы (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
.
QSerialPort
также использует только один из двух способов установки пользовательской скорости передачи данных, фактически он пропускает более простой способ сделать это, который может поддерживаться большим количеством драйверов. Он использует IOSSIOSPEED
ioctl вместо использования c_ispeed
и c_ospeed
в структуре termios
(доступной через cfsetpspeed(...)
).
- person Kuba hasn't forgotten Monica; 18.10.2013
QSerialPort
. - person Kuba hasn't forgotten Monica   schedule 18.10.2013