—————————.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
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