IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> QT多线程,使用串口接收数据通过UDP端口进行数据转发 -> 正文阅读

[网络协议]QT多线程,使用串口接收数据通过UDP端口进行数据转发

串口接收,UDP转发

虽然在理解上可能会觉得多此一举,但是在工作中确实遇到了这样的问题。两个模块因为工作量问题并没有分配给同一人,因此,当面对两个模块的数据通信时,经过商讨选用了转发的策略,由于所有的数据转发均在后台执行,为了不影响UI界面的操作,故采用多线程进行。
前面的博客中我已经写过使用多线程实现UDP数据发送,链接直达
https://blog.csdn.net/weixin_43552197/article/details/120882987?spm=1001.2014.3001.5501
本文有一部分代码复用了上次的代码,有兴趣的可以在上篇博客给出的代码中自己拓展,博客给出的实例相对较为简单,仅做学习范例使用,同时也是为了后面忘记时方便查看。话不多说,直接上代码
项目的目录结构如下
在这里插入图片描述

由于代码中用到串口和网络,因此首先需要在项目中加入以下代码

QT       += core gui network serialport

mythread.h代码如下

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>
#include <QTime>
#include <QDebug>
#include <QString>
#include <QThread>
#include <QStringList>


class myThread : public QObject
{
    Q_OBJECT
public:
    explicit myThread(QObject *parent = nullptr);

    void initPort();
    QString str;




signals:
    void sendMsg(QStringList tmp);


public slots:
    void readSerialData();
    void writeData();
    void delay();

private:
    QTimer *myTimer;
    QThread *thread;
    QSerialPort *port;


};

#endif // MYTHREAD_H

mythread.cpp代码如下

#include "mythread.h"

myThread::myThread(QObject *parent) : QObject(parent)
{
    thread = new QThread();
    myTimer = new QTimer();
    port = new QSerialPort();

    initPort();

    this->moveToThread(thread);
    port->moveToThread(thread);
    myTimer->moveToThread(thread);
    thread->start();

}

void myThread::initPort()
{
    port->setPortName("ttyUSB0");
    port->setBaudRate(115200);
    port->setDataBits(QSerialPort::Data8);
    port->setStopBits(QSerialPort::OneStop);
    port->setParity(QSerialPort::NoParity);
    port->setFlowControl(QSerialPort::NoFlowControl);
    if(port->open(QIODevice::ReadWrite)){
        qDebug()<<"串口已打开";
    }
    else{
        qDebug()<<"串口打开失败";
    }
    connect(port,SIGNAL(readyRead()),this,SLOT(delay()));
    connect(myTimer,SIGNAL(timeout()),this,SLOT(readSerialData()));

}
void myThread::readSerialData()
{
    myTimer->stop();
    QStringList temp;
    QByteArray buf;
    buf = port->readAll();
    if(!buf.isEmpty())
    {
        buf.simplified();
        str += tr(buf);
    }
    int head = str.indexOf("#");
    int tail = str.indexOf("*",head);
    qDebug()<<"head:"<<head<<"tail"<<tail;
    while(head != -1 && tail != -1)
    {
        temp.append(str.mid(head,tail+1));
        str.remove(head,tail+1);
        head = str.indexOf("#");
        tail = str.indexOf("*",head);
    }
    //temp.append(str.mid(head,tail+1));
    //str.remove(head,tail+1);
    //qDebug()<<str;
    emit(sendMsg(temp));
    buf.clear();
}

void myThread::writeData()
{
    port->write("#123456*#abcdef*");
}

void myThread::delay()
{
    myTimer->start(100);
}


widget.h代码如下

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "mythread.h"
#include <QUdpSocket>
#include <QHostAddress>


namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void sendToUDP(QStringList temp);

private:
    Ui::Widget *ui;
    QUdpSocket *socket;
    myThread *localThread;
    QTimer *timer;
};

#endif // WIDGET_H

widget.cpp代码如下:

#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    socket = new QUdpSocket();
    localThread = new myThread();
    timer = new QTimer();

    socket->bind(3080);
    //删除注释后,是由按钮控制数据发送,此时需要将带定时器的connet注释。
    // connect(ui->pushButton,SIGNAL(clicked()),localThread,SLOT(writeData()));
    connect(timer,SIGNAL(timeout()),localThread,SLOT(writeData()));

    connect(localThread,SIGNAL(sendMsg(QStringList)),this,SLOT(sendToUDP(QStringList)));
    timer->start(500);



}

Widget::~Widget()
{
    delete ui;
}

void Widget::sendToUDP(QStringList temp)
{
    QString item;
    foreach (item, temp)
    {
        qDebug()<<item;
        ui->textEdit->append(item);
        socket->writeDatagram(item.toLatin1(),QHostAddress("127.0.0.1"),3099);
    }

}



main.cpp代码如下

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

UI的界面设计如下,很简单
在这里插入图片描述如果复制代码出现问题的话,可以在下面的连接中下载本博客代码
https://download.csdn.net/download/weixin_43552197/34888504

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 13:25:46  更:2021-10-29 13:26:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/1 21:40:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码