Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QStringList serialNamePort;
serialPort = new QSerialPort(this);
for(const QSerialPortInfo &info : QSerialPortInfo::availablePorts())
{
serialNamePort << info.portName();
}
ui->serialCb->addItems(serialNamePort);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_SerialPort_Read()
{
qDebug() << "有数据";
timer.start(100);
}
void Widget::serialPortReadyRead_slot()
{
qDebug() << "进入定时器";
timer.stop();
QByteArray buf;
buf = serialPort->readAll();
qDebug() << buf;
if(!buf.isEmpty())
{
QString str = "";
if(ui->hexRB->isChecked())
{
for(int i = 0; i < buf.length(); i++)
{
QString byteStr = QString::number(static_cast<uchar>(buf[i]), 16);
if(byteStr.length() == 1)
{
str += "0" + byteStr;
}
else
{
str += byteStr;
}
}
}
else
{
str = buf;
}
ui->outputEdit->appendPlainText(str);
}
buf.clear();
}
void Widget::on_openBt_clicked()
{
if(ui->openBt->text() == tr("打开串口"))
{
QSerialPort::BaudRate baudRate;
QSerialPort::DataBits dataBits;
QSerialPort::StopBits stopBits;
QSerialPort::Parity chechBits;
//波特率
if(ui->baudrateCb->currentText() == "4800")
{
baudRate = QSerialPort::Baud4800;
}
else if(ui->baudrateCb->currentText() == "9600")
{
baudRate = QSerialPort::Baud9600;
}
else if(ui->baudrateCb->currentText() == "115200")
{
baudRate = QSerialPort::Baud115200;
}
//数据位
if(ui->dataCb->currentText() == "5")
{
dataBits = QSerialPort::Data5;
}
else if(ui->dataCb->currentText() == "6")
{
dataBits = QSerialPort::Data6;
}
else if(ui->dataCb->currentText() == "7")
{
dataBits = QSerialPort::Data7;
}
else if(ui->dataCb->currentText() == "8")
{
dataBits = QSerialPort::Data8;
}
//停止位
if(ui->stopCb->currentText() == "1")
{
stopBits = QSerialPort::OneStop;
}
else if(ui->stopCb->currentText() == "1.5")
{
stopBits = QSerialPort::OneAndHalfStop;
}
else if(ui->stopCb->currentText() == "2")
{
stopBits = QSerialPort::TwoStop;
}
//校验位
chechBits = QSerialPort::NoParity;
serialPort->setPortName(ui->serialCb->currentText());
serialPort->setBaudRate(baudRate);
serialPort->setDataBits(dataBits);
serialPort->setStopBits(stopBits);
serialPort->setParity(chechBits);
if(serialPort->open(QIODevice::ReadWrite) == true)
{
QMessageBox::information(this, "提示", "打开成功");
serialPort->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制
ui->serialCb->setEnabled(false);
ui->dataCb->setEnabled(false);
ui->baudrateCb->setEnabled(false);
ui->stopCb->setEnabled(false);
ui->checkCb->setEnabled(false);
ui->hexRB->setEnabled(false);
ui->txtRB->setEnabled(false);
ui->openBt->setText(tr("关闭串口"));
}
else
{
QMessageBox::warning(this, "提示", "打开失败");
}
}
else
{
serialPort->close();
QMessageBox::information(this, "提示", "关闭成功");
ui->serialCb->setEnabled(true);
ui->dataCb->setEnabled(true);
ui->baudrateCb->setEnabled(true);
ui->stopCb->setEnabled(true);
ui->checkCb->setEnabled(true);
ui->hexRB->setEnabled(true);
ui->txtRB->setEnabled(true);
ui->openBt->setText(tr("打开串口"));
}
connect(serialPort, &QSerialPort::readyRead, this, &Widget::on_SerialPort_Read);
connect(&timer,SIGNAL(timeout()), this, SLOT(serialPortReadyRead_slot()));
}
void Widget::on_clearBt_clicked()
{
ui->outputEdit->clear();
}
void Widget::on_sendBt_clicked()
{
QString str = ui->inputEdit->text();
if(ui->hexRB->isChecked())
{
QByteArray arr;
for(int i = 0; i < str.size(); i++)
{
int num = str.mid(i,2).toUInt(nullptr,16);
i++;
arr.append(num);
}
serialPort->write(arr);
}
else
{
serialPort->write(str.toLatin1());
}
}