首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

QT5 串口收发范例代码

2013-10-29 
QT5 串口收发实例代码以下代码是自己测试门禁系统使用的主要用到了串口的接收和发送 开发环境:xpQT5.1.1串

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_OBJECTpublic:    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();}


 

热点排行