zoukankan      html  css  js  c++  java
  • QTcpSocket发送结构体

    我需要发送的结构体

    struct NetDataHeader_t {
        int nDataType;
        int nDataSize;
    };
    
    struct NetDataBase_t {
        NetDataHeader_t dataHeader;
        double hValue;
        double lValue;
        double temperature;
    };

    我的运行函数

     1 #include "mainwindow.h"
     2 #include "ui_mainwindow.h"
     3 #include <QDebug>
     4 #include "sensordata.h"
     5 #include <cstring>
     6 
     7 MainWindow::MainWindow(QWidget *parent) :
     8     QMainWindow(parent),
     9     ui(new Ui::MainWindow)
    10 {
    11     ui->setupUi(this);
    12 
    13     mySocket = new QTcpSocket();
    14     QObject::connect(mySocket, &QTcpSocket::readyRead, this, &MainWindow::MySocketReadData);
    15     QObject::connect(mySocket, &QTcpSocket::disconnected, this, &MainWindow::MySocketDisconnected);
    16 
    17     ui->btnSend->setEnabled(false);
    18     ui->lineEdit_IP->setText("127.0.0.1");
    19     ui->lineEdit_Port->setText("5000");
    20 }
    21 
    22 MainWindow::~MainWindow()
    23 {
    24     delete mySocket;
    25     delete ui;
    26 }
    27 
    28 void MainWindow::MySocketReadData()
    29 {
    30     QByteArray buffer;
    31 
    32     buffer = mySocket->readAll();
    33     struct NetDataBase_t myData;
    34     if(!buffer.isEmpty()) {
    35         char *src = buffer.data();
    36         memcpy(&myData, src, sizeof(struct NetDataBase_t));
    37         ui->textEdit_Recv->setText(QString("hValue:%1,lValue%2,temp:%3")
    38                 .arg(QString::number(myData.hValue, 'g', 12))
    39                 .arg(QString::number(myData.lValue, 'g', 12)).arg(myData.temperature));
    40     }
    41 }
    42 
    43 void MainWindow::MySocketDisconnected()
    44 {
    45     ui->btnSend->setEnabled(false);
    46 
    47     ui->btnConnect->setText("连接");
    48     qDebug()<<"Disconnected!";
    49 }
    50 
    51 void MainWindow::on_btnSend_clicked()
    52 {
    53     struct NetDataBase_t myData;
    54     myData.dataHeader.nDataSize = 1;
    55     myData.dataHeader.nDataSize = sizeof(struct NetDataBase_t) - sizeof(struct NetDataHeader_t);
    56     myData.hValue = -1.234567890;
    57     myData.lValue = 0.123456789;
    58     myData.temperature = 23.1;
    59 
    60     QByteArray data;
    61     data.resize(sizeof(struct NetDataBase_t));
    62     memcpy(data.data(), &myData, sizeof(struct NetDataBase_t));
    63 
    64     mySocket->write(data);
    65     mySocket->flush();
    66 }
    67 
    68 void MainWindow::on_btnConnect_clicked()
    69 {
    70     if(ui->btnConnect->text() == tr("连接")) {
    71         QString ip;
    72         int port;
    73         ip = ui->lineEdit_IP->text();
    74         port = ui->lineEdit_Port->text().toInt();
    75 
    76         mySocket->abort();
    77         mySocket->connectToHost(ip, port);
    78         if(!mySocket->waitForConnected(30000)) {
    79             qDebug()<<"Connection failed!";
    80             return;
    81         }
    82         qDebug()<<"Connect successfully!";
    83 
    84         ui->btnSend->setEnabled(true);
    85         ui->btnConnect->setText("断开连接");
    86     } else {
    87         mySocket->disconnectFromHost();
    88         ui->btnConnect->setText("连接");
    89         ui->btnSend->setEnabled(false);
    90     }
    91 }

    同时使用QBytearray的data函数转换成字符串形式。

    然后用memcpy进行复制和转换。

    --------------------------------

    或许还可以这样,没试过:把结构体转换成一个QString型的就可以write了,然后就可以了。
    用QString::fromascii()去转换吧,或者是QString::fromlocal8bit()去转换

    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    Laravel5.1 响应--Response
    Laravel5.1 请求--Request
    Laravel5.1 控制器--Controller
    Laravel5.1 模型--查询作用域
    Laravel5.1 模型--删除
    VMware Workstation错误Transport(VMDB)error -44:Message
    如何给flash里面添加链接
    巧用:empty解决webkit核心浏览器text-indent的bug
    form radio & checkbox解决方案
    字符串的第几个
  • 原文地址:https://www.cnblogs.com/ch122633/p/8581120.html
Copyright © 2011-2022 走看看