QT5 串口收发实例代码

以下代码是自己测试门禁系统使用的

主要用到了串口的接收和发送

 开发环境:xp  QT5.1.1

串口:38400   N  8  1

自动检测可用串口

 

在xp上测试没问题

有些usb转串口会出现波特率不准的问题,CH340的usb转232使用完全正常

以下为收发的线程.h 和.cpp两个文件

最后附上转sacii显示的代码

如果要参考的话,源代码已上传:http://download.csdn.net/detail/liang890319/6463227

 

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <stdio.h>
#include <QtGlobal>

class MyThread : public QThread
{
    Q_OBJECT
public:
    QByteArray requestData;
    QByteArray TxData;
    MyThread();

    void setMessage(const QString &message);
    void setPortnum(const QString &num);
    void stop();
    void startCom();
    void changeTxState(bool stat);
    void changeRxState(bool stat);
    void changeComState(bool stat);

signals:
    void request(const QString &s);
    void comRecive();



protected:
    void run();

private:
    QString messageStr;
    QString portnum;
    volatile bool com_opened;
    volatile bool stopped;
    volatile bool tx_event;
    volatile bool rx_event;
};

#endif // MYTHREAD_H


 

 

 

#include "mythread.h"
#include <QtDebug>
//FOR RS232
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

MyThread::MyThread()
{
   stopped=false;

}

void MyThread::run()
{
    QSerialPort *my_serialport= new QSerialPort;

    while(!stopped)
    {
        if(stopped&&com_opened)
        {
            my_serialport->close();
            com_opened=false;

        }
        if(!com_opened)
        {
            //open com
            qDebug() << "Brush:" <<"---open com port------";
            com_opened=true;
            my_serialport->setPortName(portnum);
            my_serialport->open(QIODevice::ReadWrite);
            my_serialport->setBaudRate(QSerialPort::Baud38400,QSerialPort::AllDirections);
            my_serialport->setDataBits(QSerialPort::Data8);
            my_serialport->setParity(QSerialPort::NoParity);
            my_serialport->setStopBits(QSerialPort::OneStop);
           // my_serialport->setStopBits(QSerialPort::TwoStop);
            my_serialport->setFlowControl(QSerialPort::NoFlowControl);
            com_opened=true;
        }
        if(this->com_opened&&this->tx_event)
        {
                this->tx_event=false;
                my_serialport->clear(QSerialPort::AllDirections);
                qDebug() << "Brush:" <<"send data to com2"<<this->TxData.length();
                qDebug() << "arr size:" <<this->TxData.length();
               my_serialport->write(this->TxData);
              if (my_serialport->waitForBytesWritten(5))
              {
                qDebug() << "Brush:" <<"send data success";
                if (my_serialport->waitForReadyRead(1500))  //1s
                {
                    requestData = my_serialport->readAll();
                    while (my_serialport->waitForReadyRead(15))
                    requestData += my_serialport->readAll();
                    emit(this->comRecive());
                }else
                {
                        qDebug() << "Brush:" <<"wait return time out";
                }
              }else
              {
                  qDebug() << "Brush:" <<"send time out";
              }
        }
    if (my_serialport->waitForReadyRead(5))  //50ms
    {
        while (my_serialport->waitForReadyRead(5))
        this->msleep(20);
        requestData = my_serialport->readAll();
        emit(this->comRecive());
    }
    if(stopped&&com_opened)
    {
        my_serialport->close();
        com_opened=false;
    }
    }
}

void MyThread::stop()
{
   stopped=true;

}
void MyThread::startCom()
{
   stopped=false;

}
void MyThread::changeComState(bool stat)
 {
        com_opened=stat;
}
void MyThread::setMessage(const QString &message)
{
   messageStr = message;

}
void MyThread::setPortnum(const QString &num)
{
    portnum=num;

}
void MyThread:: changeTxState(bool stat)
{
        tx_event=stat;
}
void MyThread:: changeRxState(bool stat)
{
         rx_event=stat;
}


 

显示部分 比如收到0xff  在text框显示 FF

void MainWindow::displayRxData()
{
    QString str;
    char tmp[100];
    char *buf;
    char var;
    QDateTime *datatime=new QDateTime(QDateTime::currentDateTime());
    if(threadA.requestData.size()>0)
   {
        str="收到数据: ";
        str+=datatime->time().toString();
        ui->textEdit_rx->append(str);
        str.clear();

        buf=threadA.requestData.data();
        if(buf[3]==0x01) ui->textEdit_tx->append("加卡成功!");
        if(buf[3]==0x02) ui->textEdit_tx->append("删卡成功!");
        if(buf[3]==0x03) ui->textEdit_tx->append("开门成功!");
        if(buf[3]==0x04) ui->textEdit_tx->append("关门成功!");
        qDebug() << "receive num:" <<threadA.requestData.size();
        for(var=0;var<threadA.requestData.size();var++)
        {
            ::snprintf(tmp,100, "%02X", (unsigned char)(*buf));
            buf++;
            str+=QString::fromUtf8(tmp);
            str+=" ";
        }
        ui->textEdit_rx->append(str);
    }
    threadA.requestData.clear();
}


 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值