QT与C51(STC89C52RC)单片机串口通信

时间:2025-03-07 16:43:15
  • #include ""
  • #include "ui_widget.h"
  • 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());
  • }
  • }