请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 9287|回复: 2

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

[复制链接]

18

主题

22

帖子

158

积分

注册会员

Rank: 2

积分
158
发表于 2020-1-26 19:13:04 | 显示全部楼层 |阅读模式
软件功能

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

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

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

broadcast.pro

因为程序需要使用串口与网络通信,所以需要加上
  1. QT                 += serialportQT                 += network
复制代码
以下是完整代码
  1. #-------------------------------------------------## Project created by QtCreator 2019-07-23T09:59:43##-------------------------------------------------QT       += core guiQT       += serialportQT       += networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = broadcastTEMPLATE = 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_WARNINGSDEFINES += 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.0SOURCES += \        main.cpp \        broadcast.cppHEADERS += \        broadcast.hFORMS += \        broadcast.ui
复制代码
broadcast.h

串口部分

需要引用的头文件为
  1. #include #include
复制代码
在private中,需要定义串口的指针usb_1、usb_2、usb_3、usb_4(考虑到树莓派有4个USB口,故定义4个指针),实现对4个串口的定义与控制。
同时需要定义4个串口读取的函数:
此处之所以将串口读取另定义函数,是因为一方面是方便后续的集中对比,一方面是方便后续如果需要对串口传来的信息进一步处理的话预留好函数
  1.         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等是为了方便之后对串口传来的信息进行同意判断而定义的全局变量。
完整代码如下:
  1. #ifndef BROADCAST_H#define BROADCAST_H#include #include #include #include #include #include #include namespace Ui {class broadcast;}class broadcast : public QMainWindow{    Q_OBJECTpublic:    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

自动生成,无需修改
  1. #include "broadcast.h"#include int main(int argc, char *argv[]){    QApplication a(argc, argv);    broadcast w;    w.show();    return a.exec();}
复制代码
broadcast.cpp

完整代码如下
  1. #include "broadcast.h"#include "ui_broadcast.h"#include #include #include 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中对对应元素定义或赋能时,必须输入正确的名称,例如:
  1. ui->info_in_1->InsertPlainText();
复制代码
输入错误,则无法完成操作,程序会报错
                                                                                                                                       
                                                    
  • 点赞                        
  • 收藏                        
  • 分享                                                                                                                        
  •                                                         
                                      
    • 文章举报                           
                                                
                                                                        
                                            
                                                        Jiyuan-Huang                                                                发布了4 篇原创文章 · 获赞 0 · 访问量 5587                                                                                            私信                                                            关注
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x




上一篇:zookeeper和curator实现的分布式锁
下一篇:怎么办,人生道路的转折点
回复

使用道具 举报

0

主题

20

帖子

430

积分

中级会员

Rank: 3Rank: 3

积分
430
发表于 2020-1-28 17:22:03 | 显示全部楼层
这东西我收了!谢谢楼主![www.12360.co]
回复

使用道具 举报

20

主题

30

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 2020-2-10 04:44:21 | 显示全部楼层
既然你诚信诚意的推荐了,那我就勉为其难的看看吧![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-18 06:07 , Processed in 0.081060 second(s), 25 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表