serialTransferTool/serialConfigWidget.cpp

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;
}
}
}