使用Qt的串口奇怪的行为

时间:2014-02-01 17:23:12

标签: c++ qt serial-port microcontroller qtserialport

我正在使用QT执行应用程序,通过rs-232与8位微控制器通信我的PC。我正在使用QtSerialPort库并且通信工作正常,但每次我从PC上写一些内容并且我收到响应时,我必须关闭并打开串口或者我无法继续通信..我的配置为:10500 bps,8位,1停,无奇偶校验,无流量控制。

用于配置和端口讲座/写入的代码是下一个:

bool DriverS::configure(int port, int baudRate)
{
    if(port!=22)
        return false;

     serialPort->setPortName("COM22");

 if (serialPort->open(QIODevice::ReadWrite)==true){

        if (!serialPort->setBaudRate(baudRate)) {
            return false ;
        }

        if (!serialPort->setDataBits(QSerialPort::Data8)) {
            return false ;
        }

        if (!serialPort->setParity(QSerialPort::NoParity)) {
            return false;
        }

        if (!serialPort->setStopBits(QSerialPort::OneStop)) {
            return false;
        }

        if (!serialPort->setFlowControl(QSerialPort::NoFlowControl)){
            return false;
            }
    };

    return true;
}



bool DriverS::read(QByteArray & rxData, int * size)
{

    Sleep(200); 
    *size = 0;
    if (serialPort->waitForReadyRead(TIMEOUT_SERIAL)) {
        rxData = serialPort->readAll();
        *size = rxData.size() ;

    if (!this->checkCRC(rxData))
        {
            qDebug()<< "Rx Checksum Error";
            return false;
        }

    return true;
    }
    qDebug()<< "Rx Timeout";
    return false;
}

bool DriverS::write(QByteArray txData)
{

    unsigned int chk = 0;
    int ret ;

    for(int i = 0;i<txData.size();i++)
    {
        chk+=txData.at(i);
    }

    txData.append(chk);
    ret = serialPort->write(txData);
    return (txData.size()==ret);

}

2 个答案:

答案 0 :(得分:0)

我发现自己处于完全相同的情况。我被困在阅读程序中。尝试以无缓冲模式打开端口。

port-&gt; open(QIODevice :: ReadWrite | QIODevice :: Unbuffered)

我只是在一台计算机上发现了这个,我以前从来没有这么做过,但它可能会让你走出困境。

答案 1 :(得分:0)

我解决了我的两个问题(尽管我不确定这些方法)。

对于问题num 1(每次我想要通信时打开和关闭端口)我只是在我的write方法中添加了waitFoBytesWritten()。

对于我的问题num 2,(我只能使用port22),我已经修改了配置,现在我首先检测可用的端口与availablePorts(),而不是强制我想要使用的端口。现在我可以将我的设备连接到任何免费端口,它可以工作..