QT5 串口收发实例代码

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

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

 开发环境:xp  QT5.1.1

串口:38400   N  8  1

自动检测可用串口

 

在xp上测试没问题

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

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

最后附上转sacii显示的代码

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

 

[cpp]  view plain  copy
 print?
  1. #ifndef MYTHREAD_H  
  2. #define MYTHREAD_H  
  3.   
  4. #include <QThread>  
  5. #include <stdio.h>  
  6. #include <QtGlobal>  
  7.   
  8. class MyThread : public QThread  
  9. {  
  10.     Q_OBJECT  
  11. public:  
  12.     QByteArray requestData;  
  13.     QByteArray TxData;  
  14.     MyThread();  
  15.   
  16.     void setMessage(const QString &message);  
  17.     void setPortnum(const QString &num);  
  18.     void stop();  
  19.     void startCom();  
  20.     void changeTxState(bool stat);  
  21.     void changeRxState(bool stat);  
  22.     void changeComState(bool stat);  
  23.   
  24. signals:  
  25.     void request(const QString &s);  
  26.     void comRecive();  
  27.   
  28.   
  29.   
  30. protected:  
  31.     void run();  
  32.   
  33. private:  
  34.     QString messageStr;  
  35.     QString portnum;  
  36.     volatile bool com_opened;  
  37.     volatile bool stopped;  
  38.     volatile bool tx_event;  
  39.     volatile bool rx_event;  
  40. };  
  41.   
  42. #endif // MYTHREAD_H  


 

 

 

[cpp]  view plain  copy
 print?
  1. #include "mythread.h"  
  2. #include <QtDebug>  
  3. //FOR RS232  
  4. #include <QtSerialPort/QSerialPort>  
  5. #include <QtSerialPort/QSerialPortInfo>  
  6.   
  7. MyThread::MyThread()  
  8. {  
  9.    stopped=false;  
  10.   
  11. }  
  12.   
  13. void MyThread::run()  
  14. {  
  15.     QSerialPort *my_serialport= new QSerialPort;  
  16.   
  17.     while(!stopped)  
  18.     {  
  19.         if(stopped&&com_opened)  
  20.         {  
  21.             my_serialport->close();  
  22.             com_opened=false;  
  23.   
  24.         }  
  25.         if(!com_opened)  
  26.         {  
  27.             //open com  
  28.             qDebug() << "Brush:" <<"---open com port------";  
  29.             com_opened=true;  
  30.             my_serialport->setPortName(portnum);  
  31.             my_serialport->open(QIODevice::ReadWrite);  
  32.             my_serialport->setBaudRate(QSerialPort::Baud38400,QSerialPort::AllDirections);  
  33.             my_serialport->setDataBits(QSerialPort::Data8);  
  34.             my_serialport->setParity(QSerialPort::NoParity);  
  35.             my_serialport->setStopBits(QSerialPort::OneStop);  
  36.            // my_serialport->setStopBits(QSerialPort::TwoStop);  
  37.             my_serialport->setFlowControl(QSerialPort::NoFlowControl);  
  38.             com_opened=true;  
  39.         }  
  40.         if(this->com_opened&&this->tx_event)  
  41.         {  
  42.                 this->tx_event=false;  
  43.                 my_serialport->clear(QSerialPort::AllDirections);  
  44.                 qDebug() << "Brush:" <<"send data to com2"<<this->TxData.length();  
  45.                 qDebug() << "arr size:" <<this->TxData.length();  
  46.                my_serialport->write(this->TxData);  
  47.               if (my_serialport->waitForBytesWritten(5))  
  48.               {  
  49.                 qDebug() << "Brush:" <<"send data success";  
  50.                 if (my_serialport->waitForReadyRead(1500))  //1s  
  51.                 {  
  52.                     requestData = my_serialport->readAll();  
  53.                     while (my_serialport->waitForReadyRead(15))  
  54.                     requestData += my_serialport->readAll();  
  55.                     emit(this->comRecive());  
  56.                 }else  
  57.                 {  
  58.                         qDebug() << "Brush:" <<"wait return time out";  
  59.                 }  
  60.               }else  
  61.               {  
  62.                   qDebug() << "Brush:" <<"send time out";  
  63.               }  
  64.         }  
  65.     if (my_serialport->waitForReadyRead(5))  //50ms  
  66.     {  
  67.         while (my_serialport->waitForReadyRead(5))  
  68.         this->msleep(20);  
  69.         requestData = my_serialport->readAll();  
  70.         emit(this->comRecive());  
  71.     }  
  72.     if(stopped&&com_opened)  
  73.     {  
  74.         my_serialport->close();  
  75.         com_opened=false;  
  76.     }  
  77.     }  
  78. }  
  79.   
  80. void MyThread::stop()  
  81. {  
  82.    stopped=true;  
  83.   
  84. }  
  85. void MyThread::startCom()  
  86. {  
  87.    stopped=false;  
  88.   
  89. }  
  90. void MyThread::changeComState(bool stat)  
  91.  {  
  92.         com_opened=stat;  
  93. }  
  94. void MyThread::setMessage(const QString &message)  
  95. {  
  96.    messageStr = message;  
  97.   
  98. }  
  99. void MyThread::setPortnum(const QString &num)  
  100. {  
  101.     portnum=num;  
  102.   
  103. }  
  104. void MyThread:: changeTxState(bool stat)  
  105. {  
  106.         tx_event=stat;  
  107. }  
  108. void MyThread:: changeRxState(bool stat)  
  109. {  
  110.          rx_event=stat;  
  111. }  


 

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

