qt - QSerialPort 读写不工作
问题描述
当我运行下面的 Qt 代码以使用 Arduino 代码连接到 ESP32 时,我没有得到预期的结果,即 QDebug() 打印 QByteArray com -----> \xFF \xFC \xFE \xFC。
相反,我得到了 com 字节数组(\xFC 或 \xFF)中的最后一个或第一个值。
当我调用 connect() 函数“QIODevice::readyRead 不是信号”时,我也会收到警告。
我究竟做错了什么?
Dialog::Dialog(QWidget *parent)
:QDialog(parent),
ui(new Ui::Dialog),
esp(new QSerialPort(this))
{
ui->setupUi(this);
esp_available = false;
void Dialog::on_connect_clicked()
{
if(esp_available){
esp->setPortName(espPortName);
esp->open(QSerialPort::ReadWrite);
esp->setBaudRate(500000);
esp->setDataBits(QSerialPort::Data8);
esp->setParity(QSerialPort::NoParity);
esp->setStopBits(QSerialPort::OneStop);
esp->setFlowControl(QSerialPort::NoFlowControl);
connect(esp, &QSerialPort::readyRead, this, &Dialog::onDataReady);
// line above gives warning: QIODevice::readyRead is not a signal
}
void Dialog::on_startStream_clicked()
{
QByteArray com = QByteArray::fromHex({"ff fc fe fc"});
if(esp->isOpen()){
esp->write(com);
}
}
void Dialog::onDataReady()
{
QByteArray ba;
do{
ba += esp->readAll();
int i = ba.indexOf('\r');
if(i != -1){
QByteArray ba1 = ba.mid(0, i);
qDebug() << ba1;
ba.remove(0, i);
}
} while(esp->bytesAvailable());
}
在 ESP32 上运行的 Arduino 代码:
bool packet_recevived = false;
const int max_packet_size = 10;
char incoming_packet[max_packet_size]; // the incoming packet size mat vary.
void parse_packet();
void setup() { Serial.begin(500000); }
void loop() {
if (Serial.available() > 0 && packet_recevived == false) {
parse_packet();
} else if (packet_recevived == true) {
packet_recevived = false;
}
}
void parse_packet() {
int in_size = Serial.available();
for (int i = 0; i <= in_size; i++) {
incoming_packet[i] = Serial.read();
}
Serial.println(incoming_packet);
packet_recevived = true;
}
修正案:
我修改了 onDatReady() 插槽如下:
void Dialog::onDataReady()
{
QByteArray ba;
if(esp->canReadLine()){
ba = esp->readLine();
qDebug() << ba;
}
}
正如@eyllanesc 在评论中所建议的那样,我尝试降低波特率并尝试不同的波特率。9600 和 19200 似乎工作正常。Qt 不支持 500K 的自定义波特率吗?也许 connect() 函数或 readyRead() 信号不够快?有什么建议么?
解决方案
问题是我修复的 Arduino 代码。
char incoming_buffer[11];
void process();
void execute(uint8_t com[], int size);
bool received = false;
String command;
bool executed = false;
uint8_t start_stream[] = "\x02\x00\x01\xFE\x01\x00\x01";
void setup() {
Serial.begin(500000);
Serial.println();
}
void loop() {
if (Serial.available() > 0 && received == false) {
process();
} else if (executed == true) {
executed = false;
received = false;
}
}
void process() {
while (Serial.available() > 0) {
Serial.readBytesUntil('\n', incoming_buffer, 11);
}
command = String(incoming_buffer);
if (command == "start") {
execute(start_stream, sizeof(start_stream));
received = true;
} else {
Serial.println("no command");
received = false;
}
memset(incoming_buffer, 0, sizeof(incoming_buffer)); // reset the buffer
}
void execute(uint8_t com[], int size) {
for (int i = 0; i < size - 1; i++) {
Serial.print(com[i]);
Serial.print(" ");
}
Serial.println();
executed = true;
}
推荐阅读
- java - Java 将数字拆分为数字的算法
- html - 如何将主要和辅助引导 wp 菜单合并为一个用于移动设备
- angular - 如何在 Ionic-3 中执行 CRUD 操作?
- deep-learning - 为意大利语发布谷歌 BERT 的单一语言模型是否值得?
- swift - Swift 4.2 中 Codility GenomicRangeQuery 的前缀 Sum Coding Challenge 的解释
- h2o - 如何解释 H2O 混淆矩阵的行和列
- c++ - OpenAL alDistanceModel 增益/衰减
- python - 如何在代码中获取 argparse 参数的子集
- liferay - Liferay 7.1:只有一个节点的集群(测试环境)
- yii - Yii2:选择下拉列表中的项目时设置文本字段的值