티스토리 뷰

프로그래밍/Qt

QSerialPort

Dev-Drake 2019. 6. 11. 14:25
반응형

1. .pro 파일
QT       += serialport

2. 통신 세팅 
    m_Serial = new QSerialPort(this);
    m_Serial->setPortName("/dev/ttyUSB0");
    m_Serial->setBaudRate(QSerialPort::Baud115200);
    m_Serial->setDataBits(QSerialPort::Data8);
    m_Serial->setParity(QSerialPort::NoParity);
    m_Serial->setStopBits(QSerialPort::OneStop);
    m_Serial->setFlowControl(QSerialPort::NoFlowControl);
    m_Serial->open(QIODevice::ReadWrite);

if(m_Serial->isOpen())  {
        // 통신역할 타이머 작동
        m_SeqTimer = new QTimer(this);
        connect(m_SeqTimer, SIGNAL(timeout()), this, SLOT(SerialComm()));
        m_SeqTimer->start(1);

        SetCommand(IC_READER_STATUS);
    }
    else
        g_Log.LogNameQString("IC_READER", "Serial Open Fail @@");

3. 수신
// 타이머에 의한 반복 실행 함수 
void SerialComm()
{
    // 우선순위에 따라
    if(m_Sequence & WAIT_DATA) {
        if(CheckTimeOver(5000, m_SendTime))    {
            UnCommand(WAIT_DATA); //  응답 없을 시  명령해제하여 전 명령으로
        }
        else    {
           // 데이터를 이곳에서 수신하여 처리한다. 
            int     i, Len;
            char    Temp[4096];

            memset(Temp, 0, sizeof(Temp));
            Len = m_Serial->bytesAvailable();

            QByteArray RcvBuffer = m_Serial->read(Len);
            memcpy(Temp, RcvBuffer.toStdString().c_str(), Len);

            for(i = 0; i < Len; i ++)   {
                m_RcvBuffer[m_RcvLen] = Temp[i];
                m_RcvLen ++;

                //  데이터를 다 받았다면
                if(m_RcvBuffer[m_RcvLen - 2] == ETX)    {
                    ReadSerialData();
                    break;
                }
            }
        }
    }
    else if(m_Sequence & STATUS) {
         // 송신 
         StatusReq();
    }
}

 

반응형

'프로그래밍 > Qt' 카테고리의 다른 글

한달 지난 로그 파일 지우기  (0) 2019.06.11
리눅스 Qt에서 utf-8 -> eucKR 변환  (0) 2019.06.11
QTcpSocket isConnected  (0) 2019.06.11
폼안에 쓰레드 호출 함수 넣기  (0) 2019.06.11
버튼으로 Edit 커서 이동  (0) 2019.06.11
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday