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语言编写 ...
随机推荐
- Ruby基础数据类型
#数字分为证书Integer,浮点数Float(对应与其他语言中的double),和复数Complex #整数又分为Fixnum和Bignum,Fixnum和Bignum会互相转换,这些都是ruby自 ...
- C++ Primer学习_第1章
源文件后缀 在大多数的系统中,源文件的名字以一个后缀为结尾,后缀是由一个句点后接一个或多个字符组成的.后缀告诉系统这个文件是一个C++程序.不同编译器使用不同的后缀命名约定,最常见的包括.cc..cx ...
- [转] “error LNK2019: 无法解析的外部符号”之分析
HiLoveS原文“error LNK2019: 无法解析的外部符号”之分析 最近在用VS 2008开发,初学遇到不少问题,最头疼的问题之一就是:LNK2019. 百度一下讲的并不够全面,反正都没解决 ...
- UITextView 不左上角显示
在Autolayout中 UITextView显示不左上角显示,修改如下 在viewDidLoad里面添加如下代码 if([[[UIDevice currentDevice] systemVersio ...
- Linux基本命令(5)管理使用者和设立权限的命令
管理使用者和设立权限的命令 命令 说明 命令 说明 chmod 用来改变权限 useradd 用来增加用户 su 用来修改用户 5.1 chmod命令 chmod命令用来改变许可权限.读取.写 ...
- LeetCode题解——Roman to Integer
题目: 将罗马数字转换为整数. 解法: 可以参考上一篇数字转换为罗马数字的规则. 代码: class Solution { public: int sym2int(char sym) //罗马数字字符 ...
- 12306验证图片的bug
刚才有人告诉我12306验证码换了,于是我就打开了看了看,点了点.oh no , i am really sorry ,12306.
- java的math常用方法
鉴于java求整时欲生欲死,整理常用math如下: 1: java取整 a:floor向下取整 用法:Math.floor(num) Math.floor(1.9)//1 ...
- homework-01 最大子串和
题目描述 对于一个给定的数列,求该数列最大的子串和(连续) 问题分析 处理发生区间上的问题时,经常会用一个非常简单经典的思路——部分和(也有叫前缀和).部分和的思想在很多复杂的区间上的算法中都有应用, ...
- Spring JdbcTemplate Querying examples
Here are few examples to show you how to use JdbcTemplate query() methods to query or extract data f ...