Qt串口回路信号读取多线程14串口测试方案

2023年 11月 15日 20.5k 0

QSerialPort串口

一、思路

串口测试分为三种:

  • 回路测试
  • 对传
  • 485模式,可以传输更远的距离

二、环境

  • Qt 6.4.3
  • Qt serial port模块
  • Qt Creator 11.0.1

三、添加QSerialPort

  • 打开Qt mataintenanceTool
  • 登录
  • 添加/移动组件,点击下一步

  • 主要是选择Qt Serial Bus, Qt Serial Port
  • 点击下一步
  • 点击更新即可

四、语句介绍

1.数据控制流

数据控制流 USART_HardwareFlowControl ,控制流,这里的流指数据流,在数据传输中,流控制室管理两个节点之间数据传输速率过程,以防止出现接收端的数据缓存区已满,而发送端依然继续发送数据,所以导致数据丢失。

(1) 工作原理

当接受端的数据缓冲区已满,无法处理数据来时,就发出不再接受的信号,发送端则停止发送,直到发送端收到可以继续发送的信号再发送数据,常见的硬件控制流和软件控制流

(2) 硬件控制流

硬件控制流

RTS和CTS原本是用来询问和回答是否可以传输数据。在上面的连接上,就是告诉对方自己子否可以进行通讯,此时RTS和DTR都可以用来对数据流进行控制。

A端DTR(数据设备就绪)发出信号,当B端准备好后,B端的DTR(数据设备就绪)向A端的DSR(通讯设备就绪发送信号),然后就可以通过RTS(请求发送)和DTR(允许发送)来控制通信。

硬件控制流并不是单纯依赖硬件,它仍然需要软件去处理识别,硬件控制流所做的只是给出信号电平。

(3) 软件控制流

软件流控制(Software flow control)是在计算机数据链路中的一种控制方法,特别适合于RS-232串口通信;它是采用特殊字符来船速带内信令,特殊编码字符称作XOFF与XON(分别表示transmit off与transmit on)。因此也被称作XON/XOFF流控制

使用ASCII字符集,XOFF一般为字节值19(十进制),XON为字节值17

(4) 工作方式

注意:是接收方把XON/XOFF信号发给发送方来控制发送方何时发送数据,这些信号是与发送数据的传输方向相反的。

接收方利用XON信号告诉发送方,我已经准备好接受更多的数据了,利用XOFF信号告诉发送方停止发送数据,直到接收方发送XON信号告诉发送方我再次准备好了。

(5) 设置控制流模式

setFlowControl 函数:

// setFlowControl对端口控制进行相关设置 无流量控制
serial->setFlowControl(QSerialPort::NoFlowControl);
  • NoFlowControl:没有控制
  • hardware flow control :硬件流控制 (RTS/CTS,DTR /DSR等)
  • Software flow control :软件流控制 (XON/XOFF)

设置控制流

2.设置端口

设置端口的名称,此名字可以使用短名称或者长系统地址。

void QSerialPort::setPortName(const QString &name)

3.波特率

输出传输的速率,每秒传输的比特数。

enum QSerialPort::BaudRate
    
/// 可以选择的内容为

Constant

Value

Description

QSerialPort::Baud1200

1200

1200 baud.

QSerialPort::Baud2400

2400

2400 baud.

QSerialPort::Baud4800

4800

4800 baud.

QSerialPort::Baud9600

9600

9600 baud.

QSerialPort::Baud19200

19200

19200 baud.

QSerialPort::Baud38400

38400

38400 baud.

QSerialPort::Baud57600

57600

57600 baud.

QSerialPort::Baud115200

115200

115200 baud.

4.数据位

设置数据位并保存到帧中,如果设置成功,则返回true,否则返回false,并设置一个错误代码,可以通过访问QSerialPort::error属性的值来获取该代码。

如果在打开端口之前设置了该设置,则实际的串行端口设置将在QSerialPort::open()方法中自动完成,然后端口打开成功。

bool setDataBits(DataBits dataBits);
DataBits dataBits() const;

数据位

5.奇偶校验位

奇偶校验位

bool setParity(Parity parity);
Parity parity() const;

6.设置停止位

