2010년 5월 19일 수요일

QextSerialPort

qt로 RS-232(시리얼) 프로그램을 하려면 소스포지(http://sourceforge.net/projects/qextserialport/)에서
QextSerialPort
QextSerialPort 라이브러리를 다운 받는 것이 편하다.
하지만 윈도우에서 그 소스를 그대로 사용했는데 심각한 버그가 있었다.
데이터 값이 올바로 전달되지 않는 것이다.
하지만 하이퍼터미널을 이용해서 포트를 열었다가 닫으면 그때부터는 정상적으로 동작한다.
이 버그로 이틀 정도 고생을 했다.
나의 경우는 EventDriven 으로만 사용했기 때문에 Polling 으로 사용하면 정상적으로 동작할지는 모르겠다.

이것 저것 해보다 우연히 그 원인을 찾았다.
초기 설정을 올바로 해주지 못하는 문제였다.

보통이라면 QextSerialPort 를 이렇게 사용하면 되고, 예제에서도 이렇게 되어있다.

    QextSerialPort * port;
    serialport = new QextSerialPort(setup.value("serialport", "COM1").toString(), pset, QextSerialPort::EventDriven);
    setup.endGroup();
    serialport->setBaudRate(BAUD9600);
    serialport->setFlowControl(FLOW_HARDWARE);
    serialport->setParity(PAR_NONE);
    serialport->setDataBits(DATA_8);
    serialport->setStopBits(STOP_1);
    serialport->setTimeout(500);
    if(!serialport->open(QIODevice::ReadWrite))
    {
        QMessageBox::warning(this, trUtf8("serial connection"), trUtf8("serial connection failed"));
        return;
    }

하지만 올바로 동작하려면 open 이후에 다음을 넣어줘야 한다.

    serialport->setBaudRate(BAUD9600);
    serialport->setDataBits(DATA_8);
    serialport->setStopBits(STOP_1);

아마도 이전에 설정했던 값은 open 할 때 영향을 미치지 못하는 것 같다.