【问题标题】:qt 5.2 serial port write issues with windows 7qt 5.2 串口写入问题与 windows 7
【发布时间】:2014-02-05 07:53:49
【问题描述】:

我们在硬件中使用 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,它将无法工作。我们做错了什么? 谢谢。

【问题讨论】:

  • 您有一个写应用程序(用标准 C posix 编写)和一个 QtSerialPort 阅读器?是这样吗?您要迁移到 Windows 的哪个部分?你得到“OK”还是“FAIL”?此外,您也永远不会离开永远的 while 循环......因为没有中断或转到......为什么不检查设置的返回值以查看它们是否成功?如果我是你,首先要做的就是确保这是正确的。另外,您的代码不完整,请修改。另外,您是否尝试过从 git 运行同步编写器和读取器示例?
  • 另外,您使用了“&”而不是“&&”。它可能在这种特殊情况下使用布尔值起作用,但请注意,您正在执行按位与,而不是逻辑。
  • 是的,它是 C posix 和 QtSerialPort 供读者使用。两个不同的控制台应用程序。按位我正在尝试这样做,所以一个 & 和是好的。
  • 我尝试使用此示例进行调试 qt-project.org/doc/qt-5/qtserialport-cwritersync-main-cpp.html,但我得到 Access denied for write
  • 请显示您获得的整个输出,包括您尝试运行的命令。另外,您是否以管理员身份尝试过以防万一?

标签: c++ windows qt ftdi qtserialport


【解决方案1】:

我发现QT串口软件需要你处理QT事件才能工作。 在读取之前将 qApp->processEvents() 放入循环中使其对我有用。

(Windows-7 上的 QT 4.8.5)

【讨论】:

    【解决方案2】:

    我们在使用带有 FTDI 芯片的电路板的应用程序中遇到了类似的问题。我们尝试以 19200 波特/秒写入字节,但实际上大约 1200 波特/秒(使用示波器看到)。问题是在写入一个字节后立即关闭串行端口。在关闭端口之前等待使用 QThread::msleep(5) 会有所帮助。看来,设备在关闭操作期间得到了重置或其他东西,并且最新的字节以错误的波特率和其他参数发送。

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多