|
- #include "mymainwindow.h"
- #include "ui_mymainwindow.h"
- MyMainWindow::MyMainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MyMainWindow)
- {
- ui->setupUi(this);
- //查找可用的串口
- foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
- {
- QSerialPort serial;
- serial.setPort(info);
- if(serial.open(QIODevice::ReadWrite))
- {
- ui->PortBox->addItem(serial.portName());
- serial.close();
- }
- }
- //设置波特率下拉菜单默认显示第0项
- ui->BaudBox->setCurrentIndex(0);
- //关闭发送按钮的使能
- ui->sendButton->setEnabled(false);
- qDebug() << tr("界面设定成功!");
- thread = new QThread(this);
- myThread = new MyThread;
- myThread->moveToThread(thread);
- thread->start();
- connect(ui->pushButton, &QPushButton::pressed, myThread, &MyThread::drawImage);
- connect(this, &MyMainWindow::update, thread, &MyThread::read);
- connect(this, &MyMainWindow::destroyed, this, &MyMainWindow::dealClose);
- }
复制代码
void MyMainWindow::Read_Data()
{
QByteArray buf;
buf = serial->readAll();
QDataStream out(&buf,QIODevice::ReadWrite); //将字节数组读入
while(!out.atEnd())
{
qint8 outChar = 0;
out>>outChar; //每字节填充一次,直到结束
QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));//十六进制的转换
ui->textEdit->insertPlainText(str.toUpper());//大写
ui->textEdit->insertPlainText(" ");//每发送两个字符后添加一个空格
ui->textEdit->moveCursor(QTextCursor::End);
}
emit update(buf);
}
void MyMainWindow:n_openButton_clicked()
{
if(ui->openButton->text()==tr("打开串口"))
{
serial = new QSerialPort;
//设置串口名
serial->setPortName(ui->ortBox->currentText());
//打开串口
serial->open(QIODevice::ReadWrite);
//设置波特率
serial->setBaudRate(ui->BaudBox->currentText().toInt());
//设置数据位数
switch(ui->BitNumBox->currentIndex())
{
case 8: serial->setDataBits(QSerialPort:ata8); break;
default: break;
}
//设置奇偶校验
switch(ui->arityBox->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->setFlowControl(QSerialPort::NoFlowControl);
//关闭设置菜单使能
ui->ortBox->setEnabled(false);
ui->BaudBox->setEnabled(false);
ui->BitNumBox->setEnabled(false);
ui->arityBox->setEnabled(false);
ui->StopBox->setEnabled(false);
ui->openButton->setText(tr("关闭串口"));
ui->sendButton->setEnabled(true);
//连接信号槽
QObject::connect(serial, &QSerialPort::readyRead, this, &MyMainWindow::Read_Data);
}
else
{
//关闭串口
serial->clear();
serial->close();
serial->deleteLater();
//恢复设置使能
ui->ortBox->setEnabled(true);
ui->BaudBox->setEnabled(true);
ui->BitNumBox->setEnabled(true);
ui->arityBox->setEnabled(true);
ui->StopBox->setEnabled(true);
ui->openButton->setText(tr("打开串口"));
ui->sendButton->setEnabled(false);
}
}
void MyMainWindow::dealClose()
{
//退出子线程
thread->quit();
//当子线程结束后,完成相关的资源回收工作
thread->wait();
//因为(作为子线程加载)的类没有指定父对象, 所以在这里手动回收
delete myThread;
}
|
|