QtSerialPort не пишет в последовательный порт

Я пытаюсь отправить команды Gcode на 3d-принтер с помощью QtSerialPort. Я могу подключиться и прочитать gcode запуска, который отправляет принтер, но я не смог написать Gcode, чтобы принтер что-то сделал. Я читал код многих людей, и, насколько я могу судить, мой код не выглядит неправильно, но я определенно что-то упускаю.

Вот что я использую для подключения к 3d принтеру:

void MainWindow::on_connectButton_clicked()
{
    serial->setPortName(ui->portBox->currentText());
    serial->setBaudRate(250000);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);;
    serial->setFlowControl(QSerialPort::NoFlowControl);
    if (serial->open(QIODevice::ReadWrite)) {
       ui->label->setText("Connected to Printer!!");
    } else {
    ui->label->setText("Error: Failed to connect");
    }
}

Это то, что я печатаю для записи в последовательный порт:

QString command = "G28";
QByteArray x = command.toLocal8Bit();
serial->write(x);

Это не дает мне ошибок, но принтер не реагирует. Я попробовал пример последовательной консоли Qt и отправил "G28", и принтер реагирует правильно. в той же программе я добавил кнопку, которая выполняет приведенный выше код, чтобы написать команду, и она ничего не сделала. Это говорит мне, что проблема, вероятно, связана с тем, как я пишу в порт. У кого-нибудь есть идеи о том, что я делаю не так? Заранее спасибо.

2 ответа

Решение

Как писал Рафаэль выше, моя проблема была в том, что мне не хватало \n после G28. Изменение этого решило мою проблему:

QString command = "G28\n";
QByteArray x = command.toLocal8Bit();
serial->write(x);

У меня был похожий симптом, но другая причина. Я добавляю это сюда на случай, если Google обнаружит на этой странице кого-нибудь еще с такой же проблемой.

В Windows 10 мне нужно было обязательно позвонить serialPort.waitForBytes(100);сразу после того, как serialPort.write(data);чтобы гарантировать, что байты действительно попали в сеть. В противном случаеwrite()вернет правильное количество отправленных байтов, но по сети ничего не было отправлено.

я тоже попробовалflush()но это будет отправлять только первый набор данных и не будет работать для последующих вызовов.

Другие вопросы по тегам