#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { m_serialPort = new QSerialPort(); ui->setupUi(this); } MainWindow::~MainWindow() { if (m_serialPort->isOpen()) { m_serialPort->clear(); m_serialPort->close(); qDebug() << "exiting, clear and close serial port..."; } delete m_serialPort; delete ui; } void MainWindow::msgBox(QWidget* ctx, QString title, QString content) { QMessageBox::information(ctx, title, content); } void MainWindow::msgBox(QWidget* ctx, QString content) { msgBox(ctx, "title", content); } void MainWindow::receiveData() { QByteArray data = m_serialPort->readAll(); qDebug() << "\nreceived data:" << data.length() << data.toHex(); } void MainWindow::on_btn_serial_search_clicked() { QStringList m_serialPortNameList; foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { m_serialPortNameList << info.portName(); qDebug() << "Serial port discovered:" << info.portName(); } ui->comboBox_serial->clear(); ui->comboBox_serial->addItems(m_serialPortNameList); if (m_serialPortNameList.length() > 0) { ui->comboBox_serial->setCurrentIndex(0); } } void MainWindow::on_btn_serial_toggle_clicked() { if (ui->comboBox_serial->currentText() == "") { msgBox(this, "请选择串口"); return; } if (m_serialPort->isOpen()) { m_serialPort->clear(); m_serialPort->close(); qDebug() << "Serial port closed"; ui->btn_serial_toggle->setText("打开串口"); // enable serial port comboBoxes ui->comboBox_serial->setDisabled(false); ui->comboBox_baud->setDisabled(false); ui->btn_serial_search->setDisabled(false); } else { // m_serialPort->setPortName("/dev/" + ui->comboBox_serial->currentText()); m_serialPort->setPortName(ui->comboBox_serial->currentText()); if (!m_serialPort->open(QIODevice::ReadWrite)) { msgBox(this, "串口打开失败", "串口被占用或不存在"); qDebug() << "Serial open failed"; return; } qDebug() << "Serial open successful"; ui->btn_serial_toggle->setText("关闭串口"); // handle baud rate QSerialPort::BaudRate t_BaudRate; switch (ui->comboBox_baud->currentIndex()) { case 0: t_BaudRate = QSerialPort::Baud2400; break; case 1: t_BaudRate = QSerialPort::Baud4800; break; case 2: t_BaudRate = QSerialPort::Baud9600; break; case 3: t_BaudRate = QSerialPort::Baud115200; break; default: t_BaudRate = QSerialPort::Baud9600; break; } // serial port configuration m_serialPort->setBaudRate(t_BaudRate); m_serialPort->setDataBits(QSerialPort::Data8); m_serialPort->setFlowControl(QSerialPort::NoFlowControl); m_serialPort->setParity(QSerialPort::NoParity); m_serialPort->setStopBits(QSerialPort::OneStop); connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(receiveData())); // disable serial port comboBoxes ui->comboBox_serial->setDisabled(true); ui->comboBox_baud->setDisabled(true); ui->btn_serial_search->setDisabled(true); } } void MainWindow::on_comboBox_sys_mode_currentIndexChanged(int index) { static char buff = 0xff; switch (index) { case 0: buff = CTRL_CODE_SYSMODE_Disable; break; case 1: buff = CTRL_CODE_SYSMODE_Telemetry; break; case 2: buff = CTRL_CODE_SYSMODE_Security; break; } if (!m_serialPort->isOpen()) { msgBox(this, "未连接设备"); return; } m_serialPort->write(&buff, sizeof(buff)); } void MainWindow::on_comboBox_cycle_currentIndexChanged(int index) { static char buff = 0xff; switch (index) { case 0: buff = CTRL_CODE_CYCLE_500ms; break; case 1: buff = CTRL_CODE_CYCLE_1s; break; case 2: buff = CTRL_CODE_CYCLE_2s; break; case 3: buff = CTRL_CODE_CYCLE_5s; break; } if (!m_serialPort->isOpen()) { msgBox(this, "未连接设备"); return; } m_serialPort->write(&buff, sizeof(buff)); } void MainWindow::on_comboBox_temp_fetch_currentIndexChanged(int index) { static char buff = 0xff; switch (index) { case 0: buff = CTRL_CODE_TEMP_Disable; break; case 1: buff = CTRL_CODE_TEMP_Enable; break; } if (!m_serialPort->isOpen()) { msgBox(this, "未连接设备"); return; } m_serialPort->write(&buff, sizeof(buff)); } void MainWindow::on_comboBox_body_fetch_currentIndexChanged(int index) { static char buff = 0xff; switch (index) { case 0: buff = CTRL_CODE_BODY_Disable; break; case 1: buff = CTRL_CODE_BODY_Buzzer; break; case 2: buff = CTRL_CODE_BODY_Light; break; } if (!m_serialPort->isOpen()) { msgBox(this, "未连接设备"); return; } m_serialPort->write(&buff, sizeof(buff)); } void MainWindow::on_comboBox_gas_fetch_currentIndexChanged(int index) { static char buff = 0xff; switch (index) { case 0: buff = CTRL_CODE_GAS_Disable; break; case 1: buff = CTRL_CODE_GAS_State; break; case 2: buff = CTRL_CODE_GAS_Data; break; } if (!m_serialPort->isOpen()) { msgBox(this, "未连接设备"); return; } m_serialPort->write(&buff, sizeof(buff)); }