[Qt]串口通信 ,不使用movetothread

—————————.pro—————————-
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 \
mainwindow.cpp

HEADERS += \
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

——————————-main.cpp—————————–
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include #include
#include

class SerialReceiver : public QObject {
Q_OBJECT

public:
SerialReceiver(QTextEdit *textEdit) : m_serialPort(new QSerialPort), m_textEdit(textEdit) {
// 设置串口设备 ttyUSB0
m_serialPort->setPortName(“/dev/ttyUSB0”);
m_serialPort->setBaudRate(QSerialPort::Baud115200);
m_serialPort->setDataBits(QSerialPort::Data8);
m_serialPort->setParity(QSerialPort::NoParity);
m_serialPort->setStopBits(QSerialPort::OneStop);
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);

connect(m_serialPort, &QSerialPort::readyRead, this, &SerialReceiver::readData);

if (m_serialPort->open(QIODevice::ReadWrite)) {
qDebug() << "Serial port opened."; } else { qDebug() << "Failed to open serial port."; } // 启动定时器,每隔 1 秒发送一次数据 m_timer = new QTimer(this); connect(m_timer, &QTimer::timeout, this, &SerialReceiver::sendData); m_timer->start(1000); // 1 秒间隔
}

public slots:
void readData() {
QByteArray data = m_serialPort->readAll();
// 将接收的数据展示到文本框中
m_textEdit->append(data);
}

void sendData() {
QByteArray dataToSend = “Hello, this is a periodic message!\n”;
qDebug() << "Sending data:" << dataToSend; m_serialPort->write(dataToSend);
}

private:
QSerialPort *m_serialPort;
QTextEdit *m_textEdit;
QTimer *m_timer; // 定时器
};

// 线程函数
void setThreadToCPU3() {
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(3, &cpuset); // 将线程绑定到CPU3
pthread_t currentThread = pthread_self();
int result = pthread_setaffinity_np(currentThread, sizeof(cpu_set_t), &cpuset);
if (result != 0) {
qDebug() << "Error setting CPU affinity for thread:" << strerror(result); } else { qDebug() << "Thread is now running on CPU3."; } } class SerialThread : public QThread { public: SerialThread(QTextEdit *textEdit) : m_textEdit(textEdit) {} protected: void run() override { setThreadToCPU3(); // 设置线程在CPU3上运行 SerialReceiver receiver(m_textEdit); // 创建串口接收器 exec(); // 开始事件循环 } private: QTextEdit *m_textEdit; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QVBoxLayout layout; QLabel label("Serial Data:"); QTextEdit textEdit; textEdit.setReadOnly(true); layout.addWidget(&label); layout.addWidget(&textEdit); window.setLayout(&layout); // 创建一个线程来接收串口数据 SerialThread serialThread(&textEdit); serialThread.start(); window.show(); // 在程序退出前确保线程安全结束 QObject::connect(&app, &QApplication::aboutToQuit, [&serialThread]() { serialThread.quit(); // 结束线程事件循环 serialThread.wait(); // 等待线程完全结束 }); return app.exec(); } #include "main.moc" ----------------------------mainwindow.cpp-------------------------- #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

————————–mainwindow.h——————————
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

发表评论

邮箱地址不会被公开。 必填项已用*标注