1、自动连接
主要是通过开机获取所有的端口名,然后使用定时器,将每个端口都发送来连接命令,查看是否有回应
void MainWindow::GetSerialPortNames()
{
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
nameSerialPort[countPort++] = info.portName();
}
}
void MainWindow::handleTimeout()
{
if(!connectSuccess)
{
my_SerialPort->close();
//m_count是已经连接的端口数,countport是总共的端口数
if(m_count >= countPort)
{
m_pTimer->stop();
ui->label_status->setText("未连接");
QMessageBox::critical(this, tr("Error"), "打开串口失败!");
ui->Btn_Reconnect->setEnabled(true);
return;
}
ui->label_status->setText("正在连接...");
my_SerialPort->setPortName(nameSerialPort[m_count++]);
if(my_SerialPort->open(QIODevice::ReadWrite))
{
sendCommand(connectBuffer);
}
}
else
{
m_count = 0;
m_pTimer->stop();
m_tTimer->start(3000);
ui->label_status->setText("已连接");
ui->Btn_Start->setEnabled(true);
ui->Btn_Reconnect->setEnabled(false);
}
}
2、检测插拔
先设一个槽函数并关联这个函数
connect(my_SerialPort, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &MainWindow::handleSerialError);
void MainWindow::handleSerialError(QSerialPort::SerialPortError error)
{
if (error == QSerialPort::ResourceError) {
QMessageBox::critical(this, tr("Error"), "串口连接中断,请检查是否正确连接!");
my_SerialPort->close();
ui->label_status->setText("未连接");
m_pTimer->start(1000);
}
}