精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Qt串口回路信號讀取多線程14串口測試方案

開發
硬件控制流并不是單純依賴硬件,它仍然需要軟件去處理識別,硬件控制流所做的只是給出信號電平。

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<QLineEdit *>(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 <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QThread>

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()<<"進入拷貝";
        if(this != &other)
        {
            qDebug()<<"進入拷貝賦值";
            this->m_com = other.m_com;
            this->mSerialPort = other.mSerialPort;
            this->m_check_num = other.m_check_num;
            this->m_date = other.m_date;
            this->m_rate = other.m_rate;
            this->m_stop_num = other.m_stop_num;

            qDebug()<<"賦值結束";
        }
        qDebug()<<"返回值";
        return *this;
    }

    ~ ComThread();
public slots:
    // 接受傳入的串口數據
    void slot_recv_com(QString portname,qint32 rate,qint32 date,qint32 check_num,qint32 stop_num);
    void slot_recv_com_s(qint32 rate,qint32 date,qint32 check_num,qint32 stop_num);
    void slot_recv_com_name(QString portname);
    // 對應主線程的信號,需要的槽函數
    // 1,打開串口槽函數
    // 2,關閉串口槽函數
    void slot_openPort();
    void slot_closePort();
    void slot_handlMessage();
    void serial_signal();
private:
    QSerialPort* mSerialPort;
    QString m_com;
    qint32 m_rate;
    qint32 m_date;
    qint32 m_check_num;
    qint32 m_stop_num;

    QByteArray  Receivetext;
signals:
    // 發送信號

    // 發送字節
    void already_send_byte(QString com ,qint32 num);
    // 發送接受字節
    void already_receive_byte(QString com ,qint32 num);
    // 發送是否成功
    void result(QString com ,qint32 num);  // 0代表失敗 1,代表成功
    // 發送接受字符串
    void already_receive_string(QString com ,QString string);
    void send_com_signal(QString com,bool DTRstate,bool DCDstate,bool DSRstate,bool RINGRstate,bool RTSstate,bool CTSstate,bool STDstate,bool SRDstate);

};

#endif // COMTHREAD_H

3.comthread.cpp

#include "comthread.h"

ComThread::ComThread(QObject *parent)
    : QObject{parent}
{
    //    mSerialPort = nullptr;
}

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

ComThread::ComThread(const ComThread &other)
{
//    qDebug()<<"進入賦值拷貝";
    this->m_com = other.m_com;
    this->mSerialPort = other.mSerialPort;
    this->m_check_num = other.m_check_num;
    this->m_date = other.m_date;
    this->m_rate = other.m_rate;
    this->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()<<" "<< m_com<<" "<<m_rate<<" "<<m_date<<" "<<m_check_num<<" "<<m_stop_num;
    // 設置串口對應的名稱和波特率
    mSerialPort->setPortName(m_com);
    mSerialPort->setBaudRate(m_rate);
    switch(m_date)
    {
        //設置對應的數據位
        case5:mSerialPort->setDataBits(QSerialPort::Data5);break;
        case6:mSerialPort->setDataBits(QSerialPort::Data6);break;
        case7:mSerialPort->setDataBits(QSerialPort::Data7);break;
        case8:mSerialPort->setDataBits(QSerialPort::Data8);break;
        // 若剛開始設置為空,端口打開之后再次進行相關的設置
        // 若沒有選擇就不設置,端口打開之后仍可以設置
        //default:serial->setDataBits(QSerialPort::UnknownDataBits);
    }
    switch(m_check_num)
    {
        case0:mSerialPort->setParity(QSerialPort::NoParity);break;
        case1:mSerialPort->setParity(QSerialPort::EvenParity);break;
        case2:mSerialPort->setParity(QSerialPort::OddParity);break;
        case3:mSerialPort->setParity(QSerialPort::SpaceParity);break;
        case4:mSerialPort->setParity(QSerialPort::MarkParity);break;
            //default:serial->setParity(QSerialPort::UnknownParity);
    }
    switch(m_stop_num)
    {

        case0:mSerialPort->setStopBits(QSerialPort::OneStop);break;
        case1:mSerialPort->setStopBits(QSerialPort::OneAndHalfStop);break;
        case2:mSerialPort->setStopBits(QSerialPort::TwoStop);break;
        //default:serial->setStopBits(QSerialPort::UnknownStopBits);
    }
    // 關聯讀取信號與槽函數,處理信息
    mSerialPort->setFlowControl(QSerialPort::NoFlowControl);
    connect(mSerialPort,&QSerialPort::readyRead,this,&ComThread::slot_handlMessage);
    qDebug()<<"ComThread slot_openport ThreadID"<< QThread::currentThreadId();
    if(mSerialPort->open(QIODevice::ReadWrite))
    {
        this->serial_signal();
        // 發送數據
        for(int i = 0;i<5;i++)
        {
            QString realbom = QString("RealReal");
            QByteArray send = realbom.toUtf8();
            // qDebug()<<send<<"Byte大小:"<<send.length();
            mSerialPort->write(send);
            emit already_send_byte(m_com,send.length());
            // QThread::msleep(1000);
            mSerialPort->waitForReadyRead(10); // 接受數據

        }
        // qDebug()<<"發送完畢";
        // mSerialPort->waitForReadyRead(100); // 接受數據
        this->slot_closePort();
    }
    else
    {
        //  qDebug()<<"return false";
        // 關閉信號
        emit result(m_com,0);

    };
    if(Receivetext.size() == 0)
    {
        //完全沒有接收到數據
        emit result(m_com,0);
    }

}
void ComThread::slot_closePort()
{
    if(mSerialPort->isOpen())
    {
        mSerialPort->close();
    }
}

