qt4.8 利用串口实现智能大棚系统

最近参加了一个比赛,拿实验室中的zigbee传感器模块来实现的一个智能大棚系统:这次比赛感觉自己在硬件方面的知识还是欠缺很多,现在zigbee的更新换代很快,然而我还停留在最近出的传感器模块,在实现代码方面做的还可以,但是硬件方面跟他人差距很大。

https://download.csdn.net/download/qq_36819130/10739556  下载地址 

环境是ubuntu下 qt4.8 最好是root用户下,因为串口的调用需要权限。

基本功能实现:

温湿度的显示,电机模块的控制,调光装置的控制,socket服务器通信,红外检测,烟雾检测,动态增加节点。

实现界面

串口通信

bool SerialService::openCom() // 打开串口
{
    if(my_com)
    {
        closeCom();
    }
    else
    {
        QString com_name = "/dev/ttyS0"; // 这个是根据自己的串口来的我是在ubuntu下写的
        my_com = new Posix_QextSerialPort(com_name, QextSerialBase::Polling);
    }
    my_com->open(QIODevice::ReadWrite);
    if(my_com->isOpen())
    {
        com_state = 1;
        my_com->setBaudRate(BAUD115200);
        my_com->setDataBits(DATA_8);
        my_com->setParity(PAR_NONE);
        my_com->setStopBits(STOP_1);
        my_com->setFlowControl(FLOW_OFF);
        my_com->setTimeout(50);
        return true;
    }
    else
    {
        com_state = 0;
        return false;
    }
}
void SerialService::readFromSerial() //从串口接收信息
{
    if(my_com && 1 == com_state)
    {
        QByteArray byte = my_com->readAll();
        if(!byte.isEmpty())
            emit receiveMsgFromSerial(byte);
    }
}

int SerialService::writeToSerial(const QByteArray &byte)//从串口发送信息
{
    if(my_com && 1 == com_state)
    {
        return my_com->write(byte);
    }
    return -1;
}

sockt通信

 socket = new QTcpSocket(this);
    socket->connectToHost(QHostAddress("192.168.1.104"), 8888);
    thread=new mythread(socket);
// 创建socket 要创建一个新的线程,其中通过槽函数来实现消息的发送和接收
    ui->msgInfo->append(mesg);
    if(UPLoad == OPEN)
    {
        QString str = mesg + "\r\n";
        socket->write(str.toAscii());
        socket->flush();
    }
//发送信息
mythread::mythread(QTcpSocket *sock)
{
    socket=sock;
    connect(socket,SIGNAL(readyRead()),this,SLOT(readMsg()));
}

void mythread::run()
{
    qDebug()<<socket->isOpen()<<endl;
}

void mythread::readMsg()
{
    QByteArray qdb=socket->readAll();
    QString msg = QString(qdb);
    qDebug()<<msg<<" is the sent msg!"<<endl;
    emit sendMsg(msg);
}
//接收信息,并调用槽函数来调用相应的函数

串口信息的接收

//一部分的代码的展示,具体的代码可以下载来看
void MainWindow::handleMSG(QByteArray msg)
{
    if(msg.length() < 6)
        return ;

    //温度传感器
    if(0x02 == msg[3] && 0x01 == msg[4])
    {
        QString str = "";
        if(0x01 == msg[2]) //1号传感器
        {
            timer3->start(timeBlock);

            tempA->ValueOf(msg);
            templist.replace(0,tempA);
            if(kas++ >= 10)
            {
                kas = 0;
                //emit goMsg("Update temphumlight A value!");
            }
        }
}

对于串口接收的数据,有一些需要做一些特殊的处理,例如温湿度模块发送的信息,我们需要经过计算才可以得到信息

void Temp_Humi_Ligh::ValueOf(QByteArray &msg)
{
    unsigned char XH = msg[5], XL = msg[6];
    unsigned char YH = msg[7], YL = msg[8];
    unsigned char GH = msg[9], GL = msg[10];

    temperature = XH*256 + XL;
    humidity    = YH*256 + YL;
    light       = 1.0*(GH*256 + GL)*3012.9/(32768*4);
}

对于qt的背景图的添加我会在另外的一个博客中写到

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值