QT - 使用 QSerialPort(ASCII 命令)写入和读取

问题描述 投票:0回答:3

我正在通过QT制作一个程序。需要PC与串口之间进行通信。

所以我连接了串口,但我不知道如何写入和读取。 该文档称 “接口(串行端口)响应通过 USB 接收的 ASCII 命令,充当虚拟串行端口。”

我想我必须使用 QIODevice::Write 和 read,但我不知道如何使用它们并解释响应。你能帮我一个忙吗? 我附上我的代码和文档的某些部分。下面

motorport.h

#ifndef MOTORPORT_H
#define MOTORPORT_H

#include <QSerialPort>


class MotorPort : public QSerialPort
{
    Q_OBJECT
~~~~~

motorport.cpp

void MotorPort::openMotorPort(const QString &portName)
{
    setPortName(portName);
    setBaudRate(defaultBaudRate);
    setDataBits(defaultDataBits);
    setStopBits(defaultStopBits);
    setParity(defaultParity);
    open(QIODevice::ReadWrite);

}

主窗口.h

private:
    Ui::MainWindow *ui;
    MotorPort *rls;

//mainwindow.cpp
rls->openMotorPort("COM5");  //success to connect serialport
rls->write("?");  //try to send ASCII command '?' but I don't know....
QByteArray data = rls->readAll();  //

参考截图图像

c++ qt serial-port ascii
3个回答
0
投票
QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);

//read

void MainWindow::ReadData()
{
QByteArray buf;

buf=serial->readAll();
if(!buf.isEmpty())
{
    QString str = buf;
    ui->txtRead->appendPlainText(str);
}
buf.clear();
}


// write
{

serial->write(ui->txtWrite->toPlainText().toLatin1());

}

0
投票

您错过了写入后的刷新并等待写入和读取

rls->openMotorPort("COM5");  //success to connect serialport
rls->write("?");  //try to send ASCII command '?' but I don't know....
rls->flush(); <---
rls->waitForBytesWritten(10); <---
rls->waitForReadyRead(20); <---
QByteArray data = rls->readAll();  //

-1
投票

也许这个链接可以帮助您:https://forum.qt.io/topic/63856/read-and-write-in-serial-port

#include "myserialport.h"
#include <QtSerialPort/QSerialPort>
#include <QMessageBox>
#include <QObject>

MySerialPort::MySerialPort()
{
   serial = new QSerialPort(this);
   connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));
   //openSerialPort();
}


void MySerialPort::openSerialPort()
{
   serial->setPortName("COM3");
   serial->setBaudRate(QSerialPort::Baud9600);
   serial->setDataBits(QSerialPort::Data8);
   serial->setParity(QSerialPort::NoParity);
   serial->setStopBits(QSerialPort::OneStop);
   serial->setFlowControl(QSerialPort::NoFlowControl);
   if (serial->open(QIODevice::ReadWrite)) {

       showStatusMessage("Connectedd");

   } else {

       showStatusMessage(tr("Open error"));
   }
}

void MySerialPort::closeSerialPort()
{
   if (serial->isOpen())
       serial->close();

   showStatusMessage(tr("Disconnected"));
}

void MySerialPort::writeData(const QByteArray &data)
{
   serial->write(data);
}

void MySerialPort::readData()
{
  QByteArray data = serial->readAll();

  qDebug() << data;

}

void MySerialPort::handleError(QSerialPort::SerialPortError error)
{
   if (error == QSerialPort::ResourceError) {
       closeSerialPort();
   }
}


void MySerialPort::showStatusMessage(const QString &message)
{
   qDebug() << message;
}

注意 上面的代码是上述链接的逐字副本。

© www.soinside.com 2019 - 2024. All rights reserved.