#树莓派#使用QT实现串口信息检测与网络通信

软件功能

能够对串口传来的信息进行判断,对于不同的信息,发送与之所对应的http请求到服务器,由服务器来进行之后的响应。

软件要求

1.能实现简单的串口信息检测
2.能通过http请求与服务器建立连接
3.有一个直观的界面

软件工作环境

基于树莓派3B+的Raspbian OS
QT5

代码

broadcast.pro

因为程序需要使用串口与网络通信,所以需要加上

QT 		+= serialport
QT 		+= network

以下是完整代码

#-------------------------------------------------
#
# Project created by QtCreator 2019-07-23T09:59:43
#
#-------------------------------------------------

QT       += core gui
QT       += serialport
QT       += network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = broadcast
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
DEFINES += UNICODE

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        broadcast.cpp

HEADERS += \
        broadcast.h

FORMS += \
        broadcast.ui

broadcast.h

串口部分

需要引用的头文件为

#include <QSerialPort>
#include <QSerialPortInfo>

在private中,需要定义串口的指针usb_1、usb_2、usb_3、usb_4(考虑到树莓派有4个USB口,故定义4个指针),实现对4个串口的定义与控制。
同时需要定义4个串口读取的函数:

此处之所以将串口读取另定义函数,是因为一方面是方便后续的集中对比,一方面是方便后续如果需要对串口传来的信息进一步处理的话预留好函数

	QSerialPort *usb_1;
    QSerialPort *usb_2;
    QSerialPort *usb_3;
    QSerialPort *usb_4;
    void readMyCom_1();
    QByteArray temp_1;
    void readMyCom_2();
    QByteArray temp_2;
    void readMyCom_3();
    QByteArray temp_3;
    void readMyCom_4();
    QByteArray temp_4;

temp_1等是为了方便之后对串口传来的信息进行同意判断而定义的全局变量。

完整代码如下:

#ifndef BROADCAST_H
#define BROADCAST_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QSettings>


namespace Ui {
class broadcast;
}

class broadcast : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::broadcast *ui;
    QSerialPort *usb_1;
    QSerialPort *usb_2;
    QSerialPort *usb_3;
    QSerialPort *usb_4;
    void readMyCom_1();
    QByteArray temp_1;
    void readMyCom_2();
    QByteArray temp_2;
    void readMyCom_3();
    QByteArray temp_3;
    void readMyCom_4();
    QByteArray temp_4;
    void judge();
    QNetworkRequest request;
    QNetworkAccessManager* naManager;
    QSettings *config;
    QString ip;
    QString port;
    QString project;
    QString id1;
    QString id2;

private slots:
    void server_change_clicked();
    void server_test_clicked();
    void http_finished(QNetworkReply*);
};

#endif // BROADCAST_H

main.cpp

自动生成,无需修改

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

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

    return a.exec();
}

broadcast.cpp

完整代码如下

#include "broadcast.h"
#include "ui_broadcast.h"
#include <QString>
#include <QDebug>
#include <QMessageBox>

