QT5 串口收发实例代码
Posted 专注it
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
- }
以上是关于QT5 串口收发实例代码的主要内容,如果未能解决你的问题,请参考以下文章