[cpp]  view plain  copy
 print?
  1. void MainWindow::displayRxData()  
  2. {  
  3.     QString str;  
  4.     char tmp[100];  
  5.     char *buf;  
  6.     char var;  
  7.     QDateTime *datatime=new QDateTime(QDateTime::currentDateTime());  
  8.     if(threadA.requestData.size()>0)  
  9.    {  
  10.         str="收到数据: ";  
  11.         str+=datatime->time().toString();  
  12.         ui->textEdit_rx->append(str);  
  13.         str.clear();  
  14.   
  15.         buf=threadA.requestData.data();  
  16.         if(buf[3]==0x01) ui->textEdit_tx->append("加卡成功!");  
  17.         if(buf[3]==0x02) ui->textEdit_tx->append("删卡成功!");  
  18.         if(buf[3]==0x03) ui->textEdit_tx->append("开门成功!");  
  19.         if(buf[3]==0x04) ui->textEdit_tx->append("关门成功!");  
  20.         qDebug() << "receive num:" <<threadA.requestData.size();  
  21.         for(var=0;var<threadA.requestData.size();var++)  
  22.         {  
  23.             ::snprintf(tmp,100, "%02X", (unsigned char)(*buf));  
  24.             buf++;  
  25.             str+=QString::fromUtf8(tmp);  
  26.             str+=" ";  
  27.         }  
  28.         ui->textEdit_rx->append(str);  
  29.     }  
  30.     threadA.requestData.clear();  
  31. }  

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT5串口编程可以用于编写简单的上位机,通过串口与下位机进行通信。下面是一个简单的上位机编写示例: 首先,要在QT项目中加入串口模块,可以通过在.pro文件中加入以下代码实现: ``` QT += serialport ``` 接下来,创建一个新的类,命名为SerialPort,继承自QObject,并添加以下代码: ```cpp #include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &SerialPort::readData); } void SerialPort::openPort(QString portName, qint32 baudRate) { serial->setPortName(portName); serial->setBaudRate(baudRate); if(serial->open(QIODevice::ReadWrite)) { qDebug() << "Serial port is open"; } else { qDebug() << "Serial port failed to open"; } } void SerialPort::closePort() { if(serial->isOpen()) { serial->close(); qDebug() << "Serial port is closed"; } } void SerialPort::readData() { QByteArray data = serial->readAll(); qDebug() << "Received data: " << data; // 在这里可以对接收到的数据进行处理 } void SerialPort::writeData(QByteArray data) { if(serial->isOpen()) { serial->write(data); qDebug() << "Sent data: " << data; } else { qDebug() << "Serial port is not open"; } } ``` 在主窗口中,可以使用SerialPort类的实例来控制串口的打开、关闭和数据的读写,可以通过按钮来触发相应的操作。下面是一个简单的主窗口实现: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new SerialPort(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::openPort); connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::closePort); connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendData); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openPort() { QString portName = ui->portComboBox->currentText(); qint32 baudRate = ui->baudRateComboBox->currentText().toInt(); serialPort->openPort(portName, baudRate); } void MainWindow::closePort() { serialPort->closePort(); } void MainWindow::sendData() { QString data = ui->sendLineEdit->text(); serialPort->writeData(data.toUtf8()); ui->sendLineEdit->clear(); } ``` 在QT设计器中,可以创建一个MainWindow窗口,包含一个QComboBox用于选择串口号,一个QComboBox用于选择波特率,一个QLineEdit用于输入发送的数据,以及几个QPushButton用于触发相应的操作。 以上就是一个简单的QT5串口编程的上位机实现,你可以根据具体的需求进行进一步的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值