Qt QML插槽未显示串行输入的双值
我正在努力将串行输入“analogread2”转换为双精度,以QML显示 我在main.cpp中添加了Q_属性,即根上下文,我可以在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
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
}
}