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 串口收发实例代码的更多相关文章
- STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)——CubeMx生成初始代码
STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)--CubeMx生成初始代码 关键词:STM32F103C8T6 CubeMX UART 详细程序设计 1.开发环境 (1)ST ...
- Android单片机与蓝牙模块通信实例代码
Android单片机与蓝牙模块通信实例代码 参考路径:http://www.jb51.net/article/83349.htm 啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通 ...
- [ZigBee] 8、ZigBee之UART剖析·二(串口收发)
前言:上一节讲UART基本知识介绍完了,并深入剖析了一个串口发送工程,本节将进一步介绍串口收发! 1.初始化 在串口初始化部分,和上一节不同的地方是: 51 U0CSR |= 0x40; //允许接收 ...
- VS2015 +Qt5 串口工具
简单的小工具是VS2015 + Qt5.6.1实现的,界面部分是Qt实现,串口是封装的WinAPI,把串口收发模块封装成了个Serialport.dll 供Qt界面调用. 由于VS2015需要CRT运 ...
- Linux 虚拟串口及 Qt 串口通信实例
Linux 虚拟串口及 Qt 串口通信实例 2011-06-22 17:49 佚名 互联网 字号:T | T Linux 虚拟串口及 Qt 串口通信实例是本文所要介绍的内容,在实现过程中,打开了两个伪 ...
- stm32串口收发导致的死机
stm32串口收发导致的死机 很久以前有偶尔遇到过串口死机的情况,那是当时的我写出来的代码自己都觉得有问题,也就没注意.用了stm32做项目以后也就没遇到过了,今天做了个高压测试,每5ms定时发送一次 ...
- C++11 变长模版和完美转发实例代码
C++11 变长模版和完美转发实例代码 #include <memory>#include <iostream>#include <vector>#include ...
- PHP读取超大文件的实例代码
数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机 去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一 ...
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
随机推荐
- Android 开发框架介绍
一.概述 现android开发有很多开发框架使用,做App不一定用到框架,但好框架的思想也是值得学习.选择合适的开发框架可提供实用功能,简化项目开发提升效率. 二.Afinal框架 简介 Afinal ...
- delphi 对话框初始地址InitialDir
我的电脑:SaveDialog1.InitialDir := '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}';// My Computer {20D04FE0-3 ...
- ECshop 二次开发模板教程1
本教程适用于了解 ECshop 和 ECshop模板DIY 以及它们的日常使用,在查看前阁下需要至少会使用一种编辑器(exp:Dreamweaver, editplus, emacs, vi, ee ...
- 【转】从INF文件认识驱动
在工控机安装xp操作系统时,由于工控机的集成显卡驱动只支持win7,之前没接触过windows驱动相关内容,折腾了半天.下载的驱动是exe的,双击安装就提示安装失败(未签名) 上图是网上随便找的,现象 ...
- golang语言部分保留字的举例
golang和c的代码有很大不同的,一不小心就会误用. 1 /* go保留字: */ /* break default func interface select case defer go map ...
- 六种排序的C++实现
class SortNum { public: SortNum(); virtual ~SortNum(); void exchange(int& b,int& c);//交换数据 v ...
- hdu 3336 count the string(KMP+dp)
题意: 求给定字符串,包含的其前缀的数量. 分析: 就是求所有前缀在字符串出现的次数的和,可以用KMP的性质,以j结尾的串包含的串的数量,就是next[j]结尾串包含前缀的数量再加上自身是前缀,dp[ ...
- 将spfile存储在ASM中
数据库的spfile开始是存储在普通的文件系统中,如下所示: SQL> show parameter spfile NAME TYPE VALUE ----------------------- ...
- QT多线程笔记
1.QT多线程涉及到主线程和子线程之间交互大量数据的时候,使用QThread并不方便,因为run()函数本身不能接受任何参数,因此只能通过信号和槽的交互来获取数据,如果只是单方面简单交互数据还过得去, ...
- Top 5 Free Screen Recording Softwares For Windows
[转]Top 5 Free Screen Recording Softwares For Windows 该文章是转过来的,因为这里介绍了好几款免费的录制视频的软件.我自己需要使用,也许大家也有需求. ...