qtserialport for qt4怎么设置波特率

8307人阅读
C/C++(16)
Linux设备驱动(16)
QtSerialPort
今天我们来介绍一下QtSerialPort模块的源代码,学习一下该可移植的串口编程库是怎么实现的。
首先,我们下载好了源代码之后,使用QtCreator打开整个工程,可以看到如下图的源代码结构:
我们先来看一下serialport-lib.pri这个文件,serialport.pro工程文件就是靠这个文件来控制整个源代码的编译的。,具体内容如下:
上面的内容只是最基本的类,大家知道,跨平台的类一般在底层都包含这与操作系统相关的一些实现,这里也不例外,大家看看下面的图就明白了,
这里只以类unix操作系统为例来做说明:
也许看到这个大家不是很明白:
& & & 这与qmake的一些特性相关:CONFIG、DEFINE、PKGCONFIG都是qmake私有的一些变量,而packagesExist()则是qmake私有的函数,
整个这一块要表达的意思是&如果udev这个库存在,则编译程序的时候就定义HAVE_LIBUDEV这个宏定义(在我们的代码中使用了这个宏定义),
并且链接程序的时候,也链接udev这个库&。至于qmake的一些特性以及使用方法,后续会专门写几篇博文详细介绍。
& & & 至于udev这个库的介绍,请见:
& & & 我们在代码中是如下使用udev库的:
& & & 在serialport源代码中还是用了另外一个开源库,那就是lockdev,该库主要提供的功能就是“Lockdev is a setgid binary,
which provides a reliable way to put an exclusive lock&in /var/lock to devices (e.g. ttyS0) using both FSSTND and SVr4 methods,
so regular users don't need write access there.”
& & & 下面,看看我们在代码中是如何使用lockdev的:
& & & 对于lockdev,我们在下一篇博客中将详细介绍它的功能的和实现。
&好了,言归正传,我们来看看serialport库在类unix操作系统上是如何实现的:
与平台无关的公共头文件:qserialportglobal.h qserialport.h qserialportinfo.h
与平台无关的私有头文件:qserialport_p.h qserialportinfo_p.h
与平台有关的头文件: & & & qttylocker_unix_p.h qserialport_unix_p.h
与平台无关的源文件:qserialport.cpp qserialportinfo.cpp
与平台有关的源文件:qttylocker_unix.cpp qserialport_unix.cpp qserialportinfo_unix.cpp
源代码解析:
1、QSerialPort类源码解析
(1)QSerialPort类继承自QIODevice,包含对串口的基本操作:
与该类有关系的类主要是如下几个:
QIODevice、QSerialPort、QSerialPortPrivate、QSerialPortPrivateData。
它们的关系如下:
QSerialPort继承自QIODevice,继承了对设备文件基本的操作。
QSerialPortPrivate是QSerialPort对象中表示操作一类的,该部分与操作系统有关。QSerialPortvate继承自QSerialPortPrivateData。
QSerialPortPrivateData是一个串口设备的初始化数据,例如波特率等等。
QSerialPortPrivateData更多表示串口设备的初始数据,QSerialPortPrivate更多表示平台相关的对串口设备的操作。
(2)QSerialPort类定义:
class QSerialPortI
class QSerialPortP
class Q_SERIALPORT_EXPORT QSerialPort : public QIODevice
Q_PROPERTY(qint32 baudRate READ baudRate WRITE setBaudRate NOTIFY baudRateChanged)
Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits NOTIFY dataBitsChanged)
Q_PROPERTY(Parity parity READ parity WRITE setParity NOTIFY parityChanged)
Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits NOTIFY stopBitsChanged)
Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl NOTIFY flowControlChanged)
Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy NOTIFY dataErrorPolicyChanged)
Q_PROPERTY(bool dataTerminalReady READ isDataTerminalReady WRITE setDataTerminalReady NOTIFY dataTerminalReadyChanged)
Q_PROPERTY(bool requestToSend READ isRequestToSend WRITE setRequestToSend NOTIFY requestToSendChanged)
Q_PROPERTY(SerialPortError error READ error RESET clearError NOTIFY error)
Q_PROPERTY(bool settingsRestoredOnClose READ settingsRestoredOnClose WRITE setSettingsRestoredOnClose NOTIFY settingsRestoredOnCloseChanged)
Q_ENUMS( Directions Rate DataBits Parity StopBits FlowControl PinoutSignals DataErrorPolicy SerialPortError )
enum Direction
Input = 1,
Output = 2,
AllDirections = Input | Output
Q_DECLARE_FLAGS(Directions, Direction)
enum BaudRate {
Baud1200 = 1200,
Baud2400 = 2400,
Baud4800 = 4800,
Baud9600 = 9600,
Baud19200 = 19200,
Baud38400 = 38400,
Baud57600 = 57600,
Baud115200 = 115200,
UnknownBaud = -1
enum DataBits {
Data5 = 5,
Data6 = 6,
Data7 = 7,
Data8 = 8,
UnknownDataBits = -1
enum Parity {
NoParity = 0,
EvenParity = 2,
OddParity = 3,
SpaceParity = 4,
MarkParity = 5,
UnknownParity = -1
enum StopBits {
OneStop = 1,
OneAndHalfStop = 3,
TwoStop = 2,
UnknownStopBits = -1
enum FlowControl {
NoFlowControl,
HardwareControl,
SoftwareControl,
UnknownFlowControl = -1
enum PinoutSignal {
NoSignal = 0x00,
TransmittedDataSignal = 0x01,
ReceivedDataSignal = 0x02,
DataTerminalReadySignal = 0x04,
DataCarrierDetectSignal = 0x08,
DataSetReadySignal = 0x10,
RingIndicatorSignal = 0x20,
RequestToSendSignal = 0x40,
ClearToSendSignal = 0x80,
SecondaryTransmittedDataSignal = 0x100,
SecondaryReceivedDataSignal = 0x200
Q_DECLARE_FLAGS(PinoutSignals, PinoutSignal)
enum DataErrorPolicy {
SkipPolicy,
PassZeroPolicy,
IgnorePolicy,
StopReceivingPolicy,
UnknownPolicy = -1
enum SerialPortError {
DeviceNotFoundError,
PermissionError,
OpenError,
ParityError,
FramingError,
BreakConditionError,
WriteError,
ReadError,
ResourceError,
UnsupportedOperationError,
UnknownError
explicit QSerialPort(QObject *parent = 0);
explicit QSerialPort(const QString &name, QObject *parent = 0);
explicit QSerialPort(const QSerialPortInfo &info, QObject *parent = 0);
virtual ~QSerialPort();
void setPortName(const QString &name);
QString portName()
void setPort(const QSerialPortInfo &info);
bool open(OpenMode mode) Q_DECL_OVERRIDE;
void close() Q_DECL_OVERRIDE;
void setSettingsRestoredOnClose(bool restore);
bool settingsRestoredOnClose()
bool setBaudRate(qint32 baudRate, Directions dir = AllDirections);
qint32 baudRate(Directions dir = AllDirections)
bool setDataBits(DataBits dataBits);
DataBits dataBits()
bool setParity(Parity parity);
Parity parity()
bool setStopBits(StopBits stopBits);
StopBits stopBits()
bool setFlowControl(FlowControl flow);
FlowControl flowControl()
bool setDataTerminalReady(bool set);
bool isDataTerminalReady();
bool setRequestToSend(bool set);
bool isRequestToSend();
PinoutSignals pinoutSignals();
bool flush();
bool clear(Directions dir = AllDirections);
bool atEnd() const Q_DECL_OVERRIDE;
bool setDataErrorPolicy(DataErrorPolicy policy = IgnorePolicy);
DataErrorPolicy dataErrorPolicy()
SerialPortError error()
void clearError();
qint64 readBufferSize()
void setReadBufferSize(qint64 size);
bool isSequential() const Q_DECL_OVERRIDE;
qint64 bytesAvailable() const Q_DECL_OVERRIDE;
qint64 bytesToWrite() const Q_DECL_OVERRIDE;
bool canReadLine() const Q_DECL_OVERRIDE;
bool waitForReadyRead(int msecs) Q_DECL_OVERRIDE;
bool waitForBytesWritten(int msecs) Q_DECL_OVERRIDE;
bool sendBreak(int duration = 0);
bool setBreakEnabled(bool set = true);
Q_SIGNALS:
void baudRateChanged(qint32 baudRate, QSerialPort::Directions dir);
void dataBitsChanged(QSerialPort::DataBits dataBits);
void parityChanged(QSerialPort::Parity parity);
void stopBitsChanged(QSerialPort::StopBits stopBits);
void flowControlChanged(QSerialPort::FlowControl flow);
void dataErrorPolicyChanged(QSerialPort::DataErrorPolicy policy);
void dataTerminalReadyChanged(bool set);
void requestToSendChanged(bool set);
void error(QSerialPort::SerialPortError serialPortError);
void settingsRestoredOnCloseChanged(bool restore);
protected:
qint64 readData(char *data, qint64 maxSize) Q_DECL_OVERRIDE;
qint64 readLineData(char *data, qint64 maxSize) Q_DECL_OVERRIDE;
qint64 writeData(const char *data, qint64 maxSize) Q_DECL_OVERRIDE;
void setError(QSerialPort::SerialPortError error, const QString &errorString = QString());
QSerialPortPrivate * const d_
Q_DECLARE_PRIVATE(QSerialPort)
Q_DISABLE_COPY(QSerialPort)
Q_DECLARE_OPERATORS_FOR_FLAGS(QSerialPort::Directions)
Q_DECLARE_OPERATORS_FOR_FLAGS(QSerialPort::PinoutSignals)
2、QserialPortInfo类源码解析
(1)QserialPortInfo主要是枚举系统上可用串口设备的信息:
与该类的类主要是如下几个:
QSerialPort、QSerialPortInfo、QSerialPortInfoPrivate、QSerialPortInfoPrivateDeleter。
QSerialPortInfo的构造函数中使用到了QSerialPort。
QSerialPortInfoPrivate则代表QSerialPortInfo的私有数据。
(2)QserialPortInfo类定义:
class QSerialP
class QSerialPortInfoP
class QSerialPortInfoPrivateD
class Q_SERIALPORT_EXPORT QSerialPortInfo
Q_DECLARE_PRIVATE(QSerialPortInfo)
QSerialPortInfo();
explicit QSerialPortInfo(const QSerialPort &port);
explicit QSerialPortInfo(const QString &name);
QSerialPortInfo(const QSerialPortInfo &other);
~QSerialPortInfo();
QSerialPortInfo& operator=(const QSerialPortInfo &other);
void swap(QSerialPortInfo &other);
QString portName()
QString systemLocation()
QString description()
QString manufacturer()
quint16 vendorIdentifier()
quint16 productIdentifier()
bool hasVendorIdentifier()
bool hasProductIdentifier()
bool isNull()
bool isBusy()
bool isValid()
static QList&qint32& standardBaudRates();
static QList&QSerialPortInfo& availablePorts();
QScopedPointer&QSerialPortInfoPrivate, QSerialPortInfoPrivateDeleter& d_
inline bool QSerialPortInfo::isNull() const
{ return !d_ }
1、qtserialport源代码中使用了D指针,Q指针,这方面的介绍请见
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:630817次
积分:6686
积分:6686
排名:第2726名
原创:70篇
转载:14篇
译文:22篇
评论:127条
文章:36篇
阅读:422521
文章:10篇
阅读:23697
(4)(1)(1)(2)(1)(1)(2)(2)(3)(1)(5)(1)(5)(2)(10)(26)(10)(4)(22)(1)(2)嵌入式(3)
头文件代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include &QMainWindow&
#include &QtSerialPort&
#include &QDebug&
#include &QMessageBox&
namespace Ui {
class MainW
class MainWindow : public QMainWindow
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow *
QSerialPort *
void setcom();
void stopBits();
private slots:
void serialRead();
void on_pushButtonOpenCom_clicked();
void on_pushButtonCloseCom_clicked();
void on_pushButtonClear_clicked();
void on_pushButtonSend_clicked();
void on_pushButtonabout_clicked();
#endif // MAINWINDOW_H
主要代码:
#include &mainwindow.h&
#include &ui_mainwindow.h&
#include &QDebug&
#include &QMessageBox&
#include &QDesktopWidget&
* 串口调试工具
* 1.现实基本的串口发送接收
* 2.支持linux/windows夸平台编译
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
this-&setWindowTitle(tr(&串口调试&));
ui-&statusBar-&showMessage(tr(&欢迎使用串口调试-----by dong&));
QDesktopWidget *desktop = QApplication::desktop();
move(desktop-&width()/2-this-&width()/2,
desktop-&height()/2-this-&height()/2);
stopBits();
ui-&comboBoxBaudRate-&setCurrentIndex(4);
ui-&comboBoxParity-&setCurrentIndex(2);
ui-&comboBoxFlowControl-&setCurrentIndex(2);
ui-&pushButtonSend-&setEnabled(false);
ui-&pushButtonCloseCom-&setEnabled(false);
connect(ui-&lineEditSend, SIGNAL(returnPressed()),
this, SLOT(on_pushButtonSend_clicked()));
MainWindow::~MainWindow()
void MainWindow::setcom()
ui-&comboBoxPort-&clear();
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
list && info.portName()
&& info.description()
&& info.manufacturer()
&& info.systemLocation()
&& (info.vendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString())
&& (info.productIdentifier() ? QString::number(info.productIdentifier(), 16) : QString());
ui-&comboBoxPort-&addItem(list.first(), list);
ui-&comboBoxPort-&clear();
static const QString blankString = QObject::tr(&N/A&);
QString serialN
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
description = info.description();
manufacturer = info.manufacturer();
serialNumber = info.serialNumber();
list && info.portName()
&& (!description.isEmpty() ? description : blankString)
&& (!manufacturer.isEmpty() ? manufacturer : blankString)
&& (!serialNumber.isEmpty() ? serialNumber : blankString)
&& info.systemLocation()
&& (info.vendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : blankString)
&& (info.productIdentifier() ? QString::number(info.productIdentifier(), 16) : blankString);
ui-&comboBoxPort-&addItem(list.first(), list);
void MainWindow::stopBits()
ui-&comboBoxStopBits-&addItem(&1&);
#ifdef Q_OS_WIN
ui-&comboBoxStopBits-&addItem(&1.5&);
ui-&comboBoxStopBits-&addItem(&2&);
void MainWindow::serialRead()
QByteArray readData = serial-&readAll();
while(serial-&waitForReadyRead(10)){
readData+=(serial-&readAll());
ui-&textBrowser-&insertPlainText(QString(readData));
ui-&textBrowser-&moveCursor(QTextCursor::End);
//打开串口
void MainWindow::on_pushButtonOpenCom_clicked()
QString portName = ui-&comboBoxPort-&currentText();
qDebug()&&portName&&
serial = new QSerialPort(portName);
//以读写方式打开串口
if(serial-&open(QIODevice::ReadWrite)){
ui-&pushButtonSend-&setEnabled(true);
ui-&pushButtonOpenCom-&setEnabled(false);
ui-&pushButtonCloseCom-&setEnabled(true);
ui-&groupBox-&setEnabled(false);
ui-&statusBar-&showMessage(tr(&open succeed&));
QMessageBox::critical(this, tr(&open error&), serial-&errorString());
//设置波特率
serial-&setBaudRate(ui-&comboBoxBaudRate-&currentText().toInt());
//设置数据位
switch (ui-&comboBoxDataBits-&currentIndex()) {
serial-&setDataBits(QSerialPort::Data8);
serial-&setDataBits(QSerialPort::Data7);
serial-&setDataBits(QSerialPort::Data6);
serial-&setDataBits(QSerialPort::Data5);
serial-&setDataBits(QSerialPort::Data8);
//设置奇偶校验位
switch (ui-&comboBoxParity-&currentIndex()) {
serial-&setParity(QSerialPort::EvenParity);
serial-&setParity(QSerialPort::OddParity);
serial-&setParity(QSerialPort::NoParity);
serial-&setParity(QSerialPort::MarkParity);
serial-&setParity(QSerialPort::SpaceParity);
serial-&setParity(QSerialPort::NoParity);
//设置停止位
if(ui-&comboBoxStopBits-&currentText()==tr(&1&)){
serial-&setStopBits(QSerialPort::OneStop);
}else if(ui-&comboBoxStopBits-&currentText()==tr(&1.5&)){
serial-&setStopBits(QSerialPort::OneAndHalfStop);
}else if(ui-&comboBoxStopBits-&currentText()==tr(&2&)){
serial-&setStopBits(QSerialPort::TwoStop);
//设置控制流
switch (ui-&comboBoxFlowControl-&currentIndex()) {
serial-&setFlowControl(QSerialPort::SoftwareControl);
serial-&setFlowControl(QSerialPort::HardwareControl);
serial-&setFlowControl(QSerialPort::NoFlowControl);
serial-&setFlowControl(QSerialPort::NoFlowControl);
connect(serial, SIGNAL(readyRead()),
this, SLOT(serialRead()));
//关闭串口
void MainWindow::on_pushButtonCloseCom_clicked()
serial-&close();
ui-&pushButtonOpenCom-&setEnabled(true);
ui-&pushButtonSend-&setEnabled(false);
ui-&pushButtonCloseCom-&setEnabled(false);
ui-&groupBox-&setEnabled(true);
ui-&statusBar-&showMessage(tr(&close serial&));
void MainWindow::on_pushButtonClear_clicked()
ui-&textBrowser-&clear();
void MainWindow::on_pushButtonSend_clicked()
serial-&write(ui-&lineEditSend-&text().toLocal8Bit());
void MainWindow::on_pushButtonabout_clicked()
QMessageBox::about(this, tr(&关于&), tr(&&b&by dong &));
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:772次
排名:千里之外QT编程:(4)串口通信_打开&关闭串口
QT编程:(4)串口通信_打开&关闭串口
(更新:使用Qt5&串口操作类QtSerialPort)
单击主窗口“串口配置”按钮&弹出“串口配置”对话框。串口参数:串口号、波特率及校验方式等配置完成后,单击“打开串口”按钮,实现串口打开功能,当不使用串口功能时,单击“关闭串口”按钮即可。
串口参数选择、打开/关闭串口;
在界面初始化完成时——
串口号即自动识别,并显示在对应组合框中;
仅“打开串口”按钮使能;完成串口打开操作后,弹出“……成功/失败”提示对话框。
并使能“关闭串口”按钮。
串口配置主界面
串口参数相关项
串口操作成功响应菜单
串口配置及通信功能相关代码的完成,主要得益于两篇高人的文章。
其一:《详解 Qt
串口通信程序全程图文(1)(2)(3)(4)(5)》
该文章详细阐述了:
(1)串口控制类qextserialport类的压缩包下载,.h、.cpp文件的添加步骤;
(2)串口对象的新建、打开;
(3)串口参数的设置方法及注意事项等。
其二:《QT
串口通信2》
该文章给出“串口自动识别”的相关代码,十分详细。
"serial/win_qextserialport.h"
//在类声明中添加
uartParaCfgDialog :
uartParaCfgDialog(Qwidget
~uartParaCfgDialog();
Qstring getComm(int
index, Qstring
keyOrValue);//读取键名
void on_openUartBtn_clicked();
void on_closeUartBtn_clicked();
void readMyCom();//声明读串口槽函数
Ui::uartParaCfgDialog
void initCom();
Win_QextSerialPort *myCom;//声明对象
keyName[];//键名数组
keyValue[256];//键值数组
keyValue[];//键值数组
valueSize;
//串口初始化函数:(此函数在类构造函数在调用)
uartParaCfgDialog::initCom()
& & QString path
"HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM";
QSettings *setting =
QSettings(path,
QSettings::NativeFormat);
QStringList key = setting-&allKeys();
QStringList
int kk = key.size();
comlist.clear();
getComm(i,
ui-&uartNumcBox-&addItems(comlist);
//从注册表中获得串口值
uartParaCfgDialog::getComm(int
QString keyOrValue)
QString commResult =
QString strKey =
"HARDWARE\\DEVICEMAP\\SERIALCOMM";//子键路径
strKey.toWCharArray(subKey);
subKey[a] =
QString error =
regedit!";
QString keyMessage =
QString message =
QString valueMessage
indexNum = //读取键值的索引号
sizeof(keyName);
valueSize =
sizeof(keyValue);
if(::(hKey,
keyName, &keySize,
&&&&&&&&&&&&&&&&&&&&&
(BYTE*)keyValue,
&valueSize)
//读取键名
keySize; i++)
&&&&&&&&&&&
QString::fromStdWString(keyName);
&&&&&&&&&&&
keyMessage.append(message);
//读取键值
valueSize; j++)
&&&&&&&&&&&
if(keyValue[j]
&&&&&&&&&&&
&&&&&&&&&&&&&&&
valueMessage.append(keyValue[j]);
&&&&&&&&&&&
if(keyOrValue ==
&&&&&&&&&&&
commResult
if(keyOrValue ==
&&&&&&&&&&&
commResult
commResult
::RegCloseKey(hKey);//关闭注册表
return commR
//“打开串口”按钮响应函数:
void uartParaCfgDialog::on_openUartBtn_clicked()
&&& //定义串口对象,并传递参数,在构造函数里对其进行初始化
&&& myCom = new Win_QextSerialPort("com1",
QextSerialBase::EventDriven);
&&& //获取串口名
&&& QString portName = ui-&uartNumcBox-&currentText();
&&& QString m_port = portName.right(portName.length() - );
&&& if(m_port.toInt() & )
&&&&&&& QString xx = "\\\\.\\";
&&&&&&& xx.append(portName);
&&&&&&& myCom-&setPortName(xx);
&&&&&&& myCom-&setPortName(portName);
&&& //以读写方式打开串口
&&& bool isOpenS
&&& isOpenSucc = myCom-&open(QIODevice::ReadWrite);
&&& if(isOpenSucc == true)
&&& //设置波特率
&&&&&&& if(ui-&baudRatecBox-&currentText() == tr("9600"))
&&&&&&&&&&& myCom-&setBaudRate(BAUD9600);
&&&&&&& else if(ui-&baudRatecBox-&currentText() == tr("115200"))
&&&&&&&&&&& myCom-&setBaudRate(BAUD115200);
&&&&&&& //设置奇偶校验
&&&&&&& if(ui-&checkModecBox-&currentText() == tr("无校验"))
&&&&&&&&&&& myCom-&setParity(PAR_NONE);
&&&&&&& else if(ui-&checkModecBox-&currentText() == tr("奇校验"))
&&&&&&&&&&& myCom-&setParity(PAR_ODD);
&&&&&&& else if(ui-&checkModecBox-&currentText() == tr("偶校验"))
&&&&&&&&&&& myCom-&setParity(PAR_EVEN);
&&&&&&& //设置停止位:1位
&&&&&&& myCom-&setStopBits(STOP_1);
&&&&&&& //设置流控制:无数据控制
&&&&&&& myCom-&setFlowControl(FLOW_OFF);
&&&&&&& //设置延时:500
&&&&&&& myCom-&setTimeout();
&&&&&&& //信号与槽函数关联,当串口缓冲区有数据时,进行读串口操作
&&&&&&& connect(myCom, SIGNAL(readyRead()), this, SLOT(readMyCom()));
&&&&&&& QMessageBox::information(this, tr("串口配置"), tr("打开串口成功!"));
&&&&&&& ui-&closeUartBtn-&setEnabled(true);
&&&&&&& ui-&openUartBtn-&setEnabled(false);
&&&&&&& delete myCom;
&&&&&&& QMessageBox::information(this, tr("串口配置"), tr("打开串口失败!"));
//“关闭串口”按钮响应函数:
uartParaCfgDialog::on_closeUartBtn_clicked()
myCom-&close();//关闭串口
QMessageBox::information(this,
tr("串口配置"),
tr("关闭串口成功!"));
ui-&openUartBtn-&setEnabled(true);
ui-&closeUartBtn-&setEnabled(false);
//读串口函数:
uartParaCfgDialog::readMyCom()
//读取串口缓冲区的所有数据给临时变量temp
QByteArray temp =
myCom-&readAll();
//调用数据处理函数:?
写完,松口气。。。竟然看到——“Qt5
有了串口操作类QtSerialPort”!
早点看到多好呀!气得我……好吧,没关系,琢磨琢磨怎么使用QtSerialPort类,然后再重写一遍吧……还正在进行中。
//定义结构体,用于存放串口各个参数
&&& struct PortSettings myComSetting = {
&&&&&&& BAUD9600, DATA_8, PAR_NONE, STOP_1, FLOW_OFF, 500};
在调试过程中,出现问题:
自动识别的串口号显示异常,串口号尾部有乱码字符
单步调试进去,发现是语句:valueSize
sizeof(keyValue);引起的问题。
解决办法:
将定义语句:wchar_t keyValue[];改为char
keyValue[];
我虽然用了wchar_t,但并不清楚具体用法和含义,查查去——
相对于char,C语言中有宽字符类型wchar_t。
wchar_t被定义为:typedef
unsigned short whar_t
表1 char与wchar_t的比较
常量字符表示方法
L’A’或’A’
L”hello”
sizeof(“hello”) = 6;
sizeof(L“hello”) = 12;
Strlen(“hello”) = 5;
wcslen(L”hello”) = 5;
1.wchar_t appName[5] = TEXT(“test”);
2.wchar_t* c2w(const char *str)
length = strlen(str)+1;
wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
memset(t,0,length*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
&(1)写串口程序时,要先打开串口,再进行设置。否则设置无效!
更新于:使用Qt5&串口操作类QtSerialPort——————
鉴于已经使用第三方串口类库完成了串口部分的功能,所以即使知道“Qt5&有了串口操作类QtSerialPort”,也没有真的花时间去了解该如何使用它。一直懒一直拖,直到——出现问题。
怎么描述这个问题呢?
简单说起来就是:下位机经串口连接至上位机,上电——使用自己的application执行串口打开操作,显示成功(单步执行亦然)。接着数据发送——问题来了:
分为两种情况:(1)串口助手serialTrace显示“串口关闭”,数据发送失败;(2)数据发送成功,但下位机上传数据显示为“无”。
初期的解决办法:使用早期MFC开发的app执行串口打开,发送单项命令数据,成功接收应答帧;关闭此app。在使用我的application,串口操作及数据收发立即正常。
真是奇怪。这样折腾好些次,受不了了。百度上搜一下,发现了同样的情况:&
对方的解决办法是——第三方库有问题,1.2版本的问题比较多,下载最新版本,能够解决这些问题。
so,我也去找最新版。可是,没有找到。
没办法,想偷懒的机会没有了。还是研究”Qt5&的串口操作类QtSerialPort“吧。。。
劳动人民有力量。嘻嘻,两个网页链接搞定。
其一::包含串口操作类QtSerialPort的小简介和小程序;
对该文的重点借鉴:
(1)projectName.pro中添加——
& &QT&&&&&&&+=&serialport
(2)需要包含的头文件——
文章开头关键的一句是:
“QT5的有一大好处就是
【串口正确初始化!!!】qt4的初始化常常要借助其他软件。”
——*——*——借助其他软件???和我遇到问题是一个!对吧。——*——*——
对该文的重点借鉴:串口初始化及串口参数设置函数的应用。
照猫画虎,修改一下原本的代码,具体修改有一下6项:
(1)添加:&
&QT&&&&&&&+=&serialport
(2)头文件:
//#include
"serial/win_qextserialport.h"//删除第三方库文件及相关语句
(3)串口变量:
Win_QextSerialPort *myC//声明对象
QSerialPort *myCom;//声明对象
(4)串口初始化:
1)&定义串口对象,并传递参数,在构造函数里对其进行初始化
myCom = new QSerialPort("com1", QextSerialBase::EventDriven);
myCom = new QSerialPort("com1");
2)串口参数设置:
//设置波特率
myCom-&setBaudRate(BAUD9600);
myCom-&setBaudRate(QSerialPort::Baud9600);
myCom-&setBaudRate(BAUD115200);
myCom-&setBaudRate(QSerialPort::Baud115200);
//设置奇偶校验
myCom-&setParity(PAR_NONE);//无校验
myCom-&setParity(QSerialPort::NoParity);
myCom-&setParity(PAR_ODD);//奇校验
myCom-&setParity(QSerialPort::OddParity);
myCom-&setParity(PAR_EVEN);//欧检验
myCom-&setParity(QSerialPort::EvenParity);
//设置停止位:1位
myCom-&setStopBits(STOP_1);
myCom-&setStopBits(QSerialPort::OneStop);
//设置流控制:无数据控制
myCom-&setFlowControl(FLOW_OFF);
myCom-&setFlowControl(QSerialPort::NoFlowControl);
(5)串口延时设置:
//设置延时
myCom-&setTimeout(2000);
没有找到相应的串口延时设置函数。。。索性就没写。
(6)补充:关闭串口的操作函数中补上delete语句
delete myCom;
在原来的程序中进行以上修改,编译——出现错误:报错提示不 "DWORD" does named a type
根据CSDN上的问题搜索:,添加头文件:
重新编译执行——串口打开成功,收发数据成功。
目前就是这样,还未发现别的问题。over!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 esp8266波特率设置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信