QT串口编程 - 终端示例(Terminal)
终端显示了如何使用Qt串行端口为简单的串行接口创建终端。
此示例显示了QSerialPort
类的主要功能,例如配置,I / O实现等。同样,将调用类QSerialPortInfo
来显示有关系统中可用串行端口的信息。
QSerialPort
支持两种通用的编程方法:
异步(非阻塞)方法。当控件返回到Qt的事件循环时,将调度并执行操作。操作完成后,QSerialPort
会发出信号。例如,QSerialPort :: write()
立即返回。当数据发送到串行端口时,QSerialPort发出bytesWritten()
。
同步(阻塞)方法。在非GUI和多线程应用程序中,可以调用waitFor ...()
函数(即QSerialPort :: waitForReadyRead()
)来挂起调用线程,直到操作完成为止。
在此示例中,演示了异步方法。 Blocking Slave示例说明了同步方法。
我们的示例包含一些GUI小部件:
MainWindow-是主应用程序窗口,其中包含继承QMainWindow
时串行端口编程的所有工作逻辑,包括配置,I / O处理等。
控制台-是主窗口的中央窗口小部件,显示已发送或已接收的数据。该小部件是从QPlainTextEdit
类派生的。
SettingsDialog
是用于配置串行端口以及显示可用串行端口和有关它们的信息的对话框。
串行端口在MainWindow构造函数中实例化。主窗口小部件作为父级传递,因此根据Qt中的父级和子级机制自动删除对象:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
...
serial = new QSerialPort(this);
在此示例中调用的唯一QSerialPort信号是readyRead(),它表明已接收到新数据并因此可用:
...
connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData);
...
}
单击“连接”按钮将调用openSerialPort()
插槽:
void MainWindow::openSerialPort()
{
SettingsDialog::Settings p = settings->settings();
serial->setPortName(p.name);
serial->setBaudRate(p.baudRate);
serial->setDataBits(p.dataBits);
serial->setParity(p.parity);
serial->setStopBits(p.stopBits);
serial->setFlowControl(p.flowControl);
if (serial->open(QIODevice::ReadWrite)) {
console->setEnabled(true);
console->setLocalEchoEnabled(p.localEchoEnabled);
ui->actionConnect->setEnabled(false);
ui->actionDisconnect->setEnabled(true);
ui->actionConfigure->setEnabled(false);
showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6")
.arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits)
.arg(p.stringParity).arg(p.stringStopBits).arg(p.stringFlowControl));
} else {
QMessageBox::critical(this, tr("Error"), serial->errorString());
showStatusMessage(tr("Open error"));
}
}
在此插槽中,从SettingsDialog中读取设置,并尝试相应地打开和初始化串行端口。 如果成功,状态栏将显示一条消息,说明已成功打开给定配置。 否则,将显示一个消息框,其中包含相应的错误代码和消息。 如果从未调用过串行端口设置“ SettingsDialog”,则终端会尝试使用默认设置打开端口:9600 8N1。
单击“断开连接”按钮将调用closeSerialPort()插槽:
void MainWindow::closeSerialPort()
{
if (serial->isOpen())
serial->close();
console->setEnabled(false);
ui->actionConnect->setEnabled(true);
ui->actionDisconnect->setEnabled(false);
ui->actionConfigure->setEnabled(true);
showStatusMessage(tr("Disconnected"));
}
在这种情况下,由关闭串行端口处理。
在控制台中键入字符将调用writeData()插槽:
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
}
该插槽将在给定的控制台小部件中键入的字符发送到串行端口。
当串行端口接收到新数据时,将发出信号readyRead(),并将该信号连接到MainWindow :: readData()插槽:
void MainWindow::readData()
{
QByteArray data = serial->readAll();
console->putData(data);
}
该插槽从串行端口读取数据,并将其显示在控制台窗口小部件中。
单击“配置”按钮将调用属于SettingsDialog小部件的show()插槽。
此方法显示“设置对话框”,用户可以在其中选择所需的串行端口,查看有关所选端口的信息,并设置给定串行端口的所需参数。