Russian Qt Forum

Qt => Общие вопросы => Тема начата: Fjts от Июль 15, 2013, 10:50



Название: Инициализация портов
Отправлено: Fjts от Июль 15, 2013, 10:50
Не нашел раздела по железу, поэтому пишу здесь. Мне необходимо инициализировать COM-порт, причем не на передачу сообщения, а чтобы просто менять уровень на пине готовности (пин DTR). Стандартно в Си это делается так:
 COMport = CreateFile(portname.c_str(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); //инициализация порта
 EscapeCommFunction(COMport, SETDTR); //выставляем высокий уровень на пин DTR
Ну и потом еще надо закрыть порт.
Проблема в том, что в Qt так сразу не получается перенести этот код. У кого есть опыт работы с такими зверями?
 


Название: Re: Инициализация портов
Отправлено: Bepec от Июль 15, 2013, 10:56
Никто не просит вас переносить это в Qt. Делайте так, как делали. Qt - библиотека С++. А то, что вы написали, это WinApi. В чём проблема?


Название: Re: Инициализация портов
Отправлено: denka от Июль 15, 2013, 19:49
QextSerialPort ?
https://code.google.com/p/qextserialport/ (https://code.google.com/p/qextserialport/)


Название: Re: Инициализация портов
Отправлено: kuzulis от Июль 15, 2013, 20:37
http://qt-project.org/wiki/QtSerialPort

в Qt 5.1 уже есть по дефолту.


Название: Re: Инициализация портов
Отправлено: Fjts от Июль 23, 2013, 15:11
Спасибо всем за ответы. На англоязычном форуме мне предложили также отказаться от WinApi и использовать встроенные средства. Даже привели готовый код:

Код:
class MyClass : public QObject
{
public:
    explicit MyClass() {
        port = new QSerialPort(this);
        port->setPortName("COM1");
        connect(port, SIGNAL(dataTerminalReadyChanged(bool)), this, SLOT(onDtr(bool)));
 
        timer = new QTimer(this);
        timer->setSingleShot();
        connect(timer, SIGNAL(timeout()), this, SLOT(onTimer()));
    }
 
    void startPulse() {
        if (!port->open(QIODevice::ReadWrite))
            return;
 
        port->setDataTerminalReady(true);
    }
 
private slots:
    void onTimer() {
        port->setDataTerminalReady(false);
    }
 
    void onDtr(bool set) {
        if (set) {
            timer->start(50); // ~50msec :)
        } else {
            port->close();
        }
    }
 
private:
    QSerialPort *port;
    QTimer *timer;
}

Проблема в том, что предложенное решение подходит для Qt 5, где (как здесь правильно написали) есть готовый сериальный модуль. Как-то можно подключить в Qt 4.8.3 нужные библиотеки? Читал, что нужно добавлять их в файл .pro, но так и не разобрался как и какая именно мне нужна библиотека. Буду рад любой помощи.


Название: Re: Инициализация портов
Отправлено: VPS от Июль 23, 2013, 16:06
По ссылке, которую указал kuzulis написано, как собрать и использовать QtSerialPort в qt4.


Название: Re: Инициализация портов
Отправлено: kuzulis от Июль 23, 2013, 17:35
Цитата: Fjts
Даже привели готовый код:

ГыГы, Я его и привел  :D


Название: Re: Инициализация портов
Отправлено: Bepec от Июль 23, 2013, 17:38
Представлю.

Fjts - это  kuzulis, автор QtSerialPort.  ;D

kuzulis - это Fjts, один из будущих ваших поклонников  :P


Название: Re: Инициализация портов
Отправлено: Fjts от Июль 23, 2013, 22:22
Мир тесен)
У меня почему-то даже готовый пример из wiki не компиллируется. Ошибки:
qextserialenumerator.obj:-1: error: LNK2019: unresolved external symbol __imp_RegQueryValueExW referenced in function "private: static class QString __cdecl QextSerialEnumerator::getRegKeyValue(struct HKEY__ *,unsigned short const *)" (?getRegKeyValue@QextSerialEnumerator@@CA?AVQString@@PEAUHKEY__@@PEBG@Z)
..\build\qextserialportd1.dll:-1: error: LNK1120: 2 unresolved externals


Название: Re: Инициализация портов
Отправлено: kuzulis от Июль 24, 2013, 11:06
Цитировать
У меня почему-то даже готовый пример из wiki не компиллируется.
Из какой Вики? Из этой?

http://qt-project.org/wiki/QtSerialPort

Если да - то причем тут qextserialenumerator и прочие бяшки? Не, ты что-то не то используешь или ты п@ц какой невнимательный! :)
ЗЫ: Ты хоть документацию то читал, смотрел как в QtSerialPort именуются классы и пр.?  >:(


Название: Re: Инициализация портов
Отправлено: BuRn от Июль 26, 2013, 06:00
А что простите это мешает сделать без Qt ? Когда я писал драйвер для ккм работающим на ком, классы и объекты у меня не использовали какие - то невероятные функции для работы с железом .