#include "serialConfigWidget.h" #include "ui_serialConfigWidget.h" #include #include #include #include #include #include SerialConfigWidget::SerialConfigWidget(QWidget *parent) : QWidget(parent), ui(new Ui::SerialConfigWidget) { ui->setupUi(this); m_SerialPort1.connectReadEvent(this); m_SerialPort2.connectReadEvent(this); refreshCom(); connect(this,SIGNAL(displayTextSignal(QString)),this,SLOT(displayText(QString)),Qt::QueuedConnection); } SerialConfigWidget::~SerialConfigWidget() { delete ui; } void SerialConfigWidget::refreshCom() { QString currentTxt1 = ui->cmbCom1->currentText(); QString currentTxt2 = ui->cmbCom2->currentText(); QStringList nameList; foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { nameList.append(info.portName()); } std::sort(nameList.begin(), nameList.end(), [&](QString &s1, QString &s2){ if(s1.size()==s2.size()){ return s1cmbCom1->clear(); ui->cmbCom1->addItems(nameList); if(!currentTxt1.isEmpty()){ ui->cmbCom1->setCurrentText(currentTxt1); } ui->cmbCom2->clear(); ui->cmbCom2->addItems(nameList); if(!currentTxt2.isEmpty()){ ui->cmbCom2->setCurrentText(currentTxt2); } } void SerialConfigWidget::on_toolBtnRefresh_clicked() { refreshCom(); } void SerialConfigWidget::on_toolBtnOk_clicked() { if(ui->toolBtnOk->isChecked()){ QString portName1 = ui->cmbCom1->currentText(); QString baud1 = ui->cmbBaud1->currentText(); m_SerialPort1.init(portName1.toStdString().c_str(),baud1.toInt(), itas109::Parity::ParityNone,itas109::DataBits::DataBits8, itas109::StopBits::StopOne); m_SerialPort1.setReadIntervalTimeout(readIntervalTimeoutMS); if(!m_SerialPort1.open()){ QMessageBox::warning(NULL,tr("警告"),portName1 + tr("打开错误") + QString("\n\ncode: %1\nmessage: %2").arg( m_SerialPort1.getLastError()).arg(m_SerialPort1.getLastErrorMsg())); ui->toolBtnOk->setChecked(false); return ; } QString portName2 = ui->cmbCom2->currentText(); QString baud2 = ui->cmbBaud2->currentText(); m_SerialPort2.init(portName2.toStdString().c_str(),baud2.toInt(), itas109::Parity::ParityNone,itas109::DataBits::DataBits8, itas109::StopBits::StopOne); m_SerialPort2.setReadIntervalTimeout(readIntervalTimeoutMS); if(!m_SerialPort2.open()){ QMessageBox::warning(NULL,tr("警告"),portName2 + tr("打开错误") + QString("\n\ncode: %1\nmessage: %2").arg( m_SerialPort2.getLastError()).arg(m_SerialPort2.getLastErrorMsg())); m_SerialPort1.close(); ui->toolBtnOk->setChecked(false); return ; } ui->toolBtnOk->setStyleSheet("color:green"); ui->cmbCom1->setDisabled(true); ui->cmbBaud1->setDisabled(true); ui->cmbCom2->setDisabled(true); ui->cmbBaud2->setDisabled(true); ui->toolBtnRefresh->setDisabled(true); ui->toolBtnOk->setChecked(true); }else{ m_SerialPort1.close(); m_SerialPort2.close(); ui->toolBtnOk->setStyleSheet("color:balck"); ui->cmbCom1->setEnabled(true); ui->cmbBaud1->setEnabled(true); ui->cmbCom2->setEnabled(true); ui->cmbBaud2->setEnabled(true); ui->toolBtnRefresh->setEnabled(true); ui->toolBtnOk->setChecked(false); } } void SerialConfigWidget::displayText(const QString &txt) { ui->plainTextEdit->appendPlainText(txt.trimmed()); } void SerialConfigWidget::onReadEvent(const char *portName, unsigned int readBufferLen) { QMutexLocker locker(&mtx); if(portName && std::strcmp(portName,m_SerialPort1.getPortName())==0){ int recLen = 0; char * str = NULL; str = new char[readBufferLen]; if(str){ recLen = m_SerialPort1.readData(str, readBufferLen); } if(str && recLen > 0) { // TODO: 中文需要由两个字符拼接,否则显示为空"" //QString m_str = QString::fromLocal8Bit(str,recLen); //emitUpdateReceive(m_str); m_SerialPort2.writeData(str,recLen); QString txt = QString("%1:%2").arg(QString::fromLocal8Bit(portName,std::strlen(portName))).arg(QString::fromLocal8Bit(str,recLen)); emit displayTextSignal(txt); } if(str) { delete[] str; str = NULL; } }else if(portName && std::strcmp(portName,m_SerialPort2.getPortName())==0){ int recLen = 0; char * str = NULL; str = new char[readBufferLen]; if(str){ recLen = m_SerialPort2.readData(str, readBufferLen); } if(str && recLen > 0) { // TODO: 中文需要由两个字符拼接,否则显示为空"" //QString m_str = QString::fromLocal8Bit(str,recLen); //emitUpdateReceive(m_str); m_SerialPort1.writeData(str,recLen); QString txt = QString("%1:%2").arg(QString::fromLocal8Bit(portName,std::strlen(portName))).arg(QString::fromLocal8Bit(str,recLen)); emit displayTextSignal(txt); } if(str) { delete[] str; str = NULL; } } }