Russian Qt Forum
Декабрь 18, 2024, 08:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Инициализация портов  (Прочитано 7268 раз)
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 так сразу не получается перенести этот код. У кого есть опыт работы с такими зверями?
 
Записан
Bepec
Гость
« Ответ #1 : Июль 15, 2013, 10:56 »

Никто не просит вас переносить это в Qt. Делайте так, как делали. Qt - библиотека С++. А то, что вы написали, это WinApi. В чём проблема?
Записан
denka
Гость
« Ответ #2 : Июль 15, 2013, 19:49 »

QextSerialPort ?
https://code.google.com/p/qextserialport/
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Июль 15, 2013, 20:37 »

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

в Qt 5.1 уже есть по дефолту.
Записан

ArchLinux x86_64 / Win10 64 bit
Fjts
Гость
« Ответ #4 : Июль 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, но так и не разобрался как и какая именно мне нужна библиотека. Буду рад любой помощи.
Записан
VPS
Гость
« Ответ #5 : Июль 23, 2013, 16:06 »

По ссылке, которую указал kuzulis написано, как собрать и использовать QtSerialPort в qt4.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Июль 23, 2013, 17:35 »

Цитата: Fjts
Даже привели готовый код:

ГыГы, Я его и привел  Веселый
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #7 : Июль 23, 2013, 17:38 »

Представлю.

Fjts - это  kuzulis, автор QtSerialPort.  Смеющийся

kuzulis - это Fjts, один из будущих ваших поклонников  Показает язык
Записан
Fjts
Гость
« Ответ #8 : Июль 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
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Июль 24, 2013, 11:06 »

Цитировать
У меня почему-то даже готовый пример из wiki не компиллируется.
Из какой Вики? Из этой?

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

Если да - то причем тут qextserialenumerator и прочие бяшки? Не, ты что-то не то используешь или ты п@ц какой невнимательный! Улыбающийся
ЗЫ: Ты хоть документацию то читал, смотрел как в QtSerialPort именуются классы и пр.?  Злой
« Последнее редактирование: Июль 24, 2013, 11:08 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
BuRn
Гость
« Ответ #10 : Июль 26, 2013, 06:00 »

А что простите это мешает сделать без Qt ? Когда я писал драйвер для ккм работающим на ком, классы и объекты у меня не использовали какие - то невероятные функции для работы с железом .
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 22.