void ComThread::slot_handlMessage()
{
    qDebug()<<"調用了此信號";
    // mSerialPort->waitForBytesWritten(100);
    Receivetext = mSerialPort->readAll();
    // qDebug()<<"接收:"<<QString::fromUtf8(Receivetext)<<"Byte大小:"<<Receivetext.length();
    emit already_receive_byte(m_com,Receivetext.length());
    emit already_receive_string(m_com,QString::fromUtf8(Receivetext));
    if(Receivetext == QString("RealReal") && Receivetext.length() == 7)
    {
        emit result(m_com,1);
    }
    else
    {
        emit result(m_com,0);
    }
}

void ComThread::serial_signal()
{
    // 獲取相關高低電壓值No
    // bool NOstate = serial->pinoutSignals()& QSerialPort::NoSignal; // 沒有信號
    // 數據終端準備好
    bool DTRstate = mSerialPort->pinoutSignals()& QSerialPort::DataTerminalReadySignal;
    // 載波信號
    bool DCDstate = mSerialPort->pinoutSignals()& QSerialPort::DataCarrierDetectSignal;
    // 數據準備好
    bool DSRstate = mSerialPort->pinoutSignals()& QSerialPort::DataSetReadySignal;
    //
    bool RINGRstate = mSerialPort->pinoutSignals()& QSerialPort::RingIndicatorSignal;
    // 請求發送
    bool RTSstate = mSerialPort->pinoutSignals()& QSerialPort::RequestToSendSignal;
    // 清除發送
    bool CTSstate = mSerialPort->pinoutSignals()& QSerialPort::ClearToSendSignal;
    // 發送數據
    bool STDstate = mSerialPort->pinoutSignals()& QSerialPort::SecondaryTransmittedDataSignal;
    // 接受數據
    bool SRDstate = mSerialPort->pinoutSignals()& QSerialPort::SecondaryReceivedDataSignal;
    emit send_com_signal(m_com,DTRstate,DCDstate,DSRstate,RINGRstate,RTSstate,CTSstate,STDstate,SRDstate);
    /*
    if(DTRstate)
    {
//        ui->DTR->setStyleSheet("background-color:red");
        qDebug()<<"DTRstate";
    }


    if(DCDstate)
    {
//        ui->DCD->setStyleSheet("background-color:red");
        qDebug()<<"DCDstate";
    }

    if(DSRstate)
    {
//        ui->DSR->setStyleSheet("background-color:red");
        qDebug()<<"DSRstate";
    }
    if(RINGRstate)
    {
//        ui->PNG->setStyleSheet("background-color:red");
        qDebug()<<"RINGRstate";
    }
    if(RTSstate)
    {
//        ui->RTS->setStyleSheet("background-color:red");
         qDebug()<<"RTSstate";
    }
    if(CTSstate)
    {
//        ui->CTS->setStyleSheet("background-color:red");
         qDebug()<<"CTSstate";
    }
    if(STDstate)
    {
//        ui->STD->setStyleSheet("background-color:red");
         qDebug()<<"STDstate";
    }

    if(SRDstate)
    {
//        ui->SRD->setStyleSheet("background-color:red");
         qDebug()<<"SRDstate";
    }
*/
}

