시리얼 터미널
QSerialPort 의 다양한 기능을 사용하는 방법을 설명합니다.
'터미널'에서는 다음을 사용하여 간단한 시리얼 인터페이스용 터미널을 만드는 방법을 설명합니다 Qt Serial Port.

이 예제는 구성, I/O 구현 등과 같은 QSerialPort 클래스의 주요 기능을 보여줍니다. 또한, 시스템에서 사용 가능한 시리얼 포트에 대한 정보를 표시하기 위해 QSerialPortInfo 클래스가 호출됩니다.
QSerialPort 다음과 같은 두 가지 일반적인 프로그래밍 방식을 지원합니다:
- 비동기(비차단) 방식. 작업은 제어권이 Qt의 이벤트 루프로 돌아왔을 때 스케줄링되어 수행됩니다. 작업이 완료되면 ` QSerialPort `는 신호를 발생시킵니다. 예를 들어, ` QSerialPort::write()`는 즉시 반환됩니다. 데이터가 시리얼 포트로 전송되면 ` QSerialPort `는 ` bytesWritten()` 신호를 발생시킵니다.
- 동기식(블로킹) 접근 방식. 비 GUI 및 멀티스레드 애플리케이션에서는
waitFor...()함수(예: QSerialPort::waitForReadyRead())를 호출하여 작업이 완료될 때까지 호출 스레드를 일시 중지시킬 수 있습니다.
이 예제에서는 비동기식 접근 방식을 보여줍니다. ‘Blocking Receiver’ 예제는 동기식 접근 방식을 설명합니다.
이 예제에는 다음과 같은 GUI 위젯이 포함되어 있습니다:
MainWindow(terminal/mainwindow.cpp) - QMainWindow를 상속받으면서, 구성, I/O 처리 등을 포함하여 시리얼 포트 프로그래밍에 필요한 모든 작동 로직을 포함하는 메인 애플리케이션 창입니다.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);
...
}'연결(Connect )' 버튼을 클릭하면 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 에서 설정을 읽어와, 이에 따라 시리얼 포트를 열고 초기화하려고 시도합니다. 성공하면 상태 표시줄에 지정된 구성으로 포트를 성공적으로 열었다는 메시지가 표시되고, 그렇지 않으면 해당 오류 코드와 메시지가 포함된 메시지 상자가 표시됩니다. serialPortSettings가 한 번도 호출된 적이 없다면, 터미널은 기본 설정(9600 8N1)으로 포트를 열려고 시도합니다.
'연결 해제( Disconnect )' 버튼을 클릭하면 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"));
}이 경우, 시리얼 포트의 닫기 처리를 통해 처리됩니다.
'Configure' 버튼을 클릭하면 ' 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);
}
}이 슬롯은 지정된 Console 위젯에 입력된 문자를 시리얼 포트로 전송합니다( 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 에서 예제를 선택합니다. 자세한 내용은 Qt Creator 의 ‘튜토리얼: 빌드 및 실행’을 참조하십시오.
- Qt Extension for Visual Studio Code
Command Palette 에서 Qt: Open Qt examples 명령을 실행하고 목록에서 예제를 선택하십시오. 자세한 내용은 Qt Extension for Visual Studio Code: 튜토리얼: 빌드 및 실행을 참조하십시오.
‘블로킹 리시버’항목도 참조하십시오 .
© 2026 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.