이 글에서는 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;
}
잘 봤습니다.