4.mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "comthread.h"
#include <QThread>
//#include <QThreadPool>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow :public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    void sig_recv_com(QString portname, qint32 rate, qint32 date, qint32 check_num, qint32 stop_num);
    void sig_recv_com_s(qint32 rate, qint32 date, qint32 check_num, qint32 stop_num);
    void sig_recv_com_name(QString portname);
    void sig_openPort();
    void sig_closePort();
public slots:
    // 接受子線程傳回的數據
    void slots_already_send_byte(QString com ,qint32 num);
    // 接受字節
    void slots_already_receive_byte(QString com ,qint32 num);
    // 是否成功
    void slots_result(QString com ,qint32 num);  // 0代表失敗 1,代表成功
    // 接受字符串
    void slots_already_receive_string(QString com ,QString string);
    // 接受引腳信號
    void send_com_signal(QString com,bool DTRstate,bool DCDstate,bool DSRstate,bool RINGRstate,bool RTSstate,bool CTSstate,bool STDstate,bool SRDstate);
private slots:

    void on_serial_test_clicked();
protected:

private:
    Ui::MainWindow *ui;
    QStringList PortStringList; // 串口列表
//    QThreadPool *pool = QThreadPool::globalInstance();
    ComThread *comthread;
//    std::vector<ComThread> comthread;
    QThread *mthread;
    QString snap;


};
#endif // MAINWINDOW_H

5.mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //設計循環,將數據放入list列表當中
    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<QLineEdit *>(objectName);
        if(comlist) {
            comlist->setText(info.portName());
        }
        p++;
    }


    //設置UI頁面的默認Index
    ui->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<QLabel *>(objectname);
    if(label)
    {
        label->setText(QString::number(num));
    }
    qDebug()<<com<<"已發送"<<num;

}

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

    QLabel *label = this->findChild<QLabel *>(objectname);
    if(label)
    {
        label->setText(QString::number(num));
    }
    qDebug()<<com<<"已接收"<<num;
}

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

    QPushButton *button = this->findChild<QPushButton *>(objectname);
    if(button)
    {
        if(1 == num)
        {
            button->setText("通過");
            button->setStyleSheet("background-color:rgb(27,167,132)");
        }
        else
        {
            button->setText("失敗");
            button->setStyleSheet("background-color:rgb(238, 72, 99)");
        }
    }
    qDebug()<<com<<"測試結果(0代表失敗 1,代表成功)"<<num;
}

void MainWindow::slots_already_receive_string(QString com, QString string)
{
    int com_num = com.remove(snap).toInt();
    QString objectname = QString("recv_date_") + QString::number(com_num);

    QLineEdit *Edit = this->findChild<QLineEdit *>(objectname);
    if(Edit)
    {
        Edit->setText(string);
    }
    qDebug()<<com<<"已接收字符串"<<string;
}

void MainWindow::send_com_signal(QString com, bool DTR, bool DCD, bool DSR, bool RNG, bool RTS, bool CTS, bool STD, bool SRD)
{
    int com_num = com.remove(snap).toInt();
    {
        if(DTR)
        {
            QString objectname = QString("DTR_") + QString::number(com_num);
            QToolButton *ToolButton = this->findChild<QToolButton *>(objectname);
            if(ToolButton)
            {
                ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
            }
        }
        if(DCD)
        {
            QString objectname = QString("DCD_") + QString::number(com_num);
            QToolButton *ToolButton = this->findChild<QToolButton *>(objectname);
            if(ToolButton)
            {
                ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
            }
        }
        if(DSR)
        {
            QString objectname = QString("DSR_") + QString::number(com_num);
            QToolButton *ToolButton = this->findChild<QToolButton *>(objectname);
            if(ToolButton)
            {
                ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
            }
        }
        if(RNG)
        {
            QString objectname = QString("RNG_") + QString::number(com_num);
            QToolButton *ToolButton = this->findChild<QToolButton *>(objectname);
            if(ToolButton)
            {
                ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
            }
        }
        if(RTS)
        {
            QString objectname = QString("RTS_") + QString::number(com_num);
            QToolButton *ToolButton = this->findChild<QToolButton *>(objectname);
            if(ToolButton)
            {
                ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
            }
        }
        if(CTS)
        {
            QString objectname = QString("CTS_") + QString::number(com_num);
            QToolButton *ToolButton = this->findChild<QToolButton *>(objectname);
            if(ToolButton)
            {
                ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
            }
        }
        if(STD)
        {
            QString objectname = QString("STD_") + QString::number(com_num);
            QToolButton *ToolButton = this->findChild<QToolButton *>(objectname);
            if(ToolButton)
            {
                ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
            }
        }
        if(SRD)
        {
            QString objectname = QString("SRD_") + QString::number(com_num);
            QToolButton *ToolButton = this->findChild<QToolButton *>(objectname);
            if(ToolButton)
            {
                ToolButton->setStyleSheet("background-color:rgb(240, 124, 130)");
            }
        }
    }

    qDebug()<<"com"<<"DTRstate"<<"DCDstate"<<"DSRstate"<<"RINGRstate"<<"RTSstate"<<"CTSstate"<<"STDstate"<<"SRDstate";


    qDebug()<<com<<DTR<<DCD<<DSR<<RNG<<RTS<<CTS<<STD<<SRD;
}


