QT 5.2在Windows 7上串口写入存在问题

3

我们在硬件中使用了FTDI串口芯片。现在我们已经在Linux上有工作代码,并且我们转移到了Windows 7。我们遇到了一些奇怪的问题。

问题: 我们无法在没有运行其他控制台应用程序的情况下向串口写入数据:

 serial.setPortName("COM3");
        if (serial.open(QIODevice::ReadWrite)) {
            bool success = serial.setBaudRate(QSerialPort::Baud9600) &
            serial.setStopBits(QSerialPort::OneStop) &
            serial.setDataBits(QSerialPort::Data8) &
            serial.setParity(QSerialPort::NoParity) &
            serial.setFlowControl(QSerialPort::NoFlowControl);
            qDebug() << "Connected to usb device: " << (success ? "OK" : "FAIL");

           while(true) {
                if(serial.waitForReadyRead(-1)) {
                    QByteArray out = serial.readAll();
                    for(int i=0; i< out.length(); i++) {
                        qDebug() << (int) out[i];
                    }
                }
            }
            serial.close();

所以这只是一个带有“读取全部”的循环。硬件没有发送任何内容,因此读取只是无限循环。在关闭并运行我们的写入程序后,它可以正确运行。
char* input;
input = new char[size+3];
QByteArray bytearr;

for(int i=0;i<size+2;i++) {
    input[i] = (char) package[i];
    bytearr.append((unsigned char) package[i]);
}


QString serialPortName = "COM3";
QSerialPort serialPort;
serialPort.setPortName(serialPortName);
serialPort.open(QIODevice::ReadWrite);
serialPort.write(bytearr);
serialPort.flush();
serialPort.close();

运行 read 后一切正常,但没有运行 read all 就无法工作。我们做错了什么吗? 谢谢。


2
另外,您使用了“&”而不是“&&”。在这种特殊情况下,它可能适用于布尔值,但请注意,您正在执行按位与运算,而不是逻辑运算。 - László Papp
我尝试使用新的函数来写入数据,但不知何故,在未读取端口之前无法进行写入。 - user257980
当我将读取部分重复两次时,问题消失了。我在第一次尝试中遇到以下错误:“void __thiscall QSerialPortPrivate::detectDefaultSettings(void): Unexpected flow control settings”。 - user257980
那不是错误,只是一个警告。 - László Papp
很明显,你没有为写操作设置端口,它必须像读取一样被设置。请设置。此外,在任何地方都不要忽略错误检查。 - László Papp
显示剩余6条评论
2个回答

2

我们的应用程序中也出现了类似问题,使用带有FTDI芯片的板子。我们尝试以19200波特率写入字节,实际上只有大约1200波特率(通过示波器观察)。问题在于在写入字节后立即关闭串口。在关闭端口之前等待QThread::msleep(5)就可以解决问题。似乎在关闭操作期间设备会进行重置或其他操作,最新的字节会以错误的波特率和其他参数发送。


1
我发现QT串口软件需要处理QT事件才能正常工作。在读取之前,在循环中放置qApp->processEvents()使其对我起作用。(在Windows-7上使用QT 4.8.5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接