c++ - 如果 arduino-ide 之前没有打开连接,则无法使用 QSerialPort 与 arduino 通信

标签 c++ qt arduino arduino-ide qtserialport

我正在使用以下代码打开串口与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 guy有过类似的问题,他比较了putty和QSerialPort的串口设置。他发现 fDtrControlfOutXfIutX 的设置不同。我尝试更改 fDtrControl 但没有效果。我不知道如何使用 QT 设置 fOutXfIutX

有什么想法可能导致此错误吗?

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

最佳答案

I do not know how to set fOutX and fIutX using QT.

请阅读我的答案在 here 中.

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

更新:

你可以尝试添加:

setDataTerminalReady(true);

setRequestToSend(true);

端口打开后。

关于c++ - 如果 arduino-ide 之前没有打开连接,则无法使用 QSerialPort 与 arduino 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23198241/

相关文章:

c++ - Mac 上的 clang 不支持统一初始化吗?

c++ - 在 Windows 上使用 C++ 中的 Select 函数进行轮询

c++ - C++ 程序和 SDL 中的 main() 冲突

c++ - 类构造函数声明了两次

arduino - 无法浏览在esp8266中创建的Mdns服务

c++ - 我可以使用 break 退出多个嵌套的 'for' 循环吗?

c++ - 从文件中读取单词并将它们存储在 vector 中 C++

当使用 vector 作为键时,C++ unordered_map 失败

qt - 执行Google Test后,Jenkins Build脚本退出

android - 为什么 ADK 的 demokit 程序不能在 Arduino 中编译?