// 點擊進入串口回路測試
void MainWindow::on_serial_test_clicked()
{
    // 判斷當前系統
#ifdef Q_OS_WIN
    snap = QString("COM");
#elif defined(Q_OS_LINUX)
    snap = QString("ttyS");
#endif


    int qserial_size = PortStringList.size();
    bool open_test[qserial_size];
    for (int i = 0; i < qserial_size; ++i) {
        open_test[i] = true;
    }
    // 獲取串口等信息
    QString Port = ui->port->currentText();
    qint32 rate = ui->bo_num->currentText().toInt();
    qint32 date = ui->data_num->currentText().toInt();
    qint32 check_num = ui->check_num->currentIndex();
    qint32 stop_num = ui->stop_num->currentIndex();
//    qDebug()<<"檢查位:"<<check_num<<"停止位:"<<stop_num;

    // TODO多com口同時測試  14個線程
    mthread = new QThread[qserial_size];
    /*
    // comthread = new ComThread(Port,rate,date,check_num,stop_num);
    // comthread = new ComThread[14](Port,rate,date,check_num,stop_num);
    // ComThread * comthread = new ComThread[PortStringList.size()];
//    comthread = new ComThread[qserial_size];
    // 為每個元素分配對應的端口,并初始化ComThread對象數組
//    for (int i = 0; i < qserial_size; ++i) {
//        comthread[i] = ComThread(PortStringList.at(i));
//    }
*/


/*
    for(int m = 0;m < qserial_size; m++)
    {
        // comthread[m] = ComThread(PortStringList.at(m));
//        comthread.emplace_back(ComThread(PortStringList.at(m)));
    }
    {
        ComThread(PortStringList.at(0)),
        ComThread(PortStringList.at(1)),
        ComThread(PortStringList.at(2)),
        ComThread(PortStringList.at(3)),
        ComThread(PortStringList.at(4)),
        ComThread(PortStringList.at(5)),
        ComThread(PortStringList.at(6)),
        ComThread(PortStringList.at(7)),
        ComThread(PortStringList.at(8)),
        ComThread(PortStringList.at(9)),
        ComThread(PortStringList.at(10)),
        ComThread(PortStringList.at(11)),
        ComThread(PortStringList.at(12)),
        ComThread(PortStringList.at(13)),
    };
*/
    int i = 0;
    foreach(QString com_e,PortStringList)
    {
        ComThread *comthread = new ComThread(com_e);
        // qDebug()<<com_e;
        // 移入線程

//        comthread[i].moveToThread(&mthread[i]);
        comthread->moveToThread(&mthread[i]);
        mthread[i].start();

        //關聯信號
        if(open_test[i])
        {
//            connect(this,&MainWindow::sig_openPort,&comthread[i],&ComThread::slot_openPort);
//            connect(this,&MainWindow::sig_recv_com_s,&comthread[i],&ComThread::slot_recv_com_s);
            connect(this,&MainWindow::sig_openPort,comthread,&ComThread::slot_openPort);
            connect(this,&MainWindow::sig_recv_com_s,comthread,&ComThread::slot_recv_com_s);
            // 關聯返回信號
            connect(comthread,&ComThread::already_receive_byte,this,&MainWindow::slots_already_receive_byte);
            connect(comthread,&ComThread::already_receive_string,this,&MainWindow::slots_already_receive_string);
            connect(comthread,&ComThread::already_send_byte,this,&MainWindow::slots_already_send_byte);
            connect(comthread,&ComThread::result,this,&MainWindow::slots_result);
            connect(comthread,&ComThread::send_com_signal,this,&MainWindow::send_com_signal);

            open_test[i] = false;
        }
        qDebug()<<"main ThreaiD:"<<QThread::currentThreadId();
        emit sig_recv_com_s(rate,date,check_num,stop_num);
        emit sig_openPort();
//        pool->start(comthread);
        {
            // 取消單個信號對所有串口的信號連接
//            disconnect(this,&MainWindow::sig_openPort,&comthread[i],&ComThread::slot_openPort);
//            disconnect(this,&MainWindow::sig_recv_com_s,&comthread[i],&ComThread::slot_recv_com_s);
            disconnect(this,&MainWindow::sig_openPort,comthread,&ComThread::slot_openPort);
            disconnect(this,&MainWindow::sig_recv_com_s,comthread,&ComThread::slot_recv_com_s);
        }
        i++;
        // pool->waitForDone();
        //
        qDebug()<<"執行結束";
//        QThread::sleep(1);
        // mthread->quit();
        // mthread[0].isFinished();

    }
    // 循環結束線程
    for(int j = 0;j<PortStringList.size();j++)
    {
        if(mthread[j].isFinished())
        {
            // qDebug()<<"quit"<<j;
            mthread[j].quit();
            mthread[j].wait();

        }
        else
        {
            // qDebug()<<"wait"<<j;
            mthread[j].quit();
            mthread[j].wait();

        }
    }
//    delete [] mthread;
}