broadcast::broadcast(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::broadcast)
{
    ui->setupUi(this);

    //设置信号连接
    connect(ui->server_test,SIGNAL(clicked()),this,SLOT(server_test_clicked()));
    connect(ui->server_change,SIGNAL(clicked()),this,SLOT(server_change_clicked()));

    //新建串口模块
    usb_1 = new QSerialPort;
    usb_2 = new QSerialPort;
    usb_3 = new QSerialPort;
    usb_4 = new QSerialPort;

    //设置窗口名称
    setWindowTitle(tr("broadcast ground control"));

    //设置http通信
    naManager = new QNetworkAccessManager(this);
    connect(naManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(http_finished(QNetworkReply*)));

    //开启一号串口,并开始监听
    usb_1->setPortName("/dev/ttyUSB0");//串口名称可以在/dev目录下找到
    usb_1->setBaudRate(QSerialPort::Baud9600);//设置串口波特率
    usb_1->setFlowControl(QSerialPort::NoFlowControl);//设置串口流数据控制
    usb_1->setDataBits(QSerialPort::Data8);//设置串口数据位
    usb_1->setStopBits(QSerialPort::OneStop);//设置串口停止位
    usb_1->setParity(QSerialPort::NoParity);//设置串口校验位
    usb_1->open(QIODevice::ReadWrite);//开启串口
    connect(usb_1,&QSerialPort::readyRead,this,&broadcast::readMyCom_1);//开启串口监听线程

    //开启二号串口,并开始监听
    usb_2->setPortName("/dev/ttyUSB1");//串口名称可以在/dev目录下找到
    usb_2->setBaudRate(QSerialPort::Baud9600);//设置串口波特率
    usb_2->setFlowControl(QSerialPort::NoFlowControl);//设置串口流数据控制
    usb_2->setDataBits(QSerialPort::Data8);//设置串口数据位
    usb_2->setStopBits(QSerialPort::OneStop);//设置串口停止位
    usb_2->setParity(QSerialPort::NoParity);//设置串口校验位
    usb_2->open(QIODevice::ReadWrite);//开启串口
    connect(usb_2,&QSerialPort::readyRead,this,&broadcast::readMyCom_2);//开启串口监听线程

    //开启三号串口,并开始监听
    usb_3->setPortName("/dev/ttyUSB2");//串口名称可以在/dev目录下找到
    usb_3->setBaudRate(QSerialPort::Baud9600);//设置串口波特率
    usb_3->setFlowControl(QSerialPort::NoFlowControl);//设置串口流数据控制
    usb_3->setDataBits(QSerialPort::Data8);//设置串口数据位
    usb_3->setStopBits(QSerialPort::OneStop);//设置串口停止位
    usb_3->setParity(QSerialPort::NoParity);//设置串口校验位
    usb_3->open(QIODevice::ReadWrite);//开启串口
    connect(usb_3,&QSerialPort::readyRead,this,&broadcast::readMyCom_3);//开启串口监听线程

    //开启四号串口,并开始监听
    usb_4->setPortName("/dev/ttyUSB3");//串口名称可以在/dev目录下找到
    usb_4->setBaudRate(QSerialPort::Baud9600);//设置串口波特率
    usb_4->setFlowControl(QSerialPort::NoFlowControl);//设置串口流数据控制
    usb_4->setDataBits(QSerialPort::Data8);//设置串口数据位
    usb_4->setStopBits(QSerialPort::OneStop);//设置串口停止位
    usb_4->setParity(QSerialPort::NoParity);//设置串口校验位
    usb_4->open(QIODevice::ReadWrite);//开启串口
    connect(usb_4,&QSerialPort::readyRead,this,&broadcast::readMyCom_4);//开启串口监听线程

    //设置ini文件
    config = new QSettings("config.ini",QSettings::IniFormat);
    ip = config->value("/ip/value").toString();
    port = config->value("/port/value").toString();
    project = config->value("/project/value").toString();
    id1 = config->value("/id1/value").toString();
    id2 = config->value("/id2/value").toString();
}

void broadcast::server_change_clicked()
{
    QString change_ip = ui->IP_edit->text();
    QString change_port = ui->port_edit->text();
    QString change_project = ui->project_edit->text();
    QString change_id1 = ui->id1_edit->text();
    QString change_id2 = ui->id2_edit->text();

    if(!ui->IP_edit->text().isEmpty())
    {
        config->setValue("/ip/value",change_ip);
        ip = config->value("/ip/value").toString();
    }
    if(!ui->port_edit->text().isEmpty())
    {
        config->setValue("/port/value",change_port);
        port = config->value("/port/value").toString();
    }
    if(!ui->project_edit->text().isEmpty())
    {
        config->setValue("/project/value",change_project);
        project = config->value("/project/value").toString();
    }
    if(!ui->id1_edit->text().isEmpty())
    {
        config->setValue("/id1/value",change_id1);
        id1 = config->value("/id1/value").toString();
    }
    if(!ui->id2_edit->text().isEmpty())
    {
        config->setValue("/id2/value",change_id2);
        id2 = config->value("/id2/value").toString();
    }

    if(!ui->IP_edit->text().isEmpty() || !ui->port_edit->text().isEmpty() || !ui->project_edit->text().isEmpty() || !ui->id1_edit->text().isEmpty() || !ui->id2_edit->text().isEmpty())
    {
        QMessageBox::information(this,"注意","http请求已经被修改!");
    }
    else
    {
        QMessageBox::information(this,"注意","http请求没有被修改!");
    }
}

