0

我正在使用 QT 执行应用程序,以通过 rs-232 将我的 PC 与 8 位微控制器通信。我正在使用 QtSerialPort 库并且通信工作正常,但是每次我从 PC 写东西到 micro 并收到响应时,我必须关闭并打开串行端口,否则我无法继续通信.. 我的配置为: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);

}
4

2 回答 2

0

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

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

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

于 2014-02-16T16:19:22.583 回答
0

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

端口->打开(QIODevice::ReadWrite | QIODevice::Unbuffered)

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

于 2014-02-02T15:28:35.803 回答