6.main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

八、問題解決

1.多線程中出現QObject: Cannot create children for a parent that is in a different thread

這個錯誤提示的實際意思是,不能在子線程中生成跨線程調用的成員。如果一個成員在父線程中被直接調用了,那么這個成員必須處在父線程中,強行在子線程中生成就會出現這個錯誤提示。

將在多線程中構造函數中new出來的變量,放到run中執行,因為構造函數是在主線程完成初始化的,線程所屬于不同的線程,就會出現此類錯誤。

解決此問題的關鍵將線程放到一個地方,例如子線程中的對串口的new定義。

2.munmap_chunk(): invalid pointer解決方案線程池釋放,程序崩潰

程序分析:將程序線程池取消自動釋放,結果程序確實沒有發生崩潰,可以繼續運行,所以分析斷定,程序崩潰為線程池析構時的問題。

展示關閉線程自動銷毀功能,同時程序中多次使用。

解決方案:檢查程序結束,或者異常結束資源銷毀問題。

3.循環發送信息,并沒有收到數據,而是最后一起收到數據

在發送數據之后,加入waitForReadyRead(10);函數,就會接受數據,此函數功能為等待接受,與其說等待,其實立馬就接受了數據。否則在測試當中出現了五次循環結束,一同接受數據的情況。

for(int i = 0;i<5;i++)
{
    QString realbom = "realbom";
    QByteArray send = realbom.toUtf8();
    qDebug()<<send;
    mSerialPort->write(send);
//        QThread::sleep(1);
    mSerialPort->waitForReadyRead(10); // 接受數據
}

4.接受數據和發送數據格式不同,接受數據亂碼

  • 查詢是否是串口參數配置問題。我的確實是此問題,當時確實是玩完沒有想到,設置默認值之后,就可以
  • 設置正確的編碼轉換關系
QByteArray send = realbom.toUtf8();
qDebug()<<send<<"Byte大小:"<<send.length();
mSerialPort->write(send);
QByteArray  Receivetext = mSerialPort->readAll();
qDebug()<<"接收:"<<QString::fromUtf8(Receivetext)<<"Byte大小:"<<Receivetext.length();


責任編輯:趙寧寧 來源: 瓶子的跋涉
相關推薦

2011-07-01 13:03:32

QT 線程 串口

2011-06-30 17:31:32

Qt 多線程 信號

2011-06-22 17:49:35

Linux Qt 串口

2011-06-13 17:46:07

Qt 串口通信

2011-06-28 10:11:05

Qt Qt 4.1.0 注冊表

2021-06-26 07:50:20

STM32串口開發環形緩沖區

2021-12-27 16:06:25

物聯網WiFi芯片

2011-06-29 14:42:06

Qt 串口

2011-06-29 14:23:08

Qt 串口

2011-06-27 11:08:37

Qt 串口 通信