void broadcast::readMyCom_1()
{
    temp_1 = usb_1->readAll();//读取来自串口的数据
}

void broadcast::readMyCom_2()
{
    temp_2 = usb_2->readAll();
}

void broadcast::readMyCom_3()
{
  	temp_3 = usb_3->readAll();
}

void broadcast::readMyCom_4()
{
  	temp_4 = usb_4->readAll();
}

void broadcast::judge()
{
  QString url_1_1 = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id1+"&eventType=1";
  QString url_1_2 = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id1+"&eventType=0";
  QString url_2_1 = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id2+"&eventType=1";
  QString url_2_2 = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id2+"&eventType=0";
  QString url_3_1 = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id3+"&eventType=1";
  QString url_3_2 = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id3+"&eventType=0";
  QString url_4_1 = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id4+"&eventType=1";
  QString url_4_2 = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id4+"&eventType=0";

  if(temp_1=="P1:YR\n" || temp_2=="P1:YR\n" || temp_3=="P1:YR\n" || temp_4=="P1:YR\n")
  {
    request.setUrl(QUrl(url_1_1));
    naManager->get(request);
    ui->info_in_1->insertPlainText("P1:YR\n");
  }
  else if(temp_1=="P1:MR\n" || temp_2=="P1:MR\n" || temp_3=="P1:MR\n" || temp_4=="P1:MR\n")
  {
    request.setUrl(QUrl(url_1_2));
    naManager->get(request);
    ui->info_in_1->insertPlainText("P1:MR\n");
  }
  else if(temp_1=="P2:YR\n" || temp_2=="P2:YR\n" || temp_3=="P2:YR\n" || temp_4=="P2:YR\n")
  {
    request.setUrl(QUrl(url_2_1));
    naManager->get(request);
    ui->info_in_2->insertPlainText("P2:YR\n");
  }
  else if(temp_1=="P2:MR\n" || temp_2=="P2:MR\n" || temp_3=="P2:MR\n" || temp_4=="P2:MR\n")
  {
    request.setUrl(QUrl(url_2_2));
    naManager->get(request);
    ui->info_in_2->insertPlainText("P2:MR\n");
  }
  //将鼠标指针移到最后一行
  ui->info_in_1->moveCursor(QTextCursor::End);
  ui->info_in_2->moveCursor(QTextCursor::End);
}

void broadcast::http_finished(QNetworkReply *reply)
{
    QString str = reply->readAll();
    ui->receive_info->insertPlainText(str);
}

void broadcast::server_test_clicked()
{
    //测试http请求是否成功
    QString url = "http://"+ip+":"+port+"/"+project+"/doGet?monitorId=N"+id1+"&eventType=1";
    request.setUrl(QUrl(url));
    naManager->get(request);
    ui->receive_info->insertPlainText("test sent\n");
}

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

broadcas.ui

在这里插入图片描述
在这里插入图片描述
界面中每一个元素对应一个名称,在broadcast.cpp中对对应元素定义或赋能时,必须输入正确的名称,例如:

ui->info_in_1->InsertPlainText();

输入错误,则无法完成操作,程序会报错

发布了4 篇原创文章 · 获赞 0 · 访问量 97

猜你喜欢

转载自blog.csdn.net/weixin_42886143/article/details/104080416