【问题标题】:Wrong/ too few output from Qt serial write functionQt 串行写入功能的错误/输出太少
【发布时间】:2015-01-30 12:08:35
【问题描述】:

我正在尝试将我之前使用 serial->write... 功能从 GUI 读取的 7 个变量发送到我的微控制器。

我在我的微控制器上编写了一个小程序,如果有输入,它会闪烁一个 LED。但它只显示 5 个输入。

我认为可能是我的微控制器速度不够快,我停止了 Qt 程序,但没有奏效。 所以我不明白为什么输入太少。

此外,我使用 qDebug()

这是我的代码:

 //conversion from QString into const char*
    q_bauteillaenge      = (ui->Bauteillaenge_e->text());
    q_messintervall_vert = (ui->Messintervall_vert_e->text());
    q_anz_inkrem_vert    = (ui->Anzahl_Inkremente_vert_e->text());
    q_inkrem_laenge_vert = (ui->Inkrementlaenge_vert_e->text());
    q_anz_messungen_vert = (ui->Anzahl_Messungen_vert_e->text());
    q_abs_messungen_vert = (ui->Abstand_Messungen_vert_e->text());

    a_bauteillaenge      =  q_bauteillaenge.toUtf8();
    a_messintervall_vert =  q_messintervall_vert.toUtf8() ;
    a_anz_inkrem_vert    =  q_anz_inkrem_vert.toUtf8() ;
    a_inkrem_laenge_vert =  q_inkrem_laenge_vert.toUtf8() ;
    a_anz_messungen_vert =  q_anz_messungen_vert.toUtf8();
    a_abs_messungen_vert =  q_abs_messungen_vert.toUtf8();

    bauteillaenge      = a_bauteillaenge.constData();
    messintervall_vert = a_messintervall_vert.constData() ;
    anz_inkrem_vert    = a_anz_inkrem_vert.constData() ;
    inkrem_laenge_vert = a_inkrem_laenge_vert.constData() ;
    anz_messungen_vert = a_anz_messungen_vert.constData();
    abs_messungen_vert = a_abs_messungen_vert.constData();


    //Sending
    qDebug() << serial->write("1");
    serial->write("\n");

    qDebug() << serial->write(bauteillaenge);
    serial->write("\n");

    qDebug() << serial->write(messintervall_vert);
    serial->write("\n");

    qDebug() << serial->write(anz_inkrem_vert);
    serial->write("\n");

    qDebug() << serial->write(inkrem_laenge_vert);
    serial->write("\n");

    qDebug() << serial->write(anz_messungen_vert);
    serial->write("\n");

    qDebug() << serial->write(abs_messungen_vert);
    serial->write("\n");

我的错在哪里?

问候

【问题讨论】:

  • QIODevice::write 返回写入的字节数。这就是为什么在qDebug() &lt;&lt; serial-&gt;write("500") 之后在日志中得到“3”的原因。如果你想检查你要发送的字符串,你应该直接发送到qDebug()qDebug() &lt;&lt; anz_inkrem_vert
  • 好的,我知道了,我假设了另一个输出。但我只是添加了这个,因为我想看看是否有可能为什么不发送所有变量。

标签: c++ qt port communication


【解决方案1】:
  1. 我会研究一下 UTF-8 编码。你确定你的微控制器代码除了 UTF-8 字节吗?

  2. LED 对输入数据的响应方式取决于微控制器的代码。也许你可以添加一些微控制器代码。

  3. serial->write 函数返回实际写入字节数。所以它可以正常工作,但是您期望另一个返回值。 阅读关于这个的文档: http://doc.qt.io/qt-5/qiodevice.html#write

【讨论】:

  • 我用终端(putty)在微控制器上测试了程序,它工作正常。远程字符集是 UTF-8,所以这应该不是问题。
  • 微控制器上的代码是一个非常简单的while循环。我只是使用一个名为 UARTgets 的函数,该函数会阻塞,直到读取输入。是输入读取我打开 LED,等待半秒钟然后将其关闭。这就是循环中的所有内容,我只计算了 LED 的 5 次闪烁,所以我建议微控制器只接收 7 个变量中的 5 个。
  • 您的 UARTgets 函数是您自己的函数还是库的一部分?从我得到的你的微控制器代码没有任何意义。要进行调试,请在 Qt 应用程序中的串行写入调度之间放置一秒(左右)延迟。我想你会眨眼 7 次。
  • 我认为问题在于数据发送的速度比微控制器接收数据的速度要快得多。您应该立即从缓冲区中获取字符。收到换行符时,您应该解析传入的数据。根据该数据,您可以闪烁您的 LED。现在,您的应用程序会自行检查是否有任何可用数据。如果是这样,闪烁 LED 并阻止程序。不知道在等待期间发生了什么。
  • 这是一个库函数。微控制器上的代码只是为了测试是否收到了所有变量,如果它有效,我将使用另一个。我在每次写入后设置了睡眠(1000)。不工作。我将闪烁延长到 5 秒,它也闪烁 5 次。当控制器太慢时,如果我延长闪烁时间,闪烁应该会减少。所以我认为控制器足够快
猜你喜欢
  • 2022-11-29
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多