停止位

bool setStopBits(StopBits stopBits);
StopBits stopBits() const;

7.发送方式

Hex 16进制,本质上就是将字节数数组转化为16进制,然后用字符串的形式发送出去。

五、对于ui参数随数字变化如何设置

int p = 1;
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
    PortStringList += info.portName();
    ui->port->addItem(info.portName());

    // 构造对象名
    QString objectName = QString("comlist%1").arg(p);

    // 查找对象
    QLineEdit *comlist = this->findChild(objectName);
    if(comlist) {
        comlist->setText(info.portName());
    }

    p++;
}

六、字符串截取

QString snap = QString("COM");
int com_num = com.remove(snap).toInt();

七、源代码

linux与windows端通用多线程串口,可同时检测14个串口。

1.Com_Test.pro

QT       += core gui
QT       += serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += 
    comthread.cpp 
    main.cpp 
    mainwindow.cpp

HEADERS += 
    comthread.h 
    mainwindow.h

FORMS += 
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2.comthread.h

#ifndef COMTHREAD_H
#define COMTHREAD_H

#include
#include
#include
#include
#include

class ComThread :public QObject
{
Q_OBJECT
public:
explicit ComThread(QObject *parent = nullptr);
explicit ComThread(QString portname,qint32 rate,qint32 date,qint32 check_num,qint32 stop_num);
explicit ComThread(qint32 rate,qint32 date,qint32 check_num,qint32 stop_num);
explicit ComThread(QString portname);
// 拷贝构造函数
explicit ComThread(const ComThread &other);
ComThread& operator = (const ComThread &other)
{
qDebug()m_date = other.m_date;
this->m_rate = other.m_rate;
this->m_stop_num = other.m_stop_num;

qDebug()m_stop_num = other.m_stop_num;
}

ComThread::ComThread(QString portname, qint32 rate,qint32 date,qint32 check_num,qint32 stop_num)
{
m_com = portname;
m_rate = rate;
m_date = date;
m_check_num = check_num;
m_check_num = stop_num;

}

ComThread::ComThread(qint32 rate, qint32 date, qint32 check_num, qint32 stop_num)
{
m_rate = rate;
m_date = date;
m_check_num = check_num;
m_check_num = stop_num;
}

ComThread::~ComThread()
{
if(mSerialPort->isOpen())
{
mSerialPort->close();
}
delete mSerialPort;
}

void ComThread::slot_recv_com(QString portname, qint32 rate, qint32 date, qint32 check_num, qint32 stop_num)
{
m_com = portname;
m_rate = rate;
m_date = date;
m_check_num = check_num;
m_stop_num = stop_num;
}
void ComThread::slot_recv_com_s(qint32 rate, qint32 date, qint32 check_num, qint32 stop_num)
{
m_rate = rate;
m_date = date;
m_check_num = check_num;
m_stop_num = stop_num;
}

void ComThread::slot_recv_com_name(QString portname)
{
m_com = portname;
}

void ComThread::slot_openPort()
{
mSerialPort = new QSerialPort();

// qDebug()bo_num->setCurrentIndex(5);
ui->data_num->setCurrentIndex(3);
ui->check_num->setCurrentIndex(2);
ui->stop_num->setCurrentIndex(0);
}

MainWindow::~MainWindow()
{
delete ui;
if(mthread->isRunning())
{
mthread->quit();
mthread->wait();
delete[] mthread;
// delete[] comthread;
}
}

void MainWindow::slots_already_send_byte(QString com, int num)
{
int com_num = com.remove(snap).toInt();
QString objectname = QString("send_byte_") + QString::number(com_num);

QLabel *label = this->findChild(objectname);
if(label)
{
label->setText(QString::number(num));
}
qDebug()findChild(objectname);
if(ToolButton)
{
ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
}
}
}

qDebug()

相关文章

如何删除WordPress中的所有评论
检查WordPress服务器磁盘使用情况的7种简便方法(查找大文件和数据)
如何更改WordPress常量FS_METHOD
如何为区块编辑器、Elementor等构建WordPress文章模板
如何彻底地删除WordPress主题及相关内容
如何使用WordPress搭建一个内网

发布评论