#QT(串口助手-实现)

本文详细描述了如何在QTCreator环境中设置串口通信参数,包括波特率、数据位、停止位和校验位,并通过槽函数关联按钮实现串口的打开、关闭、发送和接收功能。
摘要由CSDN通过智能技术生成

1.IDE:QTCreator


2.实验


3.记录

(1)在widget.h中加入必要文件,并且定义一个类指针

 

 (2)如果有类的成员不知道怎么写,可以通过以下途径搜索

(2)设置串口数据

void Widget::on_open_pb_clicked()       //当打开串口按下时
{
    QSerialPort::BaudRate buadrate;    // ::为作用域,定义波特率
    QSerialPort::DataBits databits;    //定义数据位
    QSerialPort::StopBits stopbits;   //定义停止位
    QSerialPort::Parity   checkbits;   //定义校验位
/******************波特率赋值******************************/
    if(ui->baudrate_cb->currentText()=="115200")
        buadrate=QSerialPort::Baud115200;
    else if(ui->baudrate_cb->currentText()=="9600")
        buadrate=QSerialPort::Baud9600;
    else if(ui->baudrate_cb->currentText()=="4800")
        buadrate=QSerialPort::Baud4800;
/******************数据位赋值*******************************/
    if(ui->data_cb->currentText()=="8")
        databits=QSerialPort::Data8;
    else if(ui->data_cb->currentText()=="7")
        databits=QSerialPort::Data7;
    else if(ui->data_cb->currentText()=="6")
        databits=QSerialPort::Data6;
    else if(ui->data_cb->currentText()=="5")
        databits=QSerialPort::Data5;
/*******************停止位赋值******************************/
    if(ui->stop_cb->currentText()=="1")
        stopbits=QSerialPort::OneStop;
    else if(ui->stop_cb->currentText()=="1.5")
        stopbits=QSerialPort::OneAndHalfStop;
    else if(ui->stop_cb->currentText()=="2")
        stopbits=QSerialPort::TwoStop;
/******************校验位赋值******************************/
    checkbits=QSerialPort::NoParity;         //因为强制选择无校验位
/******************设置串口*******************************/
    serialport->setPortName(ui->com_cb->currentText());    //设置串口名
    serialport->setBaudRate(buadrate);      //设置波特率
    serialport->setDataBits(databits);      //设置数据位
    serialport->setStopBits(stopbits);      //设置停止位
    serialport->setParity(checkbits);       //设置校验位

    if(serialport->open(QIODevice::ReadWrite)==true)    //串口打开成功
        QMessageBox::information(this,"提示","串口打开成功");
    else
        QMessageBox::critical(this,"警告","串口打开失败");
}

(3)将串口打开与串口关闭通过槽函数关联按钮(QMessageBox用于提示)

void Widget::on_close_pb_clicked()      //当关闭窗口按钮按下时
{
       serialport->close();
       QMessageBox::information(this,"提示","串口已经关闭");
}

 (4)关联准备读函数(函数部分widget前应该有void)

/*************************准备读函数*************************/
void Widget::SerialPort_ReadyRead_Slot()
{
    QString receive_buff;                   //定义一个数组,存放接收到的内容
    receive_buff=QString(serialport->readAll());
    ui->receive_line->appendPlainText(receive_buff);   //将接收到的内容在接收区显示出来
}

(5)发送函数关联

void Widget::on_send_pb_clicked()
{
       serialport->write(ui->send_line->text().toLocal8Bit().data());  //将发送区内容转换为8bit发送出去
}

 (6)清空函数关联

void Widget::on_clear_pb_clicked()    //当清空按钮按下时
{
        ui->receive_line->clear();
}

(7)运行效果 


4.代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "QSerialPort"      //加入文件

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    QSerialPort *serialport;        //定义一个QserialPort类的指针
private slots:
    void on_open_pb_clicked();

    void on_close_pb_clicked();

    void SerialPort_ReadyRead_Slot();   //准备读信号函数声明
    void on_send_pb_clicked();

    void on_clear_pb_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "QSerialPortInfo"   //引入必要的serial文件
#include "QMessageBox"      //消息提示
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QStringList serialNamePort;       //定义一个数组
    serialport = new QSerialPort(this);    //串口指针赋值给serialport

    connect(serialport,SIGNAL(readyRead()),this,SLOT(SerialPort_ReadyRead_Slot()));  //关联准备读信号

    foreach (const QSerialPortInfo &info ,QSerialPortInfo::availablePorts()) {      //自动搜索当前串口
        serialNamePort<<info.portName();      //将返回值加载入数组
    }
    ui->com_cb->addItems(serialNamePort);     //将搜索的串口加入UI界面
}

Widget::~Widget()
{
    delete ui;
}
/*************************准备读函数*************************/
void Widget::SerialPort_ReadyRead_Slot()
{
    QString receive_buff;                   //定义一个数组,存放接收到的内容
    receive_buff=QString(serialport->readAll());       //将接收到的数据转换为QString类型
    ui->receive_line->appendPlainText(receive_buff);   //将接收到的内容在接收区显示出来
}

void Widget::on_open_pb_clicked()       //当打开串口按下时
{
    QSerialPort::BaudRate buadrate;    // ::为作用域,定义波特率
    QSerialPort::DataBits databits;    //定义数据位
    QSerialPort::StopBits stopbits;   //定义停止位
    QSerialPort::Parity   checkbits;   //定义校验位
/******************波特率赋值******************************/
    if(ui->baudrate_cb->currentText()=="115200")
        buadrate=QSerialPort::Baud115200;
    else if(ui->baudrate_cb->currentText()=="9600")
        buadrate=QSerialPort::Baud9600;
    else if(ui->baudrate_cb->currentText()=="4800")
        buadrate=QSerialPort::Baud4800;
/******************数据位赋值*******************************/
    if(ui->data_cb->currentText()=="8")
        databits=QSerialPort::Data8;
    else if(ui->data_cb->currentText()=="7")
        databits=QSerialPort::Data7;
    else if(ui->data_cb->currentText()=="6")
        databits=QSerialPort::Data6;
    else if(ui->data_cb->currentText()=="5")
        databits=QSerialPort::Data5;
/*******************停止位赋值******************************/
    if(ui->stop_cb->currentText()=="1")
        stopbits=QSerialPort::OneStop;
    else if(ui->stop_cb->currentText()=="1.5")
        stopbits=QSerialPort::OneAndHalfStop;
    else if(ui->stop_cb->currentText()=="2")
        stopbits=QSerialPort::TwoStop;
/******************校验位赋值******************************/
    checkbits=QSerialPort::NoParity;         //因为强制选择无校验位
/******************设置串口*******************************/
    serialport->setPortName(ui->com_cb->currentText());    //设置串口名
    serialport->setBaudRate(buadrate);      //设置波特率
    serialport->setDataBits(databits);      //设置数据位
    serialport->setStopBits(stopbits);      //设置停止位
    serialport->setParity(checkbits);       //设置校验位

    if(serialport->open(QIODevice::ReadWrite)==true)    //串口打开成功
        QMessageBox::information(this,"提示","串口打开成功");
    else
        QMessageBox::critical(this,"警告","串口打开失败");
}


void Widget::on_close_pb_clicked()      //当关闭窗口按钮按下时
{
       serialport->close();
       QMessageBox::information(this,"提示","串口已经关闭");
}


void Widget::on_send_pb_clicked()      //当发送按钮按下时
{
       serialport->write(ui->send_line->text().toLocal8Bit().data());  //将发送区内容转换为8bit发送出去
}


void Widget::on_clear_pb_clicked()    //当清空按钮按下时
{
        ui->receive_line->clear();
}

 pro文件(只加入了serialport,以及自动加入的图标文件)

QT       += core gui 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 += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

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

RESOURCES += \
    tubiao.qrc

 

以下是使用QT串口助手实现协议解析的步骤: 1.打开QT串口助手,连接串口设备。 2.在串口助手中设置协议解析规则,例如:以“#”作为帧头,“\r\n”作为帧尾,第1-2个字节表示数据长度,第3个字节表示命令类型,第4-5个字节表示数据内容。 3.在串口助手中接收到数据后,根据协议解析规则进行解析,提取出数据内容并进行处理。 4.将处理后的数据显示在串口助手的界面上或者发送给其他设备。 下面是一个简单的QT串口助手协议解析的示例代码: ```python # 导入必要的模块 from PyQt5.QtCore import QIODevice, QByteArray from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo # 定义协议解析规则 FRAME_HEAD = b'#' FRAME_TAIL = b'\r\n' DATA_LEN_INDEX = 0 CMD_TYPE_INDEX = 2 DATA_CONTENT_INDEX = 3 # 定义串口助手类 class SerialHelper: def __init__(self): self.serial = QSerialPort() self.serial.readyRead.connect(self.receive_data) # 打开串口 def open_serial(self, port_name, baud_rate): self.serial.setPortName(port_name) self.serial.setBaudRate(baud_rate) self.serial.setDataBits(QSerialPort.Data8) self.serial.setParity(QSerialPort.NoParity) self.serial.setStopBits(QSerialPort.OneStop) self.serial.setFlowControl(QSerialPort.NoFlowControl) if self.serial.open(QIODevice.ReadWrite): return True else: return False # 关闭串口 def close_serial(self): self.serial.close() # 发送数据 def send_data(self, data): self.serial.write(data) # 接收数据 def receive_data(self): data = self.serial.readAll() if data: self.parse_data(data) # 解析数据 def parse_data(self, data): frame_head_pos = data.indexOf(FRAME_HEAD) frame_tail_pos = data.indexOf(FRAME_TAIL) if frame_head_pos != -1 and frame_tail_pos != -1 and frame_tail_pos > frame_head_pos: data_len = data[DATA_LEN_INDEX:CMD_TYPE_INDEX] cmd_type = data[CMD_TYPE_INDEX] data_content = data[DATA_CONTENT_INDEX:frame_tail_pos] # 处理数据内容 print(data_content) ``` 相关问题:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值