한국어
Qt
 

이 글에서는 Qt SerialPort를 사용해서 라즈베리파이3와 PC(윈도우10)간 시리얼(Serial)통신을 설명한다. Qt SerialPort모듈은 시리얼 통신을 쉽게 할 수 있도록 일련의 편의기능들을 제공한다.

 

다음 운영체제에서 모든 기능을 사용할 수 있으며 비공식적으로 안드로이드 장치에서도 사용할 수 있다.

Windows XP/Vista/7/8/10

Gnu/Linux

MacOSX

 

라즈베리파이3는 욕토(yocto)프로젝트를 이용한 Qt 및 임베디드 리눅스 환경이다. (먼저 간단한 테스트를 통해 시리얼통신이 가능한지 확인한다.)

 

Qt SerialPort 모듈을 이용하려면 Qt프로젝트 파일에 다음과 같이 명시 해줘야한다.

QT += serialport

 

소스코드에는 다음과 같이 헤더파일을 include 해준다.

#include <QSerialPort>

 

QSerialPortInfo 클래스는 사용 가능한 시리얼 포트에 대한 정보를 제공한다.

#include <QSerialPortInfo>

 

라즈베리파이3에서는 QSerialPort클래스의 인스턴스를 생성하고 시리얼 장치와 속도를 설정한다.

m_serialPort = new QSerialPort();
m_serialPort->setPortName("/dev/ttyAMA0");
m_serialPort->setBaudRate(QSerialPort::Baud115200);

 

그리고 수신된 데이터가 있으면 발생하는 QSerialPort::readyRead 시그널을 슬롯에 연결하여 수신된 데이터를 읽을 수 있다. 예를 들면 다음과 같다.

connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead);

 

수신된 데이터를 읽는 슬롯 함수를 구현한다.

void SerialPortReader::handleReadyRead(){
    m_serialPort->readAll();
}

 

open을 호출하여 시리얼 장치를 연다.

if(m_serialPort->open(QIODevice::ReadWrite) == false)
    qDebug() << m_serialPort->errorString();

 

 

PC에서는 COMx장치를 사용할 수 있어야한다.

m_serialPort = new QSerialPort();
m_serialPort->setPortName("COM3");
m_serialPort->setBaudRate(QSerialPort::Baud115200);

 

PC에서 라즈베리파이에 데이터를 전송하기위해 write를 사용한다.

m_serialPort->write(QByteArray());

 

다음은 QString을 QByteArray로 변환하여 전송하거나,

m_serialPort->write(QString("makersweb.net").toLocal8Bit());

 

다음과 같은 구조체처럼 약속된 형태를

struct Format{
    unsigned char data1 : 1;
    unsigned char data2 : 1;
    unsigned char data3 : 1;
    unsigned char data4 : 1;
    unsigned char data5 : 1;
    unsigned char data6 : 1;
    unsigned char data7 : 1;
    unsigned char data8 : 1;
};

 

char * 타입으로 변환하여 데이터를 전송하는 방법이 될 수도있다.

void sendData(){
    Format *data = new Format;

    data->data1 = 1;
    data->data2 = 0;
    data->data3 = 0;
    data->data4 = 0;

    data->data5 = 1;
    data->data6 = 1;
    data->data7 = 1;
    data->data8 = 1;

    auto packet = reinterpret_cast<char*>(data);

    // send
    m_serialPort->write(packet, sizeof (Format));

    // delete
    delete data;
}

 

번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 86156
179 z-order 를 컨트롤 하기위한 방법 makersweb 2015.05.13 6593
178 Qml 사용자 ScrollBar 구현 file makersweb 2015.07.24 6233
177 QQuickImageProvider 를 이용한 Qml 에서 이미지 표시 makersweb 2015.10.18 6005
176 Qt의 시그널 슬롯 시스템 file makersweb 2015.10.20 23655
175 Qt의 스레드간 시그널 슬롯의 커넥션타입 [1] makersweb 2015.10.24 10211
174 Qt 프로그래밍의 시작 makersweb 2015.10.25 14402
173 QtConcurrent를 이용하여 쓰레드를 만드는 방법과 MapReduce file makersweb 2016.01.24 9478
172 Ubuntu Linux에서 Qt Creator 설치 file makersweb 2016.03.06 10680
171 멀티 스레드환경, 스레드에 안전한 이벤트처리 makersweb 2016.10.27 5044
170 QString 문자열에서 숫자만 추출해서 QString으로 반환 makersweb 2017.01.10 3078
169 Qt Logging Rule, Qt 프레임워크 로그 출력 makersweb 2017.01.13 3713
168 타임스탬프( timestamp) 유닉스 시간 makersweb 2017.10.19 1626
167 QPA 플러그인과 EGLFS file makersweb 2017.11.21 3936
166 QML에서 undefined를 확인하는 방법 makersweb 2017.11.29 1488
165 임의의 메모리 영역(QImage)에 QPainter를 이용하여 그리기 file makersweb 2017.12.19 3456
164 QPA 플러그인과 HTML5 Backend file makersweb 2017.12.27 809
163 Qt 3D Studio 시작하기 file makersweb 2018.01.11 3830
162 Qt 어플리에이션 전역에 폰트 설정 makersweb 2018.01.24 5619
161 다국어 지원 어플리케이션 개발 file makersweb 2018.01.27 2984
160 Windows환경에서 mingw로 Qt 5.10 정적(static)빌드 file makersweb 2018.02.01 5707