직렬 터미널
QSerialPort 의 다양한 기능을 사용하는 방법을 보여줍니다.
터미널은 간단한 직렬 인터페이스를 위한 터미널을 만드는 방법을 보여줍니다. Qt Serial Port.
이 예제는 구성, I/O 구현 등과 같은 QSerialPort 클래스의 주요 기능을 보여줍니다. 또한 QSerialPortInfo 클래스를 호출하여 시스템에서 사용 가능한 직렬 포트에 대한 정보를 표시합니다.
QSerialPort 는 두 가지 일반적인 프로그래밍 접근 방식을 지원합니다:
- 비동기(비차단) 접근 방식. 제어가 Qt의 이벤트 루프로 돌아갈 때 작업이 예약되고 수행됩니다. QSerialPort 는 작업이 완료되면 신호를 방출합니다. 예를 들어 QSerialPort::write()는 즉시 반환됩니다. 데이터가 직렬 포트로 전송되면 QSerialPort 은 bytesWritten()을 반환합니다.
- 동기식(블로킹) 접근 방식. 비GUI 및 멀티스레드 애플리케이션에서는
waitFor...()
함수를 호출(예: QSerialPort::waitForReadyRead())하여 작업이 완료될 때까지 호출 스레드를 일시 중단할 수 있습니다.
이 예에서는 비동기 접근 방식을 보여줍니다. 차단 수신기 예제는 동기식 접근 방식을 보여줍니다.
이 예제에는 몇 가지 GUI 위젯이 포함되어 있습니다:
MainWindow
(terminal/mainwindow.cpp
) - 구성, I/O 처리 등 직렬 포트 프로그래밍을 위한 모든 작업 로직을 포함하는 메인 애플리케이션 창으로, QMainWindow를 상속합니다.Console
(terminal/console.cpp
) - 메인 창의 중앙 위젯으로, 전송 또는 수신된 데이터를 표시합니다. 이 위젯은 QPlainTextEdit 클래스에서 파생됩니다.SettingsDialog
(terminal/settingsdialog.cpp
) - 직렬 포트를 구성하고 사용 가능한 직렬 포트 및 관련 정보를 표시하는 대화상자입니다.
직렬 포트는 MainWindow
생성자에서 인스턴스화됩니다. 메인 위젯은 부모로 전달되므로 Qt의 부모와 자식 메커니즘에 따라 객체 삭제가 자동으로 이루어집니다:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MainWindow), m_serial(new QSerialPort(this)) { ...
이 예제는 다음 QSerialPort 시그널을 보여줍니다:
- readyRead() - 새 데이터가 수신되었으므로 사용할 수 있음을 나타냅니다.
- bytesWritten() - 모든 데이터가 성공적으로 쓰여졌는지 확인하는 데 사용됩니다.
... connect(m_serial, &QSerialPort::readyRead, this, &MainWindow::readData); connect(m_serial, &QSerialPort::bytesWritten, this, &MainWindow::handleBytesWritten); ... }
연결 버튼을 클릭하면 openSerialPort()
슬롯이 호출됩니다:
void MainWindow::openSerialPort() { const SettingsDialog::Settings p = m_settings->settings(); m_serial->setPortName(p.name); m_serial->setBaudRate(p.baudRate); m_serial->setDataBits(p.dataBits); m_serial->setParity(p.parity); m_serial->setStopBits(p.stopBits); m_serial->setFlowControl(p.flowControl); if (m_serial->open(QIODevice::ReadWrite)) { m_console->setEnabled(true); m_console->setLocalEchoEnabled(p.localEchoEnabled); m_ui->actionConnect->setEnabled(false); m_ui->actionDisconnect->setEnabled(true); m_ui->actionConfigure->setEnabled(false); showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6") .arg(p.name, p.stringBaudRate, p.stringDataBits, p.stringParity, p.stringStopBits, p.stringFlowControl)); } else { QMessageBox::critical(this, tr("Error"), m_serial->errorString()); showStatusMessage(tr("Open error")); } }
이 슬롯에서는 SettingsDialog
에서 설정을 읽고 그에 따라 직렬 포트를 열고 초기화하려고 시도합니다. 성공하면 상태 표시줄에 지정된 구성으로 성공적으로 열렸다는 메시지가 표시되고, 그렇지 않으면 적절한 오류 코드와 메시지가 포함된 메시지 상자가 표시됩니다. 직렬 포트 설정을 호출한 적이 없는 경우 터미널은 기본 설정으로 포트를 열려고 시도합니다: 9600 8N1.
연결 해제 버튼을 클릭하면 closeSerialPort()
슬롯이 호출됩니다:
void MainWindow::closeSerialPort() { if (m_serial->isOpen()) m_serial->close(); m_console->setEnabled(false); m_ui->actionConnect->setEnabled(true); m_ui->actionDisconnect->setEnabled(false); m_ui->actionConfigure->setEnabled(true); showStatusMessage(tr("Disconnected")); }
이 경우 직렬 포트가 닫히면서 처리됩니다.
구성 버튼을 클릭하면 SettingsDialog
위젯에 속하는 show()
슬롯이 호출됩니다.
이 방법(terminal/settingsdialog.cpp
)은 사용자가 원하는 직렬 포트를 선택하고, 선택한 포트에 대한 정보를 확인하고, 주어진 직렬 포트의 원하는 파라미터를 설정할 수 있는 SettingsDialog
을 표시합니다.
데이터 쓰기
콘솔에 문자를 입력하면 writeData()
슬롯이 호출됩니다:
void MainWindow::writeData(const QByteArray &data) { const qint64 written = m_serial->write(data); if (written == data.size()) { m_bytesToWrite += written; m_timer->start(kWriteTimeout); } else { const QString error = tr("Failed to write all data to port %1.\n" "Error: %2").arg(m_serial->portName(), m_serial->errorString()); showWriteError(error); } }
이 슬롯은 주어진 콘솔 위젯에 입력한 문자를 직렬 포트로 전송합니다( terminal/console.cpp
참조). 또한 실제로 쓰기가 성공했는지 여부를 추적하기 위해 타이머를 시작합니다. bytesWritten () 신호를 사용하여 모든 바이트가 실제로 쓰여졌는지 확인합니다. MainWindow::handleBytesWritten()
슬롯에 연결됩니다:
void MainWindow::handleBytesWritten(qint64 bytes) { m_bytesToWrite -= bytes; if (m_bytesToWrite == 0) m_timer->stop(); }
데이터 읽기
직렬 포트에 새 데이터가 수신되면 readyRead() 신호가 방출되고, 이 신호는 MainWindow::readData()
슬롯에 연결됩니다:
void MainWindow::readData() { const QByteArray data = m_serial->readAll(); m_console->putData(data); }
이 슬롯은 직렬 포트에서 데이터를 읽고 콘솔 위젯에 표시합니다.
예제 실행하기
에서 예제를 실행하려면 Qt Creator에서 Welcome 모드를 열고 Examples 에서 예제를 선택합니다. 자세한 내용은 예제 빌드 및 실행하기를 참조하세요.
수신자 차단하기를참조하세요 .
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.