一、QtSerialPort简介
1、串口通信基础
目前使用最广泛的串口为DB9接口,适用于较近距离的通信。一般小于10米。DB9接口有9个针脚。
串口通信的主要参数如下:
A、波特率:衡量通信速度的参数,表示每秒钟传送的bit的个数。例如9600波特表示每秒钟发送9600个bit。
B、数据位:衡量通信中实际数据位的参数,当计算机发送一个信息包,实际包含的有效数据位个数。
C、停止位:用于表示单个包的最后一位。典型的值为1和2位。
D、奇偶校验位:串口通信中一种检错方式。常用的检错方式有:偶、奇校验。
2、QtSerialPort模块简介
QtSerialPort模块是QT5中附加模块的一个模块,为硬件和虚拟的串口提供统一的接口。
串口由于其简单和可靠,目前在像嵌入式系统、机器人等工业中依旧用得很多。使用QtSerialPort模块,开发者可以大大缩短开发串口相关的应用程的周期。
Qt SerialPort提供了基本的功能,包括配置、I/O *** 作、获取和设置RS-232引脚的信号。
Qt SerialPort模块暂不支持以下特性:
A、终端的特性,例如回显,控制CR/LF等等
B、文本模式
C、读或写 *** 作的超时和延时配置
D、当RS-232引脚信号变化通知
#include <QtSerialPort/QtSerialPort>
要链接QtSerialPort模块,需要在.pro文件中添加如下内容:
QT += serialport
二、QSerialPort
1、QSerialPort简介
QSerialPort提供了访问串口的接口函数。使用辅助类QSerialPortInfo可以获取可用的串口信息。将QSerialPortInfo辅助类对象做为参数,使用setPort()或setPortName()函数可以设置要访问的串口设备。
设置好端口后,可以使用open()函数以只读、只写或读写的模式打开使用。
注意,串口使用独占方式打开。
使用close()函数关闭串口并且取消IO *** 作。
串口成功打开后,QSerialPort会尝试确定串口的当前配置并初始化。可以使用setBaudRate()、setDataBits()、setParity()、setStopBits()和setFlowControl()函数重新配置端口设置。
有一对名为QSerialPort::dataTerminalReady、QSerialPort::requestToSend的属性
QSerialPort提供了中止正在调用线程直到信号触发的一系列函数。这些函数用于阻塞串口。
waitForReadyRead():阻塞调用,直到有新的数据可读
waitForBytesWritten():阻塞调用,直到数据以及写入串口
阻塞串口编程与非阻塞串口编程完全不同。阻塞串口不会要求时间循环并且通常会简化代码。然而,在GUI程序中,为了避免冻结用户界面,阻塞串口编程只能用于非GUI线程。
QSerialPort也能使用QTextStream和QDataStream的流 *** 作符。在试图使用流 *** 作符>>读时,需要确保有足够可用的数据。
2、QSerialPort成员函数
QSerialPort::QSerialPort(QObject *parent = Q_NULLPTR)
QSerialPort::QSerialPort(const QString &name, QObject *parent = Q_NULLPTR)
QSerialPort::QSerialPort(const QSerialPortInfo &serialPortInfo, QObject *parent = Q_NULLPTR)
[virtual] bool QSerialPort::atEnd() const
[signal] void QSerialPort::baudRateChanged(qint32 baudRate, QSerialPort::Directions directions)
[virtual] qint64 QSerialPort::bytesAvailable() const
[virtual] qint64 QSerialPort::bytesToWrite() const
[virtual] void QSerialPort::close()
void QSerialPort::setPort(const QSerialPortInfo &serialPortInfo)
void QSerialPort::setPortName(const QString &name)
三、QSerialPortInfo
1、QSerialPortInfo简介
QSerialPortInfo类提供已有串口设备的信息。使用QSerialPortInfo类的静态成员函数生成QSerialPortInfo对象的链表。链表中的每个QSerialPortInfo对象代表一个串口,每个串口可以使用端口名、系统定位、描述、制造商查询。QSerialPortInfo类对象也可以用做QSerialPort类的setPort()成员函数的参数。
2、QSerialPortInfo成员函数
QSerialPortInfo::QSerialPortInfo(const QSerialPort &port)
QSerialPortInfo::QSerialPortInfo(const QString &name)
QSerialPortInfo::QSerialPortInfo(const QSerialPortInfo &other)
[static] QList<QSerialPortInfo>QSerialPortInfo::availablePorts()
QString QSerialPortInfo::description() const
bool QSerialPortInfo::hasProductIdentifier() const
bool QSerialPortInfo::hasVendorIdentifier() const
bool QSerialPortInfo::isBusy() const
QString QSerialPortInfo::manufacturer() const
QString QSerialPortInfo::portName() const
quint16 QSerialPortInfo::productIdentifier() const
QString QSerialPortInfo::serialNumber() const
[static] QList<qint32>QSerialPortInfo::standardBaudRates()
void QSerialPortInfo::swap(QSerialPortInfo &other)
QString QSerialPortInfo::systemLocation() const
quint16 QSerialPortInfo::vendorIdentifier() const
3、QSerialPortInfo显示串口信息实例
本文实例为大家分享了QT实现FTP上传文件的具体代码,供大家参考,具体内容如下
两台电脑通过网线建立本地连接,保证网关在同一段;
服务器端打开ftp;
控制面板→程序→启用或关闭windows功能→windows功能→Internet信息服务
启用“FTP服务”FTP扩展性” IIS管理控制台”
开始屏幕的搜索中输入“IIS”,然后点击打开“IIS管理器”
打开“IIS管理器”后,在左栏的“网站”上点击右键,打开“添加FTP站点”
然后按照提示填写站点信息
点击“下一步”,按照下图提示,设置“绑定和SSL设置”,在“IP地址”处,可以用内网IP也可以用外网IP,访客自然也就根据你的IP设定来决定
点击“下一步”,设置“身份验证和授权信息”
然后在本机浏览器地址栏中输入“ftp://填写的IP”测试一下
客户端网页测试远程访问;
客户端(另一台电脑)浏览器地址栏中输入“ftp://填写的IP”测试一下
客户端cmd测试远程访问;
win+r打开运行窗口,输入cmd
回车打开cmd命令窗口
cmd命令中输入:ftp回车
回车切换至ftp命令窗口,输入命令:open,回车提示:到
到即所要连接测试的ftp地址,我们输入:IP 22
即:ip地址+空格+端口号,没有+号
回车后d出用户一行,输入ftp的用户名后回车,输入ftp用户名对应的密码
输入密码后回车,如果提示,user logged in就说么ftp创建无问题
客户端程序测试远程访问。
新建程序,添加ftpclass.cpp、ftpclass.h,复制main.cpp内容到程序入口函数
注意:/项目-属性-常规-字符集-使用多字节字符集/
//main.cpp
#include "stdafx.h"
#include "ftpclass.h"
void main()
{
printf("------- 开始测试!------\n")
printf("01--创建连接 %d\n", FtpClass::createConnection())
printf("02--打开目标ftp %d\n", FtpClass::createTable())
/*可以读取ini内参数
FtpClass::ftp_Ip = TEXT("Ini读取")
FtpClass::ftp_Port = TEXT("Ini读取")
FtpClass::ftp_User = TEXT("Ini读取")
FtpClass::ftp_Password = TEXT("Ini读取")
FtpClass::ftp_Fixed_Path = TEXT("Ini读取")*/
printf("03--创建文件夹 %d\n", FtpClass::createFolder("自动生成目录1","自动生成目录2","自动生成目录3"))
/*上传目标路径*/
printf("04--上传文件 %d\n", FtpClass::insert( "D:/a.txt", "b.txt"))
/*本机文件需要上传文件*/ /*上传后文件名称,可以和本地文件名称不一样,类型最好别换*/
printf("05--关闭通讯 %d\n", FtpClass::createClose())
printf("------ 结束测试!------\n")
return
}
//ftpclass.h
/*项目-属性-常规-字符集-使用多字节字符集*/
/*wininet.lib、shlwapi.lib可以直接添加到附加依赖项*/
/*BOOL_VERIFY、NULL_VERIFY 程序结束判断*/
#pragma once
#pragma comment(lib,"wininet.lib")
#pragma comment(lib,"shlwapi.lib")
#define BOOL_VERIFY(emStatus_bool,switch_bool) \
if (emStatus_bool == true)\
{return true}\
else{\
if (switch_bool == 3) printf(" FTP_03_err:创建文件夹失败!%d\n")\
if (switch_bool == 4) printf(" FTP_04_err:上传文件失败!\n")\
if (switch_bool == 5) printf(" FTP_05_err:关闭窗口句柄失败!\n")\
return false\
}
#define NULL_VERIFY(emStatus_null,switch_null) \
if (emStatus_null != NULL)\
{return true}\
else{\
if (switch_null == 1) {printf(" FTP_01_err:打开通讯错误 Error:%d\n", GetLastError())}\
if (switch_null == 2) {printf(" FTP_02_err:建立连接错误 Error:%d\n", GetLastError())}\
return false\
}
#include "stdafx.h"//没用
#include <afxinet.h>//MFC相关
#include "wininet.h"//调用FTP相关类
#include "shlwapi.h"//调用文件 *** 作相关类
class FtpClass
{
public:
/*ini读取变量*/
static CString ftp_Ip//目标ip
static CString ftp_Port//目标端口
static CString ftp_User//目标账户
static CString ftp_Password//目标密码
static CString ftp_Fixed_Path//目标固定路径
static CString ftp_Free_Path//目标自己生成路径
/*全局变量*/
static BOOL pRes
static HINTERNET hInternet
static HINTERNET hConnect
/*全局函数*/
static bool createConnection() //创建一个连接
static bool createTable()
static bool ThreadInternetConnect(PVOID )
//打开目标ftp
static bool createFolder(CString temp1, CString temp2, CString temp3) //上传文件
static bool insert(CString temp, CString temp1) //出入数据
static bool createClose() //断开连接
}
//ftpclass.cpp
#include "stdafx.h"
#include "ftpclass.h"
CString FtpClass::ftp_Ip = TEXT("192.168.3.104")
CString FtpClass::ftp_Port = TEXT("21")
CString FtpClass::ftp_User = TEXT("Administrator")
CString FtpClass::ftp_Password = TEXT("xinxin")
CString FtpClass::ftp_Fixed_Path = TEXT("1级固定目录/2级固定目录/3级固定目录")
CString FtpClass::ftp_Free_Path = TEXT("自动生成目录")
BOOL FtpClass::pRes = false
HINTERNET FtpClass::hInternet = NULL
HINTERNET FtpClass::hConnect = NULL
//创建一个连接
bool FtpClass::createConnection() {
/*ftp_Ip = TEXT("Ini读取")
ftp_Port = TEXT("Ini读取")
ftp_User = TEXT("Ini读取")
ftp_Password = TEXT("Ini读取")
ftp_Fixed_Path = TEXT("Ini读取")*/
hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE)
NULL_VERIFY(hInternet,1)
}
bool FtpClass::ThreadInternetConnect(PVOID param) {
// 打开http
hConnect = InternetConnect(hInternet, ftp_Ip, INTERNET_DEFAULT_FTP_PORT,//INTERNET_DEFAULT_FTP_PORT 第三个参数默认值21
ftp_User, ftp_Password, INTERNET_SERVICE_FTP,
INTERNET_FLAG_EXISTING_CONNECT || INTERNET_FLAG_PASSIVE, 0)
return 1
}
//打开目标ftp
bool FtpClass::createTable()
{
/*hConnect = InternetConnect(hInternet, ftp_Ip, 25,//INTERNET_DEFAULT_FTP_PORT 第三个参数默认值21
ftp_User, ftp_Password, INTERNET_SERVICE_FTP,
INTERNET_FLAG_EXISTING_CONNECT || INTERNET_FLAG_PASSIVE, 0)
NULL_VERIFY(hConnect,2)*/
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadInternetConnect, (LPVOID)NULL, 0, NULL)
//超时3秒,如果等待结果是超时
if (WaitForSingleObject(hThread, 3 * 1000) == WAIT_TIMEOUT) {
TerminateThread(hThread, 0)
CloseHandle(hThread)
NULL_VERIFY(hConnect, 2)
}
NULL_VERIFY(hConnect, 2)
}
//上传文件
bool FtpClass::createFolder(CString temp1, CString temp2, CString temp3)
{
/*新建文件件每次只能创建一级,多个需要分多次创建*/
pRes = false
ftp_Free_Path = ""
ftp_Free_Path = ftp_Fixed_Path + "/" + temp1
FtpCreateDirectory(hConnect, ftp_Free_Path)
ftp_Free_Path = ftp_Free_Path + "/" + temp2
FtpCreateDirectory(hConnect, ftp_Free_Path)
ftp_Free_Path = ftp_Free_Path + "/" + temp3
pRes = FtpCreateDirectory(hConnect, ftp_Free_Path)
BOOL_VERIFY(pRes,3)
}
//出入数据
bool FtpClass::insert(CString temp, CString temp1)
{
pRes = false
ftp_Free_Path = ftp_Free_Path + "/" +temp1
pRes = FtpPutFile(hConnect, temp,/*本机文件*/
ftp_Free_Path, /*TEXT("一级目录/二级目录/三级目录/a.txt"),*/
FTP_TRANSFER_TYPE_ASCII, 0)
BOOL_VERIFY(pRes,4)
}
//断开连接
bool FtpClass::createClose()
{
pRes = false
if (InternetCloseHandle(hConnect))
pRes = InternetCloseHandle(hInternet)
BOOL_VERIFY(pRes,5)
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
如何利用 QT 进行 web 与本地混合应用开发是本文要讲述的内容,Qt提供了本地 C++对象与JavaScript的无缝集成,是进行本地与web混合应用开发的理想平台。一、Qt Webkit 集成
利用Qt的Webkit 集成与QtNetwork模块,你完全可以进行本地桌面与web混合应用开发,你可以自由地混合JavaScript,样式表,Web内容和Qt组件。 Webkit是一个非常成熟的web浏览引擎。Qt中集成了这个大名鼎鼎的引擎,通过QtWebkit,你可以在C++ 中执行JavaScript,或者在网页中集成C++对象,并且通过JavaScript和这些对象进行交互。
一个现代的HTML渲染引擎只 是混合开发的一半,另一半就是本地应用和渲染对象的交互。QT的Webkit 集成提供了这种解决方案:
1.使用object标签嵌入Qt Widgets组件。这可以让使用C++代码的Qt组件包含在网页中,作为网页的部分外观。
2.在JavaScript中访问C++对象。你 可以在JavaScript环境中插入C++对象,让网页脚本直接访问你的数据结构。
3.在Qt中执行JavaScript。你可以在C++ 调用网页环境中的JavaScript函数,触发网页事件。
4.共享客户端存储。在JavaScript和C++中你都具有访问数据库的能 力,这样当下线时也能共享大量数据。
二、与嵌入的Qt对象交互
使用 QWebView 组件,有两种方法可以在网页中嵌入C++对象。你可以在网页的JavaScript中添加C++对象,或者也可以创建一个插件,然后在网页中使用 object标签嵌入。
第二种方法更容易入手。当在网页中放入 Widget组件时,它的所有public slots就像普通函数一样被网页中的JavaScript函数访问。
要在网页中添加一个Widget,首先要告诉你的QWebPage对象,该Widget可用,这个通过子类化QWebPlugFactory完成,
你需要 重新实现两个方法:plugs和create。plugs方法通知网页该Widget可用,create方法根据请求创建widget。
在 HTML网页中,widgets使用object标签创建。比如,下面这个标签试图创建一个 application/x-qt-colorlabel 组件。
<object type="application/x-qt-colorlabel" width="50px" height="20px" id="label" />
要利用这种创建,必须要允许使用插件并且要告诉QWebpage插件的工厂类。在下面的代码中,ColorLabelFactory将 会根据application/x-qt-colorlabel的请求创建相应实例。
QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true) webView->page()->setPluginFactory(new ColorLabelFactory(this))
ColorLabel有一个公开的slot: chagneColor(),这个对于网页中的JavaScript自动可用。在网页中插入一个指向该元素的链接,可以以一种简单的方式激活C++函数。
<a href='javascript:document.getElementById("label").changeColor()'>Change color!</a>
要反方向推进事件,必须要使你的对象在JavaScript文档上下文中可用。要对QWebPage的每一个 QWebFrame,调用addToJavaScriptWindowObject方法。这个方法允许你根据名字把一个对象添加到JavaScipt上下 文中。
webView->page()->mainFrame()->addToJavaScriptWindowObject( "eventSource", new eventSource( this ) )
要连接刚添加对象eventSource的信号,要加上一段JavaScript代码,使用evaluateJavaScript方法
完成。下面的代码将把eventSource对象的signalName信号连接到一个JavaScript函数destFunction。
webView->page()->mainFrame()->evaluateJavaScript( "eventSource.signalName.connect(destFunction)" )
如果你把一个对象添加到一个以标准浏览器查看的JavaScript页面中,有一个信号需要知道。每一次JavaScript
内容被清除,Frame都会释放 javaScriptWindowObjectCleared
信号。为了使你的Qt对象一直可用,你需要连接这个信号,并且在这里调用 addToJavaScriptWindowObject函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)