#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMetaEnum>
#include <QDebug>
#include <QMessageBox>
#include "iostream"
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//枚举所有有效的串口,并添加到combox
foreach (const QSerialPortInfo &info ,QSerialPortInfo::availablePorts())
{
ui->PortBox->addItem(info.portName());
}
//枚举所有的波特率
QMetaEnum emBr = QMetaEnum::fromType<QSerialPort::BaudRate>();
for(int i = 0; i < emBr.keyCount(); i++)
if(emBr.value(i)!=-1)
ui->BaudBox->addItem(QString::asprintf("%d",emBr.value(i)));
//枚举所有数据位
QMetaEnum emDB = QMetaEnum::fromType<QSerialPort::DataBits>();
for(int i = 0; i < emBr.keyCount(); i++)
if(emDB.value(i)!=-1)
ui->BitNumBox ->addItem(QString::asprintf("%d",emDB.value(i)));
//枚举所有校验位
QMetaEnum emPr = QMetaEnum::fromType<QSerialPort::Parity>();
for(int i = 0; i < emPr.keyCount(); i++)
if(emPr.value(i)!=-1)
ui->ParityBox ->addItem(QString::asprintf("%d",emPr.value(i)));
//枚举所有停止位
QMetaEnum emSTP = QMetaEnum::fromType<QSerialPort::StopBits>();
for(int i = 0; i < emSTP.keyCount(); i++)
if(emSTP.value(i)!=-1)
ui->StopBox->addItem(QString::asprintf("%d",emSTP.value(i)));
//设置常用选项
ui->BaudBox->setCurrentIndex(3);
ui->BitNumBox->setCurrentIndex(3);
}
MainWindow::~MainWindow()
{
delete ui;
serial->close();
}
void MainWindow::on_openButton_clicked()
{
qDebug()<< ui->openButton->text().at(6);
if(ui->openButton->text().at(6)=='O')
{
ui->openButton->setText("关闭串口[&C]");
QMessageBox::information(this,"info","serial port open done!");
ui->statusBar->showMessage("串口已经打开!");
serial = new QSerialPort;
//设置串口名
serial->setPortName(ui->PortBox->currentText());
//打开串口
serial->open(QIODevice::ReadWrite);
//设置波特率
serial->setBaudRate(ui->BaudBox->currentText().toInt());
//设置数据位数
switch(ui->BitNumBox->currentIndex())
{
case 8: serial->setDataBits(QSerialPort::Data8); break;
default: break;
}
//设置奇偶校验
switch(ui->ParityBox->currentIndex())
{
case 0: serial->setParity(QSerialPort::NoParity); break;
default: break;
}
//设置停止位
switch(ui->StopBox->currentIndex())
{
case 1: serial->setStopBits(QSerialPort::OneStop); break;
case 2: serial->setStopBits(QSerialPort::TwoStop); break;
default: break;
}
//链接串口serial的读取触发函数与Read_Data
QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
}
else
{
ui->openButton->setText("打开串口[&O]");
QMessageBox::information(this,"info","serial port close done!");
ui->statusBar->showMessage("串口已经关闭!");
serial->close();
}
}
void MainWindow::on_sendButton_clicked()
{
if(serial->isOpen())
serial->write(ui->textEdit_2->toPlainText().toLatin1());
else
QMessageBox::information(this,"infor","串口没有打开!");
cout<<"test done!";
}
void MainWindow::on_clearButton_clicked()
{
ui->textEdit->clear();
}
void MainWindow:: Read_Data()
{
QByteArray buf;
buf = serial->readAll();
if(!buf.isEmpty())
{
QString str = ui->textEdit->toPlainText();
str+=tr(buf);
ui->textEdit->clear();
ui->textEdit->append(str);
}
buf.clear();
}