posix_qextserialport.cpp
实验一 RFID设备调试及软件开发_学
实验一RFID读写器调试学号:姓名:一、实验目的1、学习各类RFID读卡器的使用。
2、掌握RFID读卡器程序设计的方法。
3、理解基于QT的RFID案例程序。
二、实验内容调试CBT-IOT赛百特物联网实验箱HF高频读卡器,对ISO14443A卡进行识别、数据操作,并分析其通信协议。
调试FR105 HF高频读卡器,对ISO15693、ISO14443A卡进行识别,以及数据操作,并分析其通信协议。
调试FR1200 UHF超高频读卡器,对ISO18000-6C卡进行识别,以及数据操作,并分析其通信协议。
调试基于各种RFID读卡器的QT程序,包括电子钱包、公交卡充值、上班刷卡考勤系统、车流量统计、药品出入库、电子锁控制等应用,分析程序与读卡器之间的串口通信。
三、实验预备知识1、CBT-IOT实验箱HF高频读写器CBT- IOT实验箱HF板载模块特点:●工作频率:13.56MHz●芯片:MF RC531(高集成非接触读写卡芯片)●支持ISO/IEC 14443A/B和MIFARE经典协议●支持mifare1 S50等多种卡类型●最大工作距离:100mm,最高波特率:424kb/s●支持lCrypto1加密算法并含有安全的非易失性内部密匙存储器●处理器 STM8S105高性能8位架构的微控制器,主频24MHz●通信方式:串口TTL,可直接插接无线通讯模块组网开发,多模块无线组网通讯●电源:DC 5V串口设置:波特率115200bps,数据位8,停止位1,无校验位通信协议:说明:SOF:固定为0xEE 0xCC,标志一帧的开始。
Sensor typle:传感器类型,RFID为0xFE。
Sensor id:固定为0x01,为RFID读卡器的编号。
Cmd id:命令ID,0x01为充值,0x02为扣款,0x03为查询。
ID0~3:4 字节卡号DATA0~3:4 字节数据END:固定为0xFF,标志一帧的结束。
CBT-IOT HF RFID模块充值扣费功能通信协议详细说明:识别:发送:不用发送指令,读卡器一直在不停的读卡返回:EE CC FE 01 03 XX XX XX XX XX XX XX XX FF充值:发送:CC EE FE 01 01 XX XX XX XX FF (ID省略)返回:EE CC FE 01 01 XX XX XX XX XX XX XX XX FF扣款:发送:CC EE FE 01 02 XX XX XX XX FF (ID省略)返回:EE CC FE 01 02 XX XX XX XX XX XX XX XX FF2、FR105 HF高频读写器FR105读卡器特点:●工作频率:13.56MHz●支持协议:ISO15693、ISO14443A协议●读卡距离:10cm●电源:DC 5V1A●通信接口:RS232串口串口设置:波特率115200/57600bps,数据位8,停止位1,无校验位3、FR1200 UHF超高频读写器FR1200 超高频读写器特点:●工作频率:902~928MHz(可根据用户需要定制)●工作方式:以广谱跳频或定频发射方式●射频功率:10~30dBm●支持协议:ISO-18000-6C(EPC G2)标准●读卡距离:3-5米(和标签及天线有关)●平均功耗:小于10瓦●电源:DC 5V2A●通信接口:RS232串口设置:波特率57600bps,数据位8,停止位1,无校验位通信协议:发送指令:SOF LEN CMD [DATA] END接收数据:SOF LEN CMD STATUS [DATA] END解释:SOF:固定为0xAA,数据帧的起始标志。
qserialport方法
qserialport方法(最新版3篇)篇1 目录1.QSerialPort 类的概述2.QSerialPort 的主要功能3.QSerialPort 的基本使用方法4.QSerialPort 的信号与槽函数5.QSerialPort 的常见错误与处理篇1正文一、QSerialPort 类的概述QSerialPort 是 Qt 框架中的一个类,用于实现串行通信。
它可以让开发者方便地通过串口与其他设备进行数据传输,如接收或发送数据。
QSerialPort 类继承自 QIODevice 类,因此具有 QIODevice 类的所有功能,同时还提供了一些特定的串行通信方法。
二、QSerialPort 的主要功能QSerialPort 类提供了以下主要功能:1.打开和关闭串行端口:可以使用 open() 方法打开串行端口,使用close() 方法关闭串行端口。
2.读取和发送数据:可以使用 read() 和 write() 方法进行数据的读取和发送。
3.设置和获取端口参数:可以设置端口的波特率、数据位、停止位和校验位等参数,也可以获取当前端口的参数。
4.控制数据流:可以使用 setFlowControl() 和 getFlowControl() 方法控制数据流的方向和状态。
5.异步通信:可以使用 asyncRead() 和 asyncWrite() 方法进行异步读写操作。
三、QSerialPort 的基本使用方法使用 QSerialPort 类进行串行通信的基本步骤如下:1.创建一个 QSerialPort 对象,指定端口名称。
2.使用 open() 方法打开端口,并检查是否成功打开。
3.设置端口参数,如波特率、数据位、停止位和校验位等。
4.使用 read() 或 asyncRead() 方法读取数据,使用 write() 或asyncWrite() 方法发送数据。
5.在通信完成后,使用 close() 方法关闭端口。
Qt串口通信编程开发环境配置
Qt串口通信编程开发环境配置目录1 开发环境 (1)1.1 编程环境 (1)1.2 工程设置 (1)1.3 调试窗口设置 (2)1.4 依赖库 (2)1.5 源代码的适配 (2)2 运行及硬件环境 (3)2.1 串口设备 (3)2.2 虚拟串口工具 (3)2.3 串口调试助手 (3)2.4 运行支持文件 (3)3 第三方串口库的生成 (4)3.1 打开源码里的工程 (4)3.2 qextserialport源码问题解决 (4)4 故障解决 (5)4.1 转到槽函数失败 (5)积分下载本文档可免费提供技术支持。
1 开发环境1.1 编程环境工程采用Windows系统下的Qt Creator开发环境,Qt版本5.10.1(Qt的较新版,Bug 较少,支持串口库,图形库QChart),安装文件qt-opensource-windows-x86-5.10.1.exe安装的编译器采用MinGW32. 。
MARK32000-采用的串口时Qt自带串口库QSerialPort,若需第三方串口库可自行编译。
1.2 工程设置工程设置:在XXXX.pro文件中添加下面两行:QT += serialport #添加Qt串口支持CONFIG += console #显示控制台提示窗口,以方便调试,注释掉即可不显示黑色命令提示框如果采用第三方的串口库(本软件不含第三方库源代码),而不采用Qt的串口库,则要添加如下工程:INCLUDEPATH += qextserialport-1.2win-alphaLIBS += -L "../SerialProtocol/qextserialport-1.2win-alpha/build/" -lqextserialportd若路径找不到,可改成绝对路径。
相对路径基于项目生成的build路径,需要将第三方串口库“qextserialport”的生成文件“build”目录下的qextserialportd.a .dll拷贝到build-SerialProtocol-Desktop_Qt_5_10_1_MinGW_32bit-Debug目录下。
SerialPort.cpp
CloseHandle( m_hShutdownEvent);
if(m_ov.hEvent!=NULL)
CloseHandle( m_ov.hEvent );
if(m_hWriteEvent!=NULL)
CloseHandle( m_hWriteEvent );
; // normal operation... continue
else
ProcessErrorMessage("SetCommState()");
}
else
ProcessErrorMessage("BuildCommDCB()");
return TRUE;
}
//
// The CommThread Function.
//
UINT CSerialPort::CommThread(LPVOID pParam)
{
// Cast the void pointer passed to the thread back to
0, // comm devices must be opened with exclusive access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
}
else
ProcessErrorMessage("GetCommState()");
}
else
ProcessErrorMessage("SetCommMask()");
Qt串口通信开发之Qt串口通信模块QSerialPort开发完整实例(串口助手开发)
Qt串⼝通信开发之Qt串⼝通信模块QSerialPort开发完整实例(串⼝助⼿开发)之前⾃⼰写了⽤于上位机做基本收发的界⾯,独⽴出来相当于⼀个串⼝助⼿,先贴图:功能作为串⼝助⼿来说还算完善,五个发送槽,⼀个接收槽,可以检测可⽤串⼝并加上相关标志,串⼝设置,记数功能,还有菜单栏上的⽂件操作和⼀些选择功能。
下⾯说⼀说这个项⽬:做这个串⼝助⼿分为两步,第⼀步是设计界⾯,第⼆部是功能的代码实现。
⼀、界⾯设计界⾯设计⽤Qt Designer,当然⽤Qt Creator的界⾯编辑器也可以,只不过感觉Qt Designer更好⽤⼀点,因为可以随时运⾏查看你的界⾯效果⽽不⽤编译整个项⽬输出⼀个可执⾏程序再看看界⾯效果,这样会影响效率。
界⾯设计你想界⾯是什么样就怎么样设计,拉控件,排版,设置⼤⼩,修改对象名等等,都在这上⾯做好,这些⽤程序写的话会很⿇烦,⼯作量也⼤。
这上⾯的对象名很重要,因为在后⾯的代码实现中会⽤到,这个界⾯⽤到的控件还是挺多的,这⾥也不⼀个⼀个讲,我直接贴出来:senderGB_1 - 5都是⼀样的,改下数就⾏当然,⽤你⾃⼰喜欢的命名也可以,后⾯程序改下名字就⾏。
⼆、代码实现先贴代码basictransceiver.h#ifndef BASICTRANSCEIVER_H#define BASICTRANSCEIVER_H#include <QMainWindow>#include "ui_basictransceiver.h"class QTimer;class SerialPortSetting;class QSerialPort;class QPushButton;class BasicTransceiver : public QMainWindow, public Ui::BasicTransceiver{Q_OBJECTpublic:explicit BasicTransceiver(QWidget *parent = 0);~BasicTransceiver();void StringToHex(QString str, QByteArray &senddata);char ConvertHexChar(char ch);void startAutoSend(QPushButton *sendButton);void setConnections();void writeHex(QTextEdit *textEdit);void writeChr(QTextEdit *textEdit);void resetCnt();protected:void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event);private slots:void checkAutoSendCB();void on_cleanButton_clicked();void on_receiveTextBrowser_textChanged(); void setBaudRate();void setParity();void setDataBits();void setStopBits();void setFlowCtrl();void on_connectButton_toggled(bool checked); void setComLabel();void setBaudLabel();void writeToBuf();void enabledSendButton();void disabledSendButton();void enabledAutoSend();void disabledAutoButton();void resetAutoSendCB();void readMyCom();void checkAvailablePorts();void on_checkAPButton_clicked();void checkPort();void on_resetCntButton_clicked();void on_exitButton_clicked();bool saveAs();void open();//void about();private:bool loadFile(const QString &fileName);bool readFile(const QString &fileName);bool saveFile(const QString &fileName);bool writeFile(const QString &fileName);QTimer *Timer_AS;//⾃动发送定时器QTimer *Timer_UPDATE;QTimer *Timer_CP;//定时检测串⼝是否存在SerialPortSetting *SPSetting;QSerialPort *mySerialPort;QSet<QString> portSet;QVector<int> iVec;QString senderFlag;QString readData;bool trashFlag = false;bool portIsOpen = false;int BaudCnt = 0;int ParityCnt = 0;int DataBitsCnt = 0;int StopBitsCnt = 0;int FlowCtrlCnt = 0;};#endif // BASICTRANSCEIVER_Hbasictransceiver.cpp#include "basictransceiver.h"#include "serialportsetting.h"#include "ui_basictransceiver.h"#include "ui_serialportsetting.h"#include <QtSerialPort/QSerialPort>#include <QtSerialPort/QSerialPortInfo>#include <QDebug>#include <QMessageBox>#include <QStatusBar>#include <QPushButton>#include <QByteArray>#include <QDataStream>#include <QTimer>#include <QRegExp>#include <QRegExpValidator>#include <QFile>#include <QFileDialog>#include <QDragEnterEvent>#include <QDropEvent>#include <QMimeData>#include <QAction>BasicTransceiver::BasicTransceiver(QWidget *parent) :QMainWindow(parent){setupUi(this);setFixedSize(1074, 627);receiveTextBrowser->setAcceptDrops(false);//缺省情况下,QTextEdit接受来⾃其他应⽤程序拖拽来的⽂本,把⽂件名显⽰出来。
qserialport高级编程
qserialport高级编程QSerialPort是Qt框架中用于串口通信的类,它提供了一种方便的方式来在Qt应用程序中进行串口通信。
在进行QSerialPort高级编程时,我们可以从以下几个方面来全面了解和使用它:1. 打开和关闭串口,使用QSerialPort类可以很容易地打开和关闭串口。
在打开串口时,我们可以设置串口的参数,如波特率、数据位、停止位和校验位等。
而在关闭串口时,我们需要确保在不需要使用串口时及时关闭,以释放资源。
2. 读写数据,QSerialPort类提供了read和write方法来进行数据的读取和写入。
在高级编程中,我们可以通过设置超时时间、使用信号槽机制等方式来确保数据的稳定和准确的读写。
3. 错误处理,在串口通信中,可能会出现各种错误,如串口无法打开、数据传输超时、校验错误等。
在高级编程中,我们需要考虑如何处理这些错误,可以通过捕获错误码、设置错误处理策略等方式来保证程序的稳定性和可靠性。
4. 事件驱动,QSerialPort类支持事件驱动的串口通信,我们可以利用信号槽机制来处理串口事件,比如数据到达事件、错误事件等。
在高级编程中,我们可以充分利用事件驱动的特性来实现更加灵活和高效的串口通信。
5. 跨平台兼容性,Qt框架具有良好的跨平台兼容性,因此使用QSerialPort进行高级编程时,可以在不同的操作系统上实现相似的串口通信功能,这为开发者提供了很大的便利。
总之,QSerialPort类提供了丰富的API和功能,可以满足各种复杂的串口通信需求。
在进行高级编程时,我们需要充分了解其特性和用法,从多个角度全面考虑和处理各种情况,以确保程序的稳定性和可靠性。
基于linux和Qt的串口通信调试器调的设计及应用
基于linux和Qt的串口通信调试器调的设计及应用摘要:目前基于Linux操作系统的应用开发越来越广泛,Qt是一个跨平台的C++图形用户界面应用程序框架,它可以开发基于Linux上的图形应用程序。
Linux操作系统对串行口提供了很好的支持,为了在Linux系统下能让串口与其它硬件设备方便直观地进行通信,本文介绍了在Ubuntu10.10系统平台Qt-4.7及Qt Creator2.0编程环境下串口调试界面的设计及程序的编写。
关键词:串口通信Linux QT1 Qextserialport 类介绍在Qt类库中并没有特定的串口基础类,现在很多人使用的是第三方写的qextserialport类,它是一个跨平台的串口类,可以很方便地在Qt 中对串口进行读写操作。
本文也使用了该类。
文件下载地址: /projects/qextserialport/files/下载到的文件名为qextserialport-1.2win-alpha。
在linux平台中,我们只需用到其中的四个文件:qextserialbase.cpp和qextserialbase.h以及posix_qextserialport.cpp和posix_qextserialport.h。
其中前两个文件定义了一个QextSerialBase 类,它提供了操作串口所必需的一些变量和函数等;后两个文件定义了一个Posix_QextSerialPort 类,Posix_QextSerialPort类添加了Linux平台下操作串口的一些功能。
2 串口的基本设置串口的基本参数在posix_qextserialport.cpp文件里的构造函数中进行设置,它的最后一个构造函数:Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings&settings, QextSerialBase::QueryMode mode)它共有3个参数,第一个是串口名,第二个是对串口参数的基本设置,第三个是读取串口的方式。
串口类serialport的头文件和cpp文件详细代码
DECLARE_DYNAMIC(CSerialPort)
};
#endif //__SERIALPORT_H__
/*
Module : SERIALPORT.CPP
Purpose: Implementation for an MFC wrapper class for serial ports
void CancelIo();
//Configuration Methods
void GetConfig(COMMCONFIG& config);
static void GetDefaultConfig(int nPort, COMMCONFIG& config);
void SetConfig(COMMCONFIG& Config);
void GetStatus(COMSTAT& stat);
void GetState(DCB& dcb);
void SetState(DCB& dcb);
void Escape(DWORD dwFunc);
void ClearDTR();
void ClearRTS();
Created: PJN / 31-05-1999
History: PJN / 03-06-1999 1. Fixed problem with code using CancelIo which does not exist on 95.
2. Fixed leaks which can occur in sample app when an exception is thrown
PJN / 29-09-1999 1. Fixed a simple copy and paste bug in CSerialPort::SetDTR
Qt编写串口通信程序全程图文讲解
Qt编写串口通信程序全程图文讲解(一)(原创)首先说明我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动。
在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport 类,我们这里也是使用的该类。
我们可以去/projects/qextserialport/files/进行下载,也可以去下载论坛上的/bbs/read.php?tid=22847下载到的文件为:qextserialport-1.2win-alpha.zip其内容如下图:我们在windows下只需要使用其中的6个文件:qextserialbase.cpp和qextserialbase.h,qextserialport.cpp和qextserialport.h,win_qextserialport.cpp和win_qextserialport.h如果在Linux下只需将win_qextserialport.cpp和win_qextserialport.h 换为posix_qextserialport.cpp和posix_qextserialport.h即可。
下面我们将讲述详细编程过程,这里我们先给出完整的程序,然后再进行逐句分析。
1.打开Qt Creator,新建Qt4 Gui Application,工程名设置为mycom,其他使用默认选项。
(注意:建立的工程路径不能有中文。
)2.将上面所说的6个文件复制到工程文件夹下,如下图。
3.在工程中添加这6个文件。
在Qt Creator中左侧的文件列表上,鼠标右击工程文件夹,在弹出的菜单中选择Add Existing Files,添加已存在的文件。
如下图:选择工程文件夹里的那6个文件,进行添加。
如下图。
添加好后文件列表如下图所示:4.点击mainwindow.ui,在窗口上加入一个Text Browser,用来显示信息。
Qt5 嵌入式GUI开发_web_
Qt5 嵌入式GUI开发1.开发工具操作系统版本:使用linux主机安装Ubuntu14.04 的64位版本操作系统。
Qt版本:qt-opensource-linux-x64-5.6.0.run交叉编译工具链:poky1.7.tar.bz22. 开发环境搭建:(1)安装Qt集成开发工具启动终端,进入 qt-opensource-linux-x64-5.6.0.run 所在目录#./qt-opensource-linux-x64-5.6.0.run进行安装(2)进入poky1.7.tar.bz2所在目标解压该文件到 /opt/# tar -jxvf poky1.7.tar.bz2 -C /opt解压后再/opt/出现 poky 文件夹3.编写程序(1) 启动qtcreator 在集成开发工具里编写完软件,先用pc 编译器编译,检查并修改错误,查看效果。
(2) 用交叉编译工具链编译成可在ARM开发板上运行的二进制文件设置环境变量:source /opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi 进入工程目录:#cd /home/chen/qtcode/qt5test2#lscontent.cpp qextserialbase.h ttytest.hcontent.h qt5test2.pro usbtest.cppmain.cpp er usbtest.hMakefile er.2.1pre1 vgatestclass.cppposix_qextserialport.cpp satatest.cpp vgatestclass.hposix_qextserialport.h satatest.hqextserialbase.cpp ttytest.cpp查看下qmake 工具的版本# qmake -vQMake version 3.0Using Qt version 5.3.2 in /opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr /lib生产Makefile 文件#qmak *.pro //*即是项目名按TAB键会自动补全#make编译完后,在当前文件夹下生成 qt5test 程序。
Qt串口通信编程开发环境配置
Qt串口通信编程开发环境配置目录1 开发环境 (1)1.1 编程环境 (1)1.2 工程设置 (1)1.3 调试窗口设置 (2)1.4 依赖库 (2)1.5 源代码的适配 (2)2 运行及硬件环境 (3)2.1 串口设备 (3)2.2 虚拟串口工具 (3)2.3 串口调试助手 (3)2.4 运行支持文件 (3)3 第三方串口库的生成 (4)3.1 打开源码里的工程 (4)3.2 qextserialport源码问题解决 (4)4 故障解决 (5)4.1 转到槽函数失败 (5)积分下载本文档可免费提供技术支持。
1 开发环境1.1 编程环境工程采用Windows系统下的Qt Creator开发环境,Qt版本5.10.1(Qt的较新版,Bug 较少,支持串口库,图形库QChart),安装文件qt-opensource-windows-x86-5.10.1.exe安装的编译器采用MinGW32. 。
MARK32000-采用的串口时Qt自带串口库QSerialPort,若需第三方串口库可自行编译。
1.2 工程设置工程设置:在XXXX.pro文件中添加下面两行:QT += serialport #添加Qt串口支持CONFIG += console #显示控制台提示窗口,以方便调试,注释掉即可不显示黑色命令提示框如果采用第三方的串口库(本软件不含第三方库源代码),而不采用Qt的串口库,则要添加如下工程:INCLUDEPATH += qextserialport-1.2win-alphaLIBS += -L "../SerialProtocol/qextserialport-1.2win-alpha/build/" -lqextserialportd若路径找不到,可改成绝对路径。
相对路径基于项目生成的build路径,需要将第三方串口库“qextserialport”的生成文件“build”目录下的qextserialportd.a .dll拷贝到build-SerialProtocol-Desktop_Qt_5_10_1_MinGW_32bit-Debug目录下。
基于linux (fedora 17)的QT串口通信实例
2.解压下载的文件到当前目录
# unzip qextserialport-1.2win-alpha.zip
这里不对压缩包内的详细信息及qextserialport类的结构做详细介绍,直接说明需要用到的源文件
linux下:
myCom->setParity(PAR_NONE);
//奇偶校验设置,我们设置为无校验
myCom->setStopBits(STOP_1);
//停止位设置,我们设置为1位停止位
myCom->setFlowControl(FLOW_OFF);
//数据流控制设置,我们设置为无数据流控制
ui(new Ui::MainWindow){
ui->setupUi(this);
//myCom = new Win_QextSerialPort("COM1",QextSerialBase::EventDriven);
//【windows下使用】定义串口对象,指定串口名和查询模式,这里使用事件驱动EventDriven
3.打开Qt Creator集成开发环境,新建工程Qt4 Gui Application ,工程名为com ,其他默认即可。
4.将上述linux下需要用到的4个文件拷贝至com工程目录下,然后将该4个文件添加至工程。
5.将整个工程编译,会报错如下:
error: 'struct PortSettings' has no member named 'Timeout_Sec'
qextserialbase.cpp qextserialbase.h posix_qextserialport.cpp posix_qextserialport.h
Qt实现串口通信总结
Qt实现串⼝通信总结注意: Qt5发布之前,Qt实现串⼝通信⼀般是采⽤第三⽅类库qextserialport。
Qt5发布后⾃带了能够⽀持串⼝通信。
1、Qextserialport类介绍在Qt5之前的版本中并没有特定的串⼝控制类,现在⼤部分⼈使⽤的是第三⽅写的qextserialport类,本⽂章主要是讲解怎样利⽤此类实现串⼝通信。
2、⽂件下载地址:最新⽂件下载在⽂章最后!3、⽂件内容:3.1.下载到的⽂件为qextserialport-1.2win-alpha ,解压并打开后其内容如下。
(1)doc⽂件夹中的⽂件内容是QextSerialPort类和QextBaseType的简单的说明,我们可以使⽤记事本程序将它们打开。
(2)examples⽂件夹中是⼏个例⼦程序,可以看⼀下它的源码,不过想运⾏它们好像会出很多问题啊。
(3)html⽂件夹中是QextSerialPort类的使⽤⽂档。
(4)然后就是剩下的⼏个⽂件了。
其中qextserialenumerator.cpp及qextserialenumerator.h⽂件中定义的QextSerialEnumerator类是⽤来获取平台上可⽤的串⼝信息的。
不过,这个类好像并不怎么好⽤,⽽且它不是我们关注的重点,所以下⾯就不再介绍它了。
(5)qextserialbase.cpp和qextserialbase.h⽂件定义了⼀个QextSerialBase类,win_qextserialport.cpp和win_qextserialport.h⽂件定义了⼀个Win_QextSerialPort类,posix_qextserialport.cpp和posix_qextserialport.h⽂件定义了⼀个Posix_QextSerialPort类,qextserialport.cpp 和qextserialport.h⽂件定义了⼀个QextSerialPort类。
Qt串口通信开发之QSerialPort模块Qt串口通信接收数据不完整的解决方法
Qt串⼝通信开发之QSerialPort模块Qt串⼝通信接收数据不完整的解决⽅法在使⽤串⼝接收数据时,当数据量⼤的时候会出现数据接收不完整的情况。
因为串⼝数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串⼝读到起始标志时⽴即发送,并不保证⼀定是当前所发数据的起始部分。
因此串⼝通信双⽅在通信前应制定好通信协议,规定好数据的起始和结束标志,串⼝当读到完整的起始和结束标志之后,才认定读完⼀条完整的数据。
本例中⽤串⼝定时发送当前时间,⽤"#"表⽰数据的结尾,定时时间为0毫秒,即能发多快就发多快。
发送void Widget::slotSendData(){QByteArray temp;temp.append(getCurrentTime());temp.append("#");serialPort->write(temp);}接收void Widget::slotReadData(){QByteArray temp = serialPort->readAll();if(!temp.isEmpty()){byteArray.append(temp);if(byteArray.contains("#")){ui->textEditReceive->setText(byteArray.split('#').at(0));byteArray = byteArray.right(byteArray.length()-byteArray.indexOf('#')-1);}}}下⾯是⼀个通过串⼝传输图⽚的例⼦这⾥假设波特率为9600,那么⼀秒钟就能传输9600/8=1200字节。
代码中将定时器设置为1秒,所以选择的图⽚应该⼩于1200字节。
这⾥为了演⽰如何完整接收数据,将图⽚按照指定⼤⼩分段发送,在每段之后紧接着发送字符串“###”。
Qt自动获取系统串口列表
以前写的串口通讯的工具,最近没事整理了一下记录下来。
由于Qt没有实现关于串口操作的类,所以一般情况下可以自己写线程实现,也可以使用第三方类。
这里使用第三方类。
可以到网上去下载,也有关于这个第三方类的介绍。
这里不多说了,在win 下,主要就是下载这几个文件:qextserialbase.h,qextserialport.h,win_qextserialport.h,qextserialbase.cpp,qextserialport.cpp,win_qextserialport.cpp。
如果是在linux下,则把win_qextserialport.h和win_qextserialport.cpp替换为posix_qextserialport.h和posix_qextserialport.cpp这两个文件即可。
自动识别COM口:通过读注册表实现(当然linux下不可用)。
class mainwindow : public QMainWindow,public Ui_mainwindowClass{Q_OBJECTpublic:mainwindow();~mainwindow(){};public:QString getcomm(int index,QString keyorvalue); //读取键名private:void init_com();Win_QextSerialPort *myCom;//声明对象QTimer *timer;QStringList m_listCommand; //待发送的命令wchar_t subkey[80];wchar_t keyname[256]; //键名数组char keyvalue[256]; //键值数组int indexnum;DWORD keysize,type,valuesize;HKEY hKey;......}void mainwindow::init_com(){QStringpath="HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM";QSettings *settings=newQSettings(path,QSettings::NativeFormat);QStringList key=settings->allKeys();QStringList comlist ;QStringList Baudlist ;QStringList Paritylist ;QStringList DataBitslist;QStringList StopBitslist;QStringList ControlFlowlist;int kk = key.size();int i;comlist.clear();for(i=0;i<kk;i++){comlist << getcomm(i,"value");}comboBox->addItems(comlist);//波特率Baudlist.clear();Baudlist<< "300"<< "600"<< "2400"<< "4800"<< "9600"<< "19200" <<"56000"<< "57600"<<"115200"<<"128000"<<"256000"<< "921600";baudRateComboBox->addItems(Baudlist);......}QString mainwindow::getcomm(int index,QString keyorvalue){QString commresult="";QString strkey="HARDWARE\\DEVICEMAP\\SERIALCOMM";//子键路径int a=strkey.toWCharArray(subkey);subkey[a]=L'\0';if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ|KEY_QUER Y_VALUE,&hKey)!=0){QString error="Cannot open regedit!";}QString keymessage="";//键名QString message="";QString valuemessage="";//键值indexnum=index;//要读取键值的索引号keysize=sizeof(keyname);valuesize=sizeof(keyvalue);if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYT E*)keyvalue,&valuesize)==0){//读取键名for(int i=0;i<keysize;i++){message=QString::fromStdWString(keyname);keymessage.append(message);}//读取键值for(int j=0;j<valuesize;j++){if(keyvalue[j]!=0x00){valuemessage.append(keyvalue[j]);}}if(keyorvalue=="key"){commresult=keymessage;}if(keyorvalue=="value"){commresult=valuemessage;}}else{commresult="nokey";}::RegCloseKey(hKey);//关闭注册表return commresult;}接下来便是打开并设置串口,注意,写串口程序时要先打开串口,然后再对它进行设置,否则设置就不会起作用。
qserialport readyread 机制
qserialport readyread 机制主题:qserialport readyread机制QSerialPort是Qt库提供的用于串口通信的类,其readyRead机制是QSerialPort类的一个重要特性。
readyRead机制允许开发者在接收到串口数据时触发特定的槽函数,从而处理这些数据。
本文将逐步回答以下问题,以帮助读者更好地了解qserialport readyread机制的工作原理和使用方法:1. 什么是QSerialPort?2. 为什么需要readyRead机制?3. readyRead机制的工作原理是什么?4. 如何使用readyRead机制进行串口数据的接收和处理?5. 如何处理接收到的串口数据?1. 什么是QSerialPort?QSerialPort是Qt库提供的用于串口通信的类,其封装了与串口通信相关的方法和属性,方便开发者进行串口通信的操作。
通过QSerialPort类,我们可以简化串口通信的代码编写和调试工作。
2. 为什么需要readyRead机制?在串口通信中,数据的接收是一个异步的过程。
也就是说,当我们发送一个串口数据后,不一定能立即接收到完整的数据。
为了解决这个问题,我们需要一种机制来实时监控串口数据的接收情况,并及时处理接收到的数据。
readyRead机制就是为了满足这个需求而设计的。
3. readyRead机制的工作原理是什么?readyRead机制通过信号和槽的方式实现。
当串口接收到新的数据时,QSerialPort类会发出readyRead信号,开发者可以将这个信号与特定的槽函数连接起来。
一旦readyRead信号触发,相应的槽函数就会被调用,从而实现对接收到的数据的处理。
4. 如何使用readyRead机制进行串口数据的接收和处理?要使用readyRead机制进行串口数据的接收和处理,我们需要按照以下步骤进行操作:步骤1:创建QSerialPort对象首先,我们需要创建一个QSerialPort对象,该对象用于进行串口通信的设置和操作。
qserialport用法
qserialport用法`QSerialPort` 类是 Qt 框架提供的用于串口通信的类。
它允许我们与连接到计算机的串口设备进行通信,可以发送和接收数据。
以下是 `QSerialPort` 的主要用法:1. 创建 `QSerialPort` 对象:```cppQSerialPort serialPort;```2. 配置串口参数,比如波特率、数据位、校验位、停止位等:```cppserialPort.setPortName("COM1"); // 设置串口名serialPort.setBaudRate(QSerialPort::Baud115200); // 设置波特率serialPort.setDataBits(QSerialPort::Data8); // 设置数据位serialPort.setParity(QSerialPort::NoParity); // 设置校验位serialPort.setStopBits(QSerialPort::OneStop); // 设置停止位```3. 打开串口:```cppif (serialPort.open(QIODevice::ReadWrite)) {// 串口打开成功} else {// 串口打开失败}```4. 从串口读取数据:```cppQByteArray data = serialPort.readAll(); // 读取串口缓冲区的所有数据```5. 向串口写入数据:```cppQByteArray data = "Hello, Serial Port!";serialPort.write(data); // 往串口缓冲区写入数据```6. 关闭串口:```cppserialPort.close();```当然,以上只是一个简单的用法示例,`QSerialPort` 还提供了许多其他用于串口通信的方法,可以根据需求进行使用,比如检测串口是否可用、读取特定数量的数据、等待数据接收等。
Qt串口学习笔记
Qt串口学习笔记
2013-4-25 最近因为自己的毕设,需要用到qt设计一个软件的界面环境,并移植到开发板上,在网上找到了不少资料,软件方面学习了不少。
如下是自己的一点学习笔记。
自己同样是使用的高手写的qextserialport类,这个串口驱动库是基于qt4编写的,而由于自己是用的是win下最新的qt5,所以有一些qt功能升级不支持了,出现的问题修改如下:
1、
toAscii方法需要修改成toLatin1方法
如win_qextserialport.cpp文件中的 port.toAscii()等
qt源码升级更改如下
#if QT_DEPRECATED_SINCE(5,0)
QT_DEPRECATED char toAscii() const {return QChar(*this).toLatin1();}
#endif
2、
//send串口发送数据时
myCom->write(ui->sendMsgLineEdit->text().toAscii());
经自己差资料尝试,需要修改为
myCom->write(ui->sendMsgLineEdit->toPlainText().toLatin1());
3、
由于自己不是学习软件的,好多的知识点仍然不懂,直到最后程序还是不能识别中文,无法使用中文的选项。
如tr("无"),tr("奇")等。
/yafeilinux/article/details/4717706。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
memcpy(&Posix_CommConfig, &s.Posix_CommConfig, sizeof(struct termios));
Override the = operator.
*/
Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s)
{
setOpenMode(s.openMode());
port = s.port;
return *this;
}
void Posix_QextSerialPort::init()
{
if (queryMode() == QextSerialBase::EventDriven)
qWarning("POSIX doesn't have event driven mechanism implemented yet");
: QextSerialBase()
{
setBaudRate(settings.BaudRate);
setDataBits(settings.DataBits);
setParity(settings.Parity);
setStopBits(settings.StopBits);
Copy constructor.
*/
Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort& s)
: QextSerialBase(s.port)
{
setOpenMode(s.openMode());
port = s.port;
Settings.BaudRate=s.Settings.BaudRate;
Settings.DataBits=s.Settings.DataBits;
Settings.Parity=s.Settings.Parity;
Settings.StopBits=s.Settings.StopBits;
_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1
_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1
<none> Linux /dev/ttyS0, /dev/ttyS1
*/
Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode)
: QextSerialBase(name)
}
/*!
\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings)
Constructs a port with specified name and settings.
\fn Posix_QextSerialPort::Posix_QextSerialPort()
Default constructor. Note that the name of the device used by a QextSerialPort constructed with
this constructor will be determined by #defined constants, or lack thereof - the default behavior
memcpy(&Posix_Copy_Timeout, &(s.Posix_Copy_Timeout), sizeof(struct timeval));
memcpy(&Posix_CommConfig, &(s.Posix_CommConfig), sizeof(struct termios));
{
Posix_File=new QFile();
setQueryMode(mode);
init();
}
/*!
\fn Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings)
---------- ------------- ------------------------
_TTY_WIN_ Windows COM1, COM2
_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2
{
setBaudRate(settings.BaudRate);
setDataBits(settings.DataBits);
setParity(settings.Parity);
setStopBits(settings.StopBits);
setFlowControl(settings.FlowControl);
setFlowControl(settings.FlowControl);
Posix_File=new QFile();
setTimeout(settings.Timeout_Millisec);
setQueryMode(mode);
init();
e.g."COM1" or "/dev/ttyS0".
*/
Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode)
: QextSerialBase(name)
Constructs a port with default name and specified settings.
*/
Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode)
warnings) in the project. Note that _TTY_NOWARN_ will also turn off portability warnings.
*/
#include <stdio.h>
#include "posix_qextserialport.h"
/*!
is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are:
\verbatim
Constant Used By Naming Convention
\endverbatim
This constructor assigns the device name to the name of the first port on the specified system.
See the other constructors if you need to open a different port.
*/
Posix_QextSerialPort::Posix_QextSerialPort()
: QextSerialBase()
{
Posix_File=new QFile();
}
/*!
\fn Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort&)
Settings.FlowControl=s.Settings.FlowControl;
lastErr=stErr;
Posix_File=new QFile();
Posix_File=s.Posix_File;
memcpy(&Posix_Timeout, &s.Posix_Timeout, sizeof(struct timeval));
Settings.FlowControl=s.Settings.FlowControl;
lastErr=stErr;
Posix_File=s.Posix_File;
memcpy(&Posix_Timeout, &(s.Posix_Timeout), sizeof(struct timeval));
Settings.BaudRate=s.Settings.BaudRate;
Settings.DataBits=s.Settings.DataBits;
Settings.Parity=s.Settings.Parity;
Settings.StopBits=s.Settings.StopBits;
and possible portability conflicts at run-time by default - this behavior can be turned off by