#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { m_serialPort = new QSerialPort(); ui->setupUi(this); ui->lcdNumber_temp->setDigitCount(8); initFigure(); } 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 msg = m_serialPort->readAll(); qDebug() << "\nreceived data:" << msg.count() << msg.toHex(); uint16_t LSB, MSB; int count = 0; if (msg.count() % 2 == 0) { count = msg.count() / 2; for (int i = 0; i < count; i ++) { MSB = ((uchar) msg.at(2 * i)) << 8; LSB = (uchar) msg.at(2 * i + 1); uint16_t tmp = MSB + LSB; uchar t_cmd = tmp >> 12; uint16_t t_data = tmp & 0xFFF; qDebug() << "CMD: " << t_cmd << " DATA: " << t_data; if (t_cmd == MCU_CMD_TEMP) { processTempData(t_data); } if (t_cmd == MCU_CMD_BODY) { processBodyData(t_data); } if (t_cmd == MCU_CMD_GAS_STATE) { processGasState(t_data); } if (t_cmd == MCU_CMD_GAS_DATA) { processGasData(t_data); } } } else { qDebug() << "\n [!] invalid command received"; } } void MainWindow::initFigure() { m_chart = new QChart; m_chart->adjustSize(); m_chartView = new QChartView(m_chart); m_chartView->adjustSize(); m_series = new QLineSeries; m_chart->addSeries(m_series); axisX = new QValueAxis; axisX->setRange(0, 200); axisX->setLabelFormat("%g"); axisX->setTitleText("采样时刻"); axisY = new QValueAxis; axisY->setRange(0, 50); axisY->setTitleText(tr("温度值")); m_chart->setAxisX(axisX, m_series); m_chart->setAxisY(axisY, m_series); m_chart->legend()->hide(); m_chart->setTitle(tr("实时温度采集数据")); } void MainWindow::processTempData(uint data) { static uchar s_flag = 0; float computed = 0.0; if (data > 0x800) { computed = (0xFFF - data) * (-0.0625); } else { computed = data * 0.0625; } ui->lcdNumber_temp->display(computed); if (s_flag == 0) { m_maxTemp = computed; m_minTemp = computed; s_flag = 1; ui->label_max_temp->setText(tr("最高温度: %1 ℃").arg(m_maxTemp)); ui->label_min_temp->setText(tr("最低温度: %1 ℃").arg(m_minTemp)); } if (computed > m_maxTemp + 0.1) { m_maxTemp = computed; ui->label_max_temp->setText(tr("最高温度: %1 ℃").arg(m_maxTemp)); } if (computed < m_minTemp - 0.1) { m_minTemp = computed; ui->label_max_temp->setText(tr("最低温度: %1 ℃").arg(m_minTemp)); } QVector newPoints; QVector oldPoints = m_series->pointsVector(); if (oldPoints.count() <= (_DISPLAY_DATA_LENGTH_ - 1)) { oldPoints.append(QPointF(oldPoints.count(), computed)); m_series->replace(oldPoints); } else { for (int i = 0; i < (_DISPLAY_DATA_LENGTH_ - 1); i ++) { newPoints.append(QPointF(i, oldPoints.at(i + 1).y())); } newPoints.append(QPointF(newPoints.count(), computed)); m_series->replace(newPoints); } } void MainWindow::processBodyData(uint data) { } void MainWindow::processGasState(uint data) { } void MainWindow::processGasData(uint data) { } 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)); } void MainWindow::on_pushButton_temp_details_clicked() { myDialog *dialog = new myDialog(); dialog->myWidget->addWidget(m_chartView); dialog->exec(); }