从 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 端,您必须实现一个循环(或更好地捕捉事件)来检查串行数据是否可用。
- 在该循环(或捕获的事件)中,您可以读取每个字符并将其分配给一个变量。
发送数据的最佳选择是使用您可以自己定义的协议。
最好用十六进制值。
首先定义一个数据包起始字节和数据包停止字节。例如 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' }
首先:对不起,我的英语不是很好。
我正在 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 端,您必须实现一个循环(或更好地捕捉事件)来检查串行数据是否可用。
- 在该循环(或捕获的事件)中,您可以读取每个字符并将其分配给一个变量。
发送数据的最佳选择是使用您可以自己定义的协议。
最好用十六进制值。
首先定义一个数据包起始字节和数据包停止字节。例如 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' }