169 lines
5.7 KiB
C++
169 lines
5.7 KiB
C++
#include "serialConfigWidget.h"
|
|
#include "ui_serialConfigWidget.h"
|
|
#include <QSerialPortInfo>
|
|
#include <QMessageBox>
|
|
#include <QByteArray>
|
|
#include <QThread>
|
|
#include <QMutexLocker>
|
|
#include <QDebug>
|
|
|
|
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 s1<s2;
|
|
}else{
|
|
return s1.size()<s2.size();
|
|
} });
|
|
ui->cmbCom1->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;
|
|
}
|
|
}
|
|
}
|
|
|