diff --git a/main_window.cpp b/main_window.cpp index ad4cba5..33d6669 100755 --- a/main_window.cpp +++ b/main_window.cpp @@ -11,6 +11,9 @@ #include #include #include +#include +#include +#include static bool check_exist(QString str) { for (auto &port: QSerialPortInfo::availablePorts()) { @@ -20,25 +23,67 @@ static bool check_exist(QString str) { return false; } +void main_window::config_enable(bool ena) { + portsComboBox->setEnabled(ena); + stopbitsComboBox->setEnabled(ena); + baudLineEdit->setEnabled(ena); + dataBitsComboBox->setEnabled(ena); + tmpFilenameEdit->setEnabled(ena); + portUpdBtn->setEnabled(ena); + if (ena) { + portOpenBtn->setText("open"), is_open = false; + if (receivefile.isOpen()) + receivefile.close(); + } + else { + portOpenBtn->setText("close"), is_open = true; + auto filename = tmpFilenameEdit->text(); + receivefile.setFileName(filename); + receivefile.open(QIODevice::Append); + } + +} + void main_window::setUiComponent() { this->ui = new Ui::MainWindow; ui->setupUi(this); portsComboBox = ui->portsComboBox; - hexTextEdit = ui->hexTextEdit; + stopbitsComboBox = ui->stopbitsComboBox; + baudLineEdit = ui->baudLineEdit; + dataBitsComboBox = ui->dataBitsComboBox; tmpFilenameEdit = ui->tmpFilenameEdit; + + hexTextEdit = ui->hexTextEdit; + asciiTextEdit = ui->asciiTextEdit; portOpenBtn = ui->portOpenBtn; - portsComboBox = ui->portsComboBox; portUpdBtn = ui->portUpdBtn; statusbar = ui->statusbar; - stopbitsComboBox = ui->stopbitsComboBox; - asciiTextEdit = ui->asciiTextEdit; QObject::connect(portOpenBtn, SIGNAL(clicked()), this, SLOT(open_port())); QObject::connect(portUpdBtn, SIGNAL(clicked()), this, SLOT(update_ui_port())); } +void main_window::port_error_handler(QSerialPort::SerialPortError err) { + switch (err) { + case QSerialPort::NoError: + break; + case QSerialPort::DeviceNotFoundError: + case QSerialPort::PermissionError: + case QSerialPort::OpenError: + case QSerialPort::WriteError: + case QSerialPort::ReadError: + case QSerialPort::ResourceError: + case QSerialPort::UnsupportedOperationError: + case QSerialPort::UnknownError: + case QSerialPort::TimeoutError: + case QSerialPort::NotOpenError: + this->config_enable(true); + } +} + main_window::main_window(QWidget *parent) : QMainWindow(parent) { setUiComponent(); QObject::connect(&port, SIGNAL(readyRead()), this, SLOT(read_data())); + QObject::connect(&port, &QSerialPort::errorOccurred, this, &main_window::port_error_handler); QFont font("Courier"); hexTextEdit->setFont(font); QSerialPortInfo info; @@ -67,19 +112,11 @@ void main_window::update_ui_port() { } void main_window::open_port() { - if (is_open) { + if (port.isOpen()) { port.close(); - QFile file; - auto filename = tmpFilenameEdit->text(); - file.setFileName(filename); - file.open(QIODevice::Append); - auto val = hexTextEdit->toPlainText(); - hexTextEdit->clear(); - file.write(val.toUtf8()); - file.close(); - is_open = false; - portOpenBtn->setText("open"); - return; + config_enable(true); + statusbar->showMessage("close port success"); + return ; } if (portsComboBox->count() == 0) { return; } auto cur_port = portsComboBox->currentText(); @@ -90,23 +127,21 @@ void main_window::open_port() { else if (stopbits == QString("1.5")) port.setStopBits(QSerialPort::OneAndHalfStop); else if (stopbits == QString("2")) port.setStopBits(QSerialPort::TwoStop); else { - QMessageBox box; - box.setText("wrong stopbits settings"); - box.exec(); + box.setText("wrong stopbits settings"), box.exec(); return; } - // TODO: read info from config port.setBaudRate(115200); port.setDataBits(QSerialPort::Data8); port.setParity(QSerialPort::NoParity); port.setFlowControl(QSerialPort::NoFlowControl); if (port.open(QIODevice::ReadWrite)) { - is_open = true; - portOpenBtn->setText("close"); + + config_enable(false); statusbar->showMessage("open port success"); - } else - is_open = false; + } else { + config_enable(true); + } } @@ -124,23 +159,14 @@ void main_window::read_data() { QString new_text = QString(data.toHex(' ').toUpper()) + " "; hexTextEdit->moveCursor(QTextCursor::End); hexTextEdit->insertPlainText(new_text); - if (cnt > 1e3) { - QFile file; - auto filename = tmpFilenameEdit->text(); - file.setFileName(filename); - file.open(QIODevice::Append); - auto val = hexTextEdit->toPlainText(); + auto val = hexTextEdit->toPlainText(); + receivefile.write(val.toUtf8()); + if (hexTextEdit->toPlainText().length() > 1e3){ hexTextEdit->clear(); asciiTextEdit->clear(); - file.write(val.toUtf8()); - file.close(); - cnt = 0; } } -#include -#include -#include void main_window::update_chart() { // TODO: memory leakage diff --git a/main_window.h b/main_window.h index 5b5e5b5..9073319 100755 --- a/main_window.h +++ b/main_window.h @@ -7,7 +7,9 @@ #include "ui_main.h" #include +#include #include +#include class main_window : public QMainWindow { Q_OBJECT @@ -20,6 +22,7 @@ private: Ui::MainWindow *ui; bool is_open = false; QSerialPort port; + QFile receivefile; QWidget *centralwidget; QHBoxLayout *horizontalLayout; @@ -43,6 +46,8 @@ private: QMenuBar *menubar; QStatusBar *statusbar; + QMessageBox box; + private: void setUiComponent(); @@ -56,6 +61,10 @@ public slots: void update_chart(); + + void port_error_handler(QSerialPort::SerialPortError err); + + void config_enable(bool ena); };