使用QT的串行端口的外部行为

extrange behavior of serial port using Qt

本文关键字:外部 串行端口 QT 使用      更新时间:2023-10-16

我正在用QT执行一个应用程序,以通过RS-232与8位微控制器传达PC。我正在使用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);
}

我刚刚发现自己的情况完全相同。我陷入了读取的例程中。尝试以无封闭模式打开端口。

port-> open(qiodevice :: dardwrite | qiodevice :: unboffered)

那只是在我发现的一台计算机上,我从来没有这样做,但它可能会让您摆脱困境。

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

对于问题NUM 1(每次我想交流时打开和关闭端口),我刚刚在写作方法中添加了一个waitfobyteswritten()。

对于我的问题num 2,(我只能与port22一起使用),我修改了配置,现在我首先检测到wich端口可用可用ports(),而是强迫我要使用的端口。现在我可以将设备连接到任何自由端口,并且可以工作。