QT开发一DS7400主机调试工具

之前一直在网络上面参考别人的代码,现在也该拿出自己的一些东西来分享分享了,这个系列将会粗略的讲解一些工具和小项目的开发过程及遇到的难题和解决办法,将会全部开源并提供下载地址,其实这个开发之旅是有过一定的基础的,所以基础的东西可能都是一笔带过。需要读者自己下载源码去研究,阅读别人的代码还是可以学习到很多东西的,就算是一个循环一个简单的文本存储,都会有一些技巧在里面,我开源出来的代码不一定都是没问题的,但是确实是经过自己几经雕琢封装好的,还是有一定借鉴价值哦!

用DS7400主机调试工具作为开发之旅的第一个项目,是因为之前用.NET写过,而且陆续有很多人看到过加过我QQ咨询过,自己也用在多个商业项目中,所以把这个单独提取出来发布出来,直接一个可执行程序无需任何框架就可以在windows98以上的电脑上跑,甚是爽!

项目名称:DS7400主机调试工具

开发环境:WIN7+QT4.7+QT CREATOR2.8+MINGW

技术实现:通过串口与DS7400报警主机通信,解析协议并作出处理

实现功能:主机布防撤防,防区故障断开旁路报警等

运行截图:

 

粗略步骤:

第一步:准备QT串口通信文件,QT4.7没有包含串口通信的相关类,到了5.1后面的版本才有,所以需要引入第三方的串口类,毫无疑问在QT中网上用的绝大部分都是这几个文件win_qextserialport.h,win_qextserialport.cpp,qextserialbase.h,qextserialbase.cpp,源码都已经提供,在对应项目中右键选择添加现有文件,选择这四个文件。

第二步:添加主界面,放置好对应控件,并命名。

第三步:自定义报警按钮控件,就是一旦布防撤防报警等状态出现的时候,对应颜色改变,这里我是用的贴图,有状态改变时,对应背景图改变,源码里的mybuttonalarm类还封装了三种报警按钮样式。核心代码很简单如下:

void myButtonAlarm::paintEvent(QPaintEvent *event)
 
{
 
    QPainter painter(this);
 
    QPixmap pixMap(this->CurrentImage);
 
    QFont font("Arial",10,QFont::Bold,true);
 
    QRectF rect(0,0,32,47);
 
    painter.setFont(font);
 
    painter.drawPixmap(0,0,32,32,pixMap);
 
    painter.drawText(rect,Qt::AlignBottom | Qt::AlignCenter,this->defenceID);
 
}

就是将对应图片和文字画上去。

第四步:封装DS7400主机通信类。

博世DS7400主机通信协议格式

格式依次为: 85 18 09 6B(示例)

第一位为标识,第二位为事件类型(0E布防0D撤防07报警等),第三位为防区号(对应16进制转换成10进制加一,例如09转成10进制为09,再加一是10,对应010防区),第四位是校验码

布防:85 0E 00 74

报警主机:123 主机防区/分区:1 报警主机消息:AREA_ARM_DS7400

撤防:85 0D 00 77

报警主机:123 主机防区/分区:1 报警主机消息:AREA_DISARM_DS7400

取消报警:85 0C 00 76

报警主机:123 主机防区/分区:1 报警主机消息:CANCEL_ALARM_DS7400

正常:A0 02 5D

接收到DS7400主机状态报告

09防区:撤防状态与布防状态

正常断开:85 18 08 6A

报警主机:123 主机防区/分区:9 报警主机消息:ZONE_OPEN_DS7400

正常连上:85 19 08 6B

报警主机:123 主机防区/分区:9 报警主机消息:ZONE_RESTORE_DS7400

报警断开:85 18 08 6A 85 07 08 75

报警主机:123 主机防区/分区:9 报警主机消息:ZONE_OPEN_DS7400

报警主机:123 主机防区/分区:9 报警主机消息:BURGLAR_ZONE_ALARM_DS7400

报警连上:85 19 08 6B 85 11 08 63

报警主机:123 主机防区/分区:9 报警主机消息:ZONE_RESTORE_DS7400

报警主机:123 主机防区/分区:9 报警主机消息:ZONE_ALARM_RESTORE_DS7400

旁路:85 0F 08 7D

报警主机:123 主机防区/分区:9 报警主机消息:FORCED_BYPASS_DS7400

第五步:实例化串口类,通信。

void frmMain::on_btnOpen_clicked()
 
{
 
    if (ui->btnOpen->text()=="打开串口")
 
    {
 
        QString port=ui->cboxPortName->currentText();
 
  
 
        DS7400->SetHostID("");
 
        DS7400->SetHostName("");
 
        DS7400->SetHostType("");
 
        DS7400->SetHostAddr(1);
 
        DS7400->SetHostConnectType("COM");
 
        DS7400->SetHostConnectValue(port);
 
  
 
        if (DS7400->Open())
 
        {
 
            connect(DS7400,SIGNAL(Connect(QString)),this,SLOT(Connect()));
 
            connect(DS7400,SIGNAL(DisConnect(QString)),this,SLOT(DisConnect()));
 
            connect(DS7400,SIGNAL(BuFang(QString,int)),this,SLOT(BuFang()));
 
            connect(DS7400,SIGNAL(CheFang(QString,int)),this,SLOT(CheFang()));
 
            connect(DS7400,SIGNAL(BaoJing(QString,QString)),this,SLOT(BaoJing(QString,QString)));
 
            connect(DS7400,SIGNAL(DuanKai(QString,QString)),this,SLOT(DuanKai(QString,QString)));
 
            connect(DS7400,SIGNAL(GuZhang(QString,QString)),this,SLOT(GuZhang(QString,QString)));
 
            connect(DS7400,SIGNAL(HuiFu(QString,QString)),this,SLOT(HuiFu(QString,QString)));
 
            connect(DS7400,SIGNAL(PangLu(QString,QString)),this,SLOT(PangLu(QString,QString)));
 
            ui->btnOpen->setText("关闭串口");
 
            this->AddMessage("打开串口成功");
 
        }
 
        else
 
        {
 
            this->AddMessage("打开串口失败");
 
        }
 
    }
 
    else
 
    {
 
        DS7400->Close();
 
        disconnect(DS7400,SIGNAL(Connect(QString)),this,SLOT(Connect()));
 
        disconnect(DS7400,SIGNAL(DisConnect(QString)),this,SLOT(DisConnect()));
 
        disconnect(DS7400,SIGNAL(BuFang(QString,int)),this,SLOT(BuFang()));
 
        disconnect(DS7400,SIGNAL(CheFang(QString,int)),this,SLOT(CheFang()));
 
        disconnect(DS7400,SIGNAL(BaoJing(QString,QString)),this,SLOT(BaoJing(QString,QString)));
 
        disconnect(DS7400,SIGNAL(DuanKai(QString,QString)),this,SLOT(DuanKai(QString,QString)));
 
        disconnect(DS7400,SIGNAL(GuZhang(QString,QString)),this,SLOT(GuZhang(QString,QString)));
 
        disconnect(DS7400,SIGNAL(HuiFu(QString,QString)),this,SLOT(HuiFu(QString,QString)));
 
        disconnect(DS7400,SIGNAL(PangLu(QString,QString)),this,SLOT(PangLu(QString,QString)));
 
        ui->btnOpen->setText("打开串口");
 
        this->AddMessage("关闭串口成功");
 
    }
 
}

第六步:实现具体槽函数

void frmMain::AddMessage(QString Message)
 
{
 
    ui->txtData->append(QString("收到消息:%1  时间:%2")
 
                        .arg(Message)
 
                        .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")));
 
}
 
  
 
void frmMain::Connect()
 
{
 
    this->AddMessage("主机上线");
 
}
 
  
 
void frmMain::DisConnect()
 
{
 
    this->AddMessage("主机下线");
 
}
 
  
 
void frmMain::BuFang()
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        btn->SetDefenceStatus(DefenceStatusBuFang);
 
    }
 
  
 
    this->AddMessage("主机布防");
 
}
 
  
 
void frmMain::CheFang()
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        btn->SetDefenceStatus(DefenceStatusCheFang);
 
    }
 
  
 
    this->AddMessage("主机撤防");
 
}
 
  
 
void frmMain::BaoJing()
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        btn->SetDefenceStatus(DefenceStatusBaoJing);
 
    }
 
  
 
    this->AddMessage("主机报警");
 
}
 
  
 
void frmMain::PangLu()
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        btn->SetDefenceStatus(DefenceStatusPangLu);
 
    }
 
  
 
    this->AddMessage("主机旁路");
 
}
 
  
 
void frmMain::DuanKai()
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        btn->SetDefenceStatus(DefenceStatusDuanKai);
 
    }
 
  
 
    this->AddMessage("主机断开");
 
}
 
  
 
void frmMain::GuZhang()
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        btn->SetDefenceStatus(DefenceStatusGuZhang);
 
    }
 
  
 
    this->AddMessage("主机故障");
 
}
 
  
 
void frmMain::BaoJing(QString hostID, QString defenceID)
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        if (btn->GetDefenceID()==defenceID)
 
        {
 
            btn->SetDefenceStatus(DefenceStatusBaoJing);
 
            break;
 
        }
 
    }
 
  
 
    this->AddMessage(QString("%1防区报警").arg(defenceID));
 
}
 
  
 
void frmMain::DuanKai(QString hostID, QString defenceID)
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        if (btn->GetDefenceID()==defenceID)
 
        {
 
            btn->SetDefenceStatus(DefenceStatusDuanKai);
 
            break;
 
        }
 
    }
 
  
 
    this->AddMessage(QString("%1防区断开").arg(defenceID));
 
}
 
  
 
void frmMain::GuZhang(QString hostID, QString defenceID)
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        if (btn->GetDefenceID()==defenceID)
 
        {
 
            btn->SetDefenceStatus(DefenceStatusGuZhang);
 
            break;
 
        }
 
    }
 
  
 
    this->AddMessage(QString("%1防区故障").arg(defenceID));
 
}
 
  
 
void frmMain::HuiFu(QString hostID, QString defenceID)
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        if (btn->GetDefenceID()==defenceID)
 
        {
 
            btn->SetDefenceStatus(DefenceStatusCheFang);
 
            break;
 
        }
 
    }
 
  
 
    this->AddMessage(QString("%1防区恢复").arg(defenceID));
 
}
 
  
 
void frmMain::PangLu(QString hostID, QString defenceID)
 
{
 
    int count=ui->gboxMain->children().count();
 
    for (int i=0;i<count;i++)
 
    {
 
        myButtonAlarm *btn=(myButtonAlarm *)ui->gboxMain->children().at(i);
 
        if (btn->GetDefenceID()==defenceID)
 
        {
 
            btn->SetDefenceStatus(DefenceStatusPangLu);
 
            break;
 
        }
 
    }
 
  
 
    this->AddMessage(QString("%1防区旁路").arg(defenceID));
 
}

这里采用QString(“”)而不是tr(“”) ,之前看过某人说过要慎用tr,确实,tr是用来国际化的,如果需要字符串拼接,可以用QString(“%1”).arg(“”)这种占位符形式,很方便。和.NET里面的string.Forrmat用法一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值