【问题标题】:Unable to communicate with arduino using QSerialPort if the arduino-ide has not opened the connection before如果 arduino-ide 之前没有打开连接,则无法使用 QSerialPort 与 arduino 通信
【发布时间】:2014-06-05 13:37:17
【问题描述】:

我正在使用以下代码打开一个串口与arduino通信。

  const qint32 baud = Global::getInstance().getSettings().value("Hardware/baudRate", 115200).toInt();
  const QString portName = Global::getInstance().getSettings().value("Hardware/port", "COM3").toString();
  port.setPortName(portName);

  if(!port.open(QIODevice::ReadWrite))
  {
    qFatal("Unable to open serial port");
    exit(1); 
  }
  if(!port.setParity(QSerialPort::NoParity) ||
     !port.setStopBits(QSerialPort::OneStop) ||
     !port.setDataBits(QSerialPort::Data8) ||
     !port.setFlowControl(QSerialPort::NoFlowControl ) ||
     !port.setBaudRate(baud))
  {
     qFatal("Unable to configure serial port");
     exit(1); 
  }
  if(port.error() != QSerialPort::NoError)
  {
    qFatal("some error occurred!");
    exit(1);
  }

之后我尝试使用以下代码从连接中读取:

bool Light::waitForReady()
{
  char data[1];
  data[0] = -1;
  if(port.waitForReadyRead(10000))
  {
    const int numRead = port.read(&data[0], 1);
    if(numRead == 1)
    {
      return data[0] == (char)RDY;
    }
    else
    {
      qWarning("Read error, read %d bytes", numRead);
    }
  }
  else
  {
    qWarning("Read timeout");
    return false;
  }
  return false;
}

读取工作,等待 10 秒后超时。 但是,当我在运行我的 QT 代码之前打开和关闭 arduino-ide 内的串行监视器时,它可以工作。我的猜测是 ardunio-ide 对我缺少的端口做了一些事情,但据我所知,我使用与 arduino-ide 完全相同的设置来打开串行端口。

这是在 arduino 上运行的代码:

void setup() 
{
  Serial.begin(115200);
  Serial.write(RDY);
}

This 小伙也遇到过类似的问题,他对比了putty和QSerialPort的串口设置。他发现fDtrControlfOutXfIutX 的设置不同。我尝试更改fDtrControl,但没有效果。我不知道如何使用QT设置fOutXfIutX

任何想法可能导致此错误?

编辑: 解决方案:port.setDataTerminalReady(true) 丢失

【问题讨论】:

  • 嗨阿恩。您使用的是哪个 QtSerialPort 版本?是 Qt 4.8.5 和自定义构建,还是 5.2.1 二进制包?另外,如果您使用 5.3 beta 或 master 的代码,您会更轻松,因为您可以在打开之前设置端口。
  • @LaszloPapp 我正在使用 Qt 5.2.0 附带的 QtSerialPort(二进制包)
  • 你的失败测试逻辑是错误的。而不是if (!a && !b && !c),它应该是if (!a || !b || !c)
  • @ArneBöckmann:命令行示例(同步或异步)是否适用于阅读?
  • @KubaOber Ops,谢谢。然而,这并没有改变问题:)

标签: c++ qt arduino arduino-ide qtserialport


【解决方案1】:

我不知道如何使用 QT 设置 fOutX 和 fIutX。

请阅读我的答案在here

还要确信 Putty(或您的 arduino 终端)配置(奇偶校验、流量控制、波特率)与 QSerialPort 配置相同。此外,您可以尝试终端示例(来自 QtSerialPort 示例),例如而不是 Putty(或您的 arduino 终端)。

更新:

您可以尝试添加:

setDataTerminalReady(true);

setRequestToSend(true);

开港后

【讨论】:

  • 您还没有阅读 OP 在 cmets 中写的内容,是吗? OP已经提到他尝试了这些例子。顺便说一句,终端示例是测试的最差示例。记住这一点。此外,如果您认为其他地方的答案令人满意,请在标记重复问题方面获得足够的声誉。答案不是处理重复问题的正确方法。使用重复标记系统只需要一点声誉。
  • > OP 已经提到他尝试了这些示例。在哪里? > 顺便说一下,终端示例是最差的测试示例。拉斯洛,请停止你的猜想
  • 这不是“猜想”,而是来自编写简单示例的贡献者以及团队中至少另一个以相同方式思考的贡献者的某种“权威”回答。我们编写命令行示例是因为它们最简单,因此测试问题的效率最高。终端示例是所有小部件世界继承的遗留物。它是臃肿的,在进行更改时不断未经测试,等等。没有人真正关心它。管道中有一个 QML 示例,但必须等待。即使这样,cli 示例也很简约。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多