从 Qt 向 Arduino 发送多个字符

Sending more than one character from Qt to Arduino

首先:对不起,我的英语不是很好。

我正在 Qt (C++) 和 Arduino 之间进行串行通信。首先,我尝试向 Arduino 发送一个字符(“1”)以打开 LED,它起作用了。现在我想发送一个以上的字符。我怎样才能发送更多字符,以便每个字符都成为 Arduino 代码中的一个变量?

这是我的一个字符的 Qt 代码:

void MainWindow::on_pushButton_clicked()
{

    serial.setPortName("com17");
    serial.setBaudRate(QSerialPort::Baud9600);
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    serial.setFlowControl(QSerialPort::NoFlowControl);
    serial.open(QIODevice::ReadWrite);
    serial.write("'0'");

}

如果不了解您的 Arduino 代码,我无法提供详细帮助。您基本上需要做的是:

  • 使用您的 Qt 应用程序将一些字符发送到串行接口。您可以通过额外调用 serial.write().
  • 来完成此操作
  • 在 Arduino 端,您必须实现一个循环(或更好地捕捉事件)来检查串行数据是否可用。
  • 在该循环(或捕获的事件)中,您可以读取每个字符并将其分配给一个变量。

看看documentation for Serial.read() and serialEvent()

发送数据的最佳选择是使用您可以自己定义的协议。

最好用十六进制值。

首先定义一个数据包起始字节和数据包停止字节。例如 0x00 和 0x01.

让 arduino 循环从串口读取。直到找到 0x00。一旦找到这个起始字节。将每个字符读入数组,直到找到作为停止字节的 0x01。

此外,如果数据中显示 0x01,请使用转义字节。

我想你正在使用 QT 的 QSerialPort class。

正如您从文档 (http://doc.qt.io/qt-5/qserialport-members.html) 中看到的那样,您有三个函数重载了 write(...),来自 super class

write(const char *, qint64) : qint64
write(const char *) : qint64
write(const QByteArray &) : qint64

你实际上用"'0'"发送的实际上是一个由三个字符,两个单引号和数字零组成的字符串。

如果要发送多个字符,则必须将所有字符打包到一个 QByteArray 中。

您必须按以下方式调用 serial.write()

QByteArray ba;
ba.append('1')
ba.append('2')
ba.append('3')
etc...
serial.write(ba)

这样你发送的数据由三个字节组成 { '1', '2', '3' }