На всякий случай может кому пригодится. Требуется написать простую программку отправляющую байты по юарту, C# не тру, поэтому выбор пал на Qt Creator.
Все просто и примеров куча, а ничего не работает. После Visual C# не привычно чуть менее чем полностью. В общем наковырял, работает, проверено.
Непосредственно для работы с портом нужно включить либу, было много разных мнений что то докачивать, доустанавливать шаманскими методами, в итоге оказалось все в комплекте из коробки, достаточно подцепить инклуд
#include <QtSerialPort/QSerialPort> |
Аналогично для получения информации о количестве доступных портов
#include <QtSerialPort/QSerialPortInfo> |
Единственное шаманское, что нужно сделать — в файл с расширением .pro нужно добавить
greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets serialport } else { include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) } |
Далее там где это необходимо открываем порт для чтения
serial.Open(QSerialPort::WriteOnly); |
Настраиваем нужные скорости и прочие плюшки
serial.setBaudRate(QSerialPort::Baud2400); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); |
Доступные варианты настроек удобнее смотреть нажатием Ctrl+Space, когда начинаешь что то печатать
Для отправки байта
serial.putChar(0xEA); |
Для отправки нескольких байт
serial.write("hello"); |
Для того чтобы определить какое то действие для кнопки, щелкаем правой кнопкой мыши по ней в редакторе-перейти к слоту. В слотах выбираем то что нужно, если это щелчок мыши, то ищем clicked();. Далее в основном коде появляется обработчик нечто вроде void MainWindow::on_pushButton_2_clicked()
Небольшой пример:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QString> QSerialPort serial; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //read avaible comports foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) ui->comboBox->addItem(info.portName()); } MainWindow::~MainWindow() { delete ui; } //button send void MainWindow::on_pushButton_clicked() { //string for lineedit text QString str2 = ui->lineEdit->text(); serial.write(str2.toUtf8()); } //connect void MainWindow::on_pushButton_2_clicked() { //select name for our serial port from combobox if (serial.portName() != ui->comboBox->currentText()) { serial.close(); serial.setPortName(ui->comboBox->currentText()); } //setup COM port serial.setBaudRate(QSerialPort::Baud2400); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); serial.open(QSerialPort::WriteOnly); } void MainWindow::on_pushButton_3_clicked() { //close serial.close(); } |
Проблема в кодировке, очевидно
Странно. У меня все идёт нормально.
Спасибо всем за помощь !!!!Проекти работают!!!а как кодировать??? з чем ето связано??
Скинь скриншот экрана с вопросами.
куда скинуть?? здесь немогу прикрепить скриншот!!
Ну хоть на Яндекс, а сюда ссылку.
киньте почту !!!! я всьо скину на почту!!
alex@avrki.ru
Приложение работает! Спасибо!
Подскажите пожалуйста, как Вы пользуетесь Tera Term одновременно с работой программы?
tera term и qt сидят на разных ком портах, соединены виртуальным мостом com0com
Вы не могли бы выложить весь проект, QT поставил (4.8 — под XP новая что-то не ставится) библиотеку поставил вот отсюда -x, все поставилось , прилагаемые к библиотеке тестовые примеры собираются, Ваш чего-то никак. Никак не могу понять в чем дело 👿
Да в прилагаемых к библиотеке примерах, все вроде также но… 🙂
Библиотека идет в комплекте с QT, поэтому ничего ставить дополнительно не нужно.
Не, в 4.8 она ставится отдельно, это в пятой она интегрирована. Поэтому и проблемы-) Вроде встала и собралась, но часть примеров не работает вот я и пытаюсь разобраться в чем дело-)))
как проявляется то что не работает?
Не собираются сонсольнве примеры, а в Вашем что-то типа — G:\Qt\Projects\com__\mainwindow.cpp:20: error: undefined reference to `_imp___ZN15QSerialPortInfo14availablePortsEv’ говорит, хотя оконные собираются и работают.
У меня сложилось пока мнение , что ей не нравится как у Вас объявлен (или где) экземпляр serial.
Конкретно ошибки горят на
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
ui->comboBox->addItem(info.portName());
и на
QSerialPort serial;
если проекты собираются значит проблема не в либе. это в pro файл добавлено?
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets serialport
} else {
include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf)
}
сравните pro файл примера со своим
Пробовал и так, и писать полный путь к файлу- ни шиша-((( Видимо придется копать глубжее-)
Попробовал последний раз на удачу, добавил как написано тут — » x » CONFIG += serialport
LIBS += -lserialport
на LIBS говорит нет файла — выбросил, оставил только строчку с CONFIG и , о чудо! — собралось и заработало…. С тоской вспоминаю питон))))
на всякий случай рабочий файл —
»
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets serialport
} else {
include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf)
}
TARGET = com__
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
CONFIG += serialport
«
Спасибо!
Да, с этой строчкой CONFIG += serialport в pro файле заработали и консольные примеры. Нда… неужели такие танцы на qt всегда(((((
это только начало 🙂 беда в том что альтернативы этому нет
Щас только вспомнил-) но вроде есть эклипс, может быть с тех пор как я его видал в последний раз и что-нибудь изменилось, но тогда он мне показался еще сложнее- пробовал кажется си++ на контроллерах — настройка и установка на целую страницу.
Может под винду он и ничего…
возможно, не ковырял