1.在CMakeList.txt后加入SerialPort
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets SerialPort)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets SerialPort)
target_link_libraries(03_SerialPort PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt6::SerialPort)
2.设置槽函数
private slots:
void on_openPortBtn_released();
void on_sendBtn_released();
void onReadyRead();
void on_sendFileBtn_released();
void on_openFileBtn_released();
void on_hexDisplayChx_toggled(bool checked);
void on_timerSendChx_toggled(bool checked);
void on_sendStopBtn_released();
void on_servoleft_released();
void on_servoright_released();
void on_clearRecbBtn_released();
void on_pushButton_released();
void on_sendClearBtn_released();
3.在头文件建立好头文件后在cpp文将各个槽函数用处置入
void QMainwindow::init()
{
//获取所有可用的串口
auto portsInfo =QSerialPortInfo::availablePorts();
for(auto& info : portsInfo)
{
qInfo() << info.description() << info.portName()<<info.systemLocation();
ui->portsCmd->addItem(info.portName() +":" + info.description(),info.portName());
}
//获取标准的波特率
auto baudRates = QSerialPortInfo::standardBaudRates();
for(auto br : baudRates)
{
ui->baudrateCmd->addItem(QString::number(br),br);
}
ui->baudrateCmd->setCurrentText("9600");
//设置停止位
ui->stopBitsCmd->addItem("1",QSerialPort::OneStop);
ui->stopBitsCmd->addItem("1.5",QSerialPort::OneAndHalfStop);
ui->stopBitsCmd->addItem("2",QSerialPort::TwoStop);
//设置数据位
ui->dataCmd->addItem("5",QSerialPort::Data5);
ui->dataCmd->addItem("6",QSerialPort::Data6);
ui->dataCmd->addItem("7",QSerialPort::Data7);
ui->dataCmd->addItem("8",QSerialPort::Data8);
ui->dataCmd->setCurrentText("8");
//设置校验位
ui->parityCmd->addItem("None",QSerialPort::NoParity);
ui->parityCmd->addItem("Even",QSerialPort::EvenParity);
ui->parityCmd->addItem("Odd",QSerialPort::OddParity);
connect(&serialport,&QSerialPort::readyRead,this,&QMainwindow::onReadyRead);
timer.callOnTimeout([=]
{
this->on_sendBtn_released();
});
//设置改变
connect(ui->baudrateCmd,&QComboBox::currentIndexChanged,this,[=]
{
auto br = ui->baudrateCmd->currentData().value<QSerialPort::BaudRate>();
if(!serialport.setBaudRate(br))
{
QMessageBox::warning(this,"false","设置波特率失败:"+serialport.errorString());
}
});
connect(ui->dataCmd,&QComboBox::currentIndexChanged,this,[=]
{
auto value = ui->dataCmd->currentData().value<QSerialPort::DataBits>();
if(!serialport.setDataBits(value))
{
QMessageBox::warning(this,"false","设置数据位失败:"+serialport.errorString());
}
});
connect(ui->stopBitsCmd,&QComboBox::currentIndexChanged,this,[=]
{
auto value = ui->stopBitsCmd->currentData().value<QSerialPort::StopBits>();
if(!serialport.setStopBits(value))
{
QMessageBox::warning(this,"false","设置停止位失败:"+serialport.errorString());
}
});
connect(ui->parityCmd,&QComboBox::currentIndexChanged,this,[=]
{
auto value = ui->parityCmd->currentData().value<QSerialPort::Parity>();
if(!serialport.setParity(value))
{
QMessageBox::warning(this,"false","设置校验位失败:"+serialport.errorString());
}
});
}
void QMainwindow::on_openPortBtn_released()
{
//串口是否已经被打开
if(serialport.isOpen())
{
serialport.close();
ui->openPortBtn->setText("打开串口");
if(timer.isActive())
timer.stop();
return;
}
//获取串口名
auto portName = ui->portsCmd->currentData().toString();
//获取波特率
auto baudRate = ui->baudrateCmd->currentData().value<QSerialPort::BaudRate>();
//获取数据位
auto dataBits =ui->dataCmd->currentData().value<QSerialPort::DataBits>();
//获取停止位
auto stopBits = ui->stopBitsCmd->currentData().value<QSerialPort::StopBits>();
//获取校验位
auto parity = ui->parityCmd->currentData().value<QSerialPort::Parity>();
serialport.setPortName(portName);
serialport.setBaudRate(baudRate);
serialport.setDataBits(dataBits);
serialport.setStopBits(stopBits);
serialport.setParity(parity);
//打开串口
if(!serialport.open(QIODevice::ReadWrite))
{
QMessageBox::warning(this,"warning",portName +" "+"open failed:"+ serialport.errorString());
return;
}
else
{
ui->openPortBtn->setText("关闭串口");
}
}
void QMainwindow::on_sendBtn_released()
{
auto datastr = ui->sendEdit->toPlainText() + (ui->sendNewLineChx->isChecked() ? "\r\n":"");
serialport.write(datastr.toLocal8Bit());
}
void QMainwindow::onReadyRead()
{
auto data = serialport.readAll();
auto datastr = QString::fromLocal8Bit(data);
if(ui->hexDisplayChx->isChecked()){
ui->recvEdit->appendPlainText(datastr.toLocal8Bit().toHex(' ').toUpper());
}else{
ui->recvEdit->appendPlainText(datastr);
}
}
void QMainwindow::on_openFileBtn_released()
{
auto filename = QFileDialog::getOpenFileName(this,"选择文件",QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),
"txt(*.txt);;all(*.*)");
if(!filename.isEmpty())
{
ui->fileNameEdit->setText(filename);
}
}
void QMainwindow::on_sendFileBtn_released()
{
auto filename = ui->fileNameEdit->text();
QFile file(filename);
if(file.open(QIODevice::ReadOnly))
{
QMessageBox::warning(this,"warning",filename + "open failed:"+ file.errorString());
return;
}
//这个地方需要判断一下是什么编码
serialport.write(QString::fromLocal8Bit(file.readAll()).toLocal8Bit());
if(ui->fileNameEdit->text().isEmpty())
{
QMessageBox::warning(this,"warning","错误 你并没有选择文件");
}
}
void QMainwindow::on_hexDisplayChx_toggled(bool checked)
{
if(checked)
displayHex();
else
displayText();
}
void QMainwindow::displayHex()
{
//先把数据拿出来
auto datastr = ui->recvEdit->toPlainText();
//转成十六进制
auto hexdata = datastr.toLocal8Bit().toHex(' ').toUpper();
//写回去
ui->recvEdit->setPlainText(hexdata);
}
void QMainwindow::displayText()
{
//先把数据拿出来
auto datastr = ui->recvEdit->toPlainText();
//转成文本
auto textdata =QString::fromLocal8Bit(datastr.toLocal8Bit());
//写回去
ui->recvEdit->appendPlainText(textdata);
}
void QMainwindow::on_timerSendChx_toggled(bool checked)
{
if(checked)
{
timer.start(ui->timerperiodEdit->text().toUInt());
ui->timerperiodEdit->setEnabled(false);
}
else
{
timer.stop();
ui->timerperiodEdit->setEnabled(true);
}
}
void QMainwindow::on_sendStopBtn_released()
{
serialport.clear();
if(timer.isActive())
timer.stop();
}
void QMainwindow::on_servoleft_released()
{
ui->sendEdit->clear();
QString text = "1";
ui->sendEdit->appendPlainText(text);
}
void QMainwindow::on_servoright_released()
{
ui->sendEdit->clear();
QString text = "0";
ui->sendEdit->appendPlainText(text);
}
void QMainwindow::on_clearRecbBtn_released()
{
ui->recvEdit->clear();
}
void QMainwindow::on_pushButton_released()
{
ui->portsCmd->clear();
auto portsInfo =QSerialPortInfo::availablePorts();
for(auto& info : portsInfo)
{
qInfo() << info.description() << info.portName()<<info.systemLocation();
ui->portsCmd->addItem(info.portName() +":" + info.description(),info.portName());
}
}
void QMainwindow::on_sendClearBtn_released()
{
ui->sendEdit->clear();
}
4.ui设计(基于ATK_XCOM)加了舵机0,1操作