2011-06-29 14:32:25

Qt 串口

2011-06-22 17:36:50

QT Linux 串口

2011-06-29 13:50:15

Qt 串口

2011-06-29 14:06:15

Qt 串口

2010-06-11 11:35:55

Linux串口測試工具

2011-06-29 16:34:11

Qt 子線程 線程

2021-01-18 05:30:22

串口通信Qt

2021-02-18 07:17:41

串口COM口物理接口

2010-06-07 14:05:38

Linux串口測試工具

2009-04-11 15:12:24

VxWorks串口例子
點贊
收藏

51CTO技術棧公眾號

超碰在线97av| 久久久精品91| 久久久久久久久综合| 免费成人小视频| 免费一级在线观看播放网址| 久久这里只有精品8| 欧美精品久久99| 成人激情电影在线| 久久99国产综合精品免费| 国产成人精品免费视频大全最热| 国产精品美女久久久久高潮| 向日葵视频成人app网址| 成年人在线观看av| 91精品国产色综合| 国产日韩欧美激情| 成人国产精品一区二区免费麻豆 | 神马影院午夜我不卡| 欧美综合一区二区| 欧美mv日韩| 国产绳艺sm调教室论坛| 韩国无码av片在线观看网站| 欧美xfplay| 9久re热视频在线精品| 视频福利在线| 亚洲午夜激情影院| 久久这里有精品视频| 成年人午夜久久久| 成人在线观看免费播放| 26uuu成人网| 久久99精品国产一区二区三区| 91黄色在线观看| 1024精品久久久久久久久| 免费av网站观看| www.99av.com| 91精品国产色综合久久不卡98口 | av 一区二区三区| www.亚洲天堂网| 久久久精品视频在线观看| 99精品国产91久久久久久| 亚洲91在线| 午夜一区二区三区四区| av女优在线播放| 精品国产区一区二区三区在线观看| 国产成人综合网| 亚洲成av在线| 美日韩一二三区| 欧美性猛交内射兽交老熟妇| 最近2019免费中文字幕视频三| 成人97人人超碰人人99| 欧洲一区在线| 国产免费黄色录像| 日本三级黄色网址| 国产欧美日韩91| 亚洲精品suv精品一区二区| 精品午夜一区二区三区在线观看| 噜噜噜在线观看播放视频| 三大队在线观看| 国产欧美 在线欧美| 欧美性猛交一区二区三区精品| 亚洲欧美成人| 伊人久久综合一区二区| 午夜毛片在线观看| 黄色大片中文字幕| 97在线精品视频| 欧美日韩一区二区三区| 日韩精品一区第一页| 免费观看成人性生生活片| 亚洲精品成人在线视频| 无限资源日本好片| 91在线免费看片| 精品国产污污免费网站入口 | 视频在线观看一区| 国内av一区二区三区| 性高潮久久久久久久| 日韩高清dvd| 久久国产精品久久国产精品| 五月天丁香久久| 免费在线观看成人| av一级亚洲| www.亚洲.com| 国产系列精品av| 日本在线播放一区二区| 666精品在线| 亚洲天堂av在线免费| 亚洲精品少妇30p| 亚洲女同同性videoxma| 91精品久久久久久综合五月天| 五月婷婷伊人网| 日本精品在线免费观看| 亚洲精品无码久久久久久| 成人自拍性视频| 亚洲午夜女主播在线直播| 亚洲综合一二三区| 国产在线精品一区二区夜色| 久草精品在线| 这里有精品可以观看| 精品久久久无码中文字幕| а天堂中文在线资源| 午夜肉伦伦影院| caoporen国产精品| 操91在线视频| 欧美一区二区三区色| 国产精品视频一二三| 久久久久国产精品一区三寸| 色天天色综合| 超碰在线观看av| 久草视频中文在线| 香蕉网在线视频| 国产成a人亚洲精v品在线观看| 亚洲精品免费网站| 欧美日韩成人黄色| 欧美成人一区二区三区| 一区二区三区四区不卡视频| 国产成人精品www牛牛影视| 一区三区视频| 欧美电影在线观看免费| 日日夜夜天天综合| 爱久久·www| 99久久一区二区| 中文字幕成人动漫| 亚洲欧美日韩精品综合在线观看| 日本精品久久久| 精品日本一线二线三线不卡| 亚洲影视在线播放| 国产亚洲精品7777| 国产乱码精品1区2区3区| 99国产精品自拍| 欧美亚洲国产精品久久| 24小时成人在线视频| cao在线视频| www黄在线观看| 熟妇高潮一区二区高潮| 91亚洲精品国偷拍自产在线观看| 国产性一乱一性一伧一色| 久久精品无码一区| 熟妇人妻久久中文字幕| 亚洲色图欧美自拍| 久久精品网站视频| 国产片侵犯亲女视频播放| 午夜精品一区二区三区四区 | 欧美 日韩 国产 成人 在线观看| 国产精品扒开腿做爽爽爽a片唱戏| 热re99久久精品国99热蜜月| 国产日韩精品入口| 日本a级片电影一区二区| 久久综合亚洲社区| 中文字幕在线国产精品| 亚洲免费av网址| 欧美日韩国产免费一区二区| 天天操天天综合网| 亚洲国产中文字幕| 亚洲日本成人在线观看| 国产精品久久国产精麻豆99网站| 97国产精品videossex| 国产成人av电影在线| 麻豆91在线看| 麻豆视频一区二区| 免费在线观看日韩欧美| 久久精品国产**网站演员| 日韩国产精品久久久久久亚洲| 99精品国产在热久久婷婷| 亚洲国产精品一区制服丝袜| 激情偷拍久久| 日韩天堂av| 久久久久一区| 久久99国内精品| 国产精品中文有码| 国产成人一级电影| 久久综合久久综合九色| 国产婷婷一区二区| 亚洲情趣在线观看| 亚洲九九爱视频| 亚洲视频综合在线| 性做久久久久久免费观看欧美| 天天综合网 天天综合色| 日韩欧美a级成人黄色| 欧美日韩电影一区| 欧美成人女星排行榜| 精品亚洲aⅴ在线观看| 久久精品2019中文字幕| 欧美精品九九久久| 成人免费在线视频网站| 国产精品二区二区三区| 五月天亚洲综合| 精品久久一二三| 欧美性猛交xx| 影音先锋男人在线| 超碰超碰超碰超碰| 国产福利资源在线| 欧美激情午夜| 播放一区二区| 偷拍亚洲精品| 99在线精品视频在线观看 | 日韩电视剧免费观看网站| 久久深夜福利免费观看| 国产精品无码专区在线观看| 精品视频第一区| 国产精品视频一二三四区| 亚洲人视频在线| eeuss中文字幕| 国产精品久久久久久久久毛片| 欧美777四色影视在线| 在线免费看h| 欧洲福利电影| 久久精品国产一区二区三| 国产精品久线在线观看| 欧美绝品在线观看成人午夜影视| 在线成人中文字幕| 国产精品亚洲精品| 伊人久久青草| 丰满少妇一区二区三区专区| 国产盗摄一区二区三区在线| 国精品人妻无码一区二区三区喝尿 | 欧美激情xxxx性bbbb| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 欧美在线观看视频一区二区三区| 亚洲色图美腿丝袜| 国产精品一二三在线| 少妇高潮大叫好爽喷水| 中文字幕人妻一区二区三区| 国产精品7777777| av中文天堂在线| 久久99成人| 先锋影音久久久| 一区二区三区在线不卡| 日韩成人免费视频| 国产日韩在线精品av| 国产精品一线二线三线| 最新av电影网站| 日本v片在线免费观看| 国产亚洲欧美日韩精品一区二区三区| 欧美视频亚洲视频| 国产精品国模大尺度视频| 欧美一级片免费看| 国产精品香蕉国产| 国产原创popny丨九色| 久久国产精品国语对白| 超碰在线国产| 伊人久久大香线蕉综合网蜜芽| 国产精品羞羞答答xxdd| 欧美在线观看禁18| 国产成人高清激情视频在线观看 | 99re视频| 亚洲丝袜在线观看| 在线观看国产成人| 中文另类视频| 久久狠狠婷婷| 色94色欧美sute亚洲线路一ni| 97在线观看免费高清| av高清在线免费观看| 黄色一级片中国| 日本三级在线观看网站| 在线精品视频在线观看高清| 亚洲欧美色综合| 欧美xxxx做受欧美.88| 国产高潮呻吟久久久| 成人观看免费视频| 91福利区在线观看| 鲁大师成人一区二区三区| 欧美午夜电影在线| 国产精品久久久久免费a∨| 国产一级做a爰片久久| ,亚洲人成毛片在线播放| 99视频这里有精品| av日韩在线网站| 亚洲性xxxx| 手机看片日韩国产| 国产在线综合网| 日本美女一区| 国产麻豆精品一区二区| 精品国产乱码久久久久久牛牛| 国产一级二级三级精品| 手机毛片在线观看| 欧美aaaaaaa| 久久综合激情| 精品久久一区二区| 日本午夜精品一区二区| 欧美激情国产精品免费| 精品肉辣文txt下载| 白白色 亚洲乱淫| 久久久国产视频| 99精品免费在线观看| 国产激情视频在线播放| 精品视频亚洲| 欧美性xxxx极品hd满灌| 爱情岛论坛亚洲入口| 蜜桃av免费观看| 黑人巨大亚洲一区二区久| 福利一区二区在线| 不卡毛片在线看| 天天摸天天舔天天操| 在线免费观看黄色网址| 青青青伊人色综合久久| 国产一区二区黑人欧美xxxx| 国产精品50p| 污污的视频网站在线观看| 亚洲国产欧美国产综合一区| 555www色欧美视频| www.亚洲一区二区| 这里只有精品9| 欧美高清视频在线观看mv| 欧美日韩小视频| 在线观看欧美激情| 一级黄色a毛片| 中文字幕午夜精品一区二区三区| 欧美卡1卡2卡| 日韩精品久久一区二区| 亚州精品国产精品乱码不99按摩| 亚洲激情女人| 亚洲精品资源美女情侣酒店| 香港三级韩国三级日本三级| 青青草免费在线| 免费观看日韩av| 久青草国产97香蕉在线视频| 蜜臀aⅴ国产精品久久久国产老师 性活交片大全免费看 | 国产精品国产三级国产专业不| 亚洲天堂免费电影| 中文字幕欧美激情| 91久久精品www人人做人人爽| 激情五月色婷婷| 欧美jizz| 精品亚洲男同gayvideo网站| 五月婷婷丁香综合网| 欧美aaa免费| 国产精品污污网站在线观看| 免费av成人在线| 亚洲另类激情图| 色婷婷综合在线观看| 999av小视频在线| 国产精品色哟哟网站| 国产另类自拍| 夜夜躁很很躁日日躁麻豆| 一区二区亚洲| 久久午夜a级毛片| 熟女少妇一区二区三区| 最新国产一区二区| 欧美色精品在线视频| 黄色动漫在线免费看| 91网在线看| 亚洲婷婷国产精品电影人久久| 久久狠狠久久综合桃花| 亚洲经典一区二区三区| 久久国产精品色婷婷| 国产精品青青在线观看爽香蕉| 日本中文字幕在线免费观看| 亚洲欧美综合国产精品一区| 中日韩美女免费视频网址在线观看 | 在线观看日本www| 伊人久久一区| 8x8x8国产精品| 精品国产乱码久久久久久1区二区| 成人午夜精品| 欧美精品一卡两卡| 激情黄色小视频| 精品99re| 日韩精品一区二区三区在线观看| 亚洲va综合va国产va中文| 久久麻豆视频| 日韩女同互慰一区二区| 中文字幕99页| 中文字幕精品影院| 国产亚洲一区二区在线| 天天操天天摸天天舔| 一区二区三区四区在线观看国产日韩| 色噜噜久久综合伊人一本| 欧美日韩黄色网| 日韩亚洲国产精品| 国产精品亚洲精品| 精品国产无码AV| 久久综合久久99| 潘金莲一级淫片aaaaa免费看| 蜜桃成人365av| 色综合中文综合网| 国产九九九视频| 国产成人短视频在线观看| www.xxxx欧美| 亚洲一区欧美在线| 免费在线观看不卡| 国产欧美一区二区三区不卡高清| 国产三级视频在线播放线观看| 亚洲欧美视频在线观看视频| 国产在线青青草| 亚洲精品在线a| 国产亚洲精品久久久久久牛牛| 国产在线观看99| 国产一区二区三区视频在线播放| 国产综合av一区二区三区| 国产黄网站在线观看| 在线观看日产精品| 黄色性生活一级片| 国内综合精品午夜久久资源| 国产精品久久一区| 欧美日韩国产中文字幕在线| 一区二区三区免费| 一级 黄 色 片一| 91精品国产麻豆国产在线观看| 日韩av免费在线看| 欧美挠脚心网站| 色综合久久中文字幕综合网| 中文字幕免费在线播放|