Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QML插槽未显示串行输入的双值_Qt_Arduino_Qml_Registering - Fatal编程技术网

Qt QML插槽未显示串行输入的双值

Qt QML插槽未显示串行输入的双值,qt,arduino,qml,registering,Qt,Arduino,Qml,Registering,我正在努力将串行输入“analogread2”转换为双精度,以QML显示 我在main.cpp中添加了Q_属性,即根上下文,我可以在qml中添加该属性,但我无法使其以文本格式显示 QGuiApplication app(argc, argv); QQmlApplicationEngine engine; SerialPort serialport; //engine.rootContext()->setContextProperty("serialport", &serialpor

我正在努力将串行输入“analogread2”转换为双精度,以QML显示

我在main.cpp中添加了Q_属性,即根上下文,我可以在qml中添加该属性,但我无法使其以文本格式显示

QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
SerialPort serialport;
//engine.rootContext()->setContextProperty("serialport", &serialport);
qmlRegisterType<SerialPort>("SerialPortlib", 1, 0, "SerialPort");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")))
qml


非常感谢您的帮助。

要进行测试,我假设您正在通过以下方式之一从arduino发送数据:

Serial.println(data);
Serial.print(data);
假设上述已通过serialport类实现,则该类具有一个名为openDefault的函数,该函数扫描通过串行连接的设备,并在描述或制造商中搜索单词“Arduino”,如果发现它已连接到该设备

完整的代码可在以下位置找到:

serialport.h

#ifndef SERIALPORT_H
#define SERIALPORT_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>

class SerialPort : public QObject
{
    Q_OBJECT
    Q_PROPERTY(double oil_pressure_volt READ get_oil_pressure_volt WRITE set_oil_pressure_volt NOTIFY oil_pressure_volt_Changed )

public:
    SerialPort(QObject *parent = 0);
    ~SerialPort();

    double get_oil_pressure_volt() const;
    void set_oil_pressure_volt(double newValue);

public slots:
    void onReadData();

signals:
    void oil_pressure_volt_Changed(double newValue);

private:
    QSerialPort *arduino;

    double mOil_pressure_volt;

    QSerialPortInfo portInfo;

    void openDefault();
};

给我看一下SerialPort classtry和
OnOil\u pressure\u volt\u Changed{console.log(newValue);}
谢谢你的帮助,我正在使用;serial.println(analogRead2);我还想读analogRead3,4,5,6等。我能把onReadData属性改成SLOT吗?我算出了,现在我们有两个读数,我可以乘以它们得到电压和压力。是否有更好的方法或更改进的方法来缓冲和解析数据,我丢失了一些数据块。非常感谢。您可以将其存储在队列中,然后在另一个线程中处理。如果我的回答能帮你把它标记为正确的话。是的,当然可以,伙计,我可以再要求一点帮助吗,我想用现在在旋转测量仪中获得的这个值,我定义了我的开始和停止角度,所以我会用同样的理论来获得这个值。”当前值:SerialPort.arg(机油压力电压)*(最大值-最小值)+最小值;'大家好,我已经使用这个代码很长时间了,从中学习了很多,再次感谢你们。我刚刚将qt更新为4.5,当运行这个bae代码时,我没有得到输出。。。你能帮我在代码中添加一些调试吗?这样我就可以看到qt正在接收串行信息,试着解决这个问题。
Serial.println(data);
Serial.print(data);
#ifndef SERIALPORT_H
#define SERIALPORT_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>

class SerialPort : public QObject
{
    Q_OBJECT
    Q_PROPERTY(double oil_pressure_volt READ get_oil_pressure_volt WRITE set_oil_pressure_volt NOTIFY oil_pressure_volt_Changed )

public:
    SerialPort(QObject *parent = 0);
    ~SerialPort();

    double get_oil_pressure_volt() const;
    void set_oil_pressure_volt(double newValue);

public slots:
    void onReadData();

signals:
    void oil_pressure_volt_Changed(double newValue);

private:
    QSerialPort *arduino;

    double mOil_pressure_volt;

    QSerialPortInfo portInfo;

    void openDefault();
};
#include "serialport.h"

#include <QDebug>

SerialPort::SerialPort(QObject *parent):QObject(parent)
{

    arduino = new QSerialPort(this);
    connect(arduino, &QSerialPort::readyRead, this, &SerialPort::onReadData);
    openDefault();
}

SerialPort::~SerialPort()
{
    delete arduino;
}

void SerialPort::set_oil_pressure_volt(double newValue)
{
    if (mOil_pressure_volt == newValue)
        return;

    mOil_pressure_volt = newValue;
    emit oil_pressure_volt_Changed(mOil_pressure_volt);
}

void SerialPort::onReadData()
{
    if(arduino->bytesAvailable()>0){

        QByteArray data = arduino->readAll();

        QString value = QString(data).trimmed();
        qDebug()<< value;
        bool ok;
        double val = value.toDouble(&ok);
        if(ok)
            set_oil_pressure_volt(val);
    }
}

void SerialPort::openDefault()
{
    for(auto info: QSerialPortInfo::availablePorts()){
        qDebug()<<info.portName()<<info.description()<<info.manufacturer();
        if(!info.isBusy() && (info.description().contains("Arduino") || info.manufacturer().contains("Arduino"))){
            portInfo = info;
            break;
        }
    }

    if(portInfo.isNull()){
        return;
    }

    arduino->setPortName(portInfo.portName());
    arduino->setBaudRate(QSerialPort::Baud115200);
    arduino->setDataBits(QSerialPort::Data8);
    arduino->setParity(QSerialPort::NoParity);
    arduino->setStopBits(QSerialPort::OneStop);
    arduino->setFlowControl(QSerialPort::NoFlowControl);

    if(arduino->open(QSerialPort::ReadWrite))
        qDebug()<<"Connected to "<< portInfo.manufacturer()<< " on " << portInfo.portName();
    else
        qCritical()<<"Serial Port error: " << arduino->errorString();

}

double SerialPort::get_oil_pressure_volt() const
{
    return mOil_pressure_volt;
}
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include "serialport.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    qmlRegisterType<SerialPort>("SerialPortLib", 1, 0, "SerialPort");


    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}
import QtQuick 2.6
import QtQuick.Window 2.2
import SerialPortLib 1.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Test")

    SerialPort{
        onOil_pressure_voltChanged: {
            tx.text = "%1".arg(oil_pressure_volt);
        }
    }

    Text {
        id: tx
        anchors.fill: parent
        font.family: "Helvetica"
        font.pointSize: 20
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter
    }
}