一、Qt串口通信代码
Qt提供了QSerialPort类来实现串口通信。下面是实现串口的基本代码:
QSerialPort serial;
serial.setPortName("COM1");
serial.setBaudRate(QSerialPort::Baud115200);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);
serial.open(QIODevice::ReadWrite);
setPortName()设置串口名,setBaudRate()设置波特率,setDataBits()设置数据位,setParity()设置校验位,setStopBits()设置停止位,setFlowControl()设置流控制,open()打开串口。
二、Qt串口通信转换为二进制
在进行串口通信时,需要将数据转换为二进制。下面是将字符串转换为二进制的代码:
QString str = "Hello, world!"; QByteArray data = str.toLocal8Bit();
函数toLocal8Bit()将字符串转换为本地8位编码格式,然后使用QByteArray类将数据存储为二进制数据。
三、Qt串口通信多线程
串口通信过程中,需要实现多线程来避免UI界面卡顿问题。下面是多线程的示例:
class SerialThread : public QThread {
Q_OBJECT
public:
SerialThread(QSerialPort *port) : m_port(port) {}
protected:
void run() {
while(1) {
if(m_port->waitForReadyRead()) {
QByteArray data = m_port->readAll();
emit newData(data);
}
}
}
signals:
void newData(QByteArray);
private:
QSerialPort *m_port;
};
在SerialThread的run()函数中,使用waitForReadyRead()等待串口返回数据,在接收后使用emit newData()发送数据信号,UI界面可以通过连接这个信号获得串口数据。
四、Qt串口通信源代码
Qt提供了官方示例代码,可以快速入门串口通信。下面是源代码下载链接:
https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz
下载并解压后,打开Qt Serial Port Example工程即可查看源代码。
五、Qt串口通信 秒脉冲
串口通信中,需要精确控制发送数据时间。下面是实现秒脉冲的代码:
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, [&]() {
QByteArray data;
//拼接二进制数据
serial.write(data);
});
timer->start(1000); //1秒一次
使用定时器QTimer来实现1秒钟发送一次数据。
六、Qt串口通信原理
串口通信过程中,先发送数据到串口缓冲区,串口将缓冲区数据发送出去并等待接收数据。当接收到数据后,串口通过readyRead()信号通知主程序有数据返回,主程序可以读取缓冲区数据并处理。串口通信遵循RS232标准,可以实现短路保护、缓冲区、校验等功能。
七、Qt实现串口通信
Qt实现串口通信需要使用QSerialPort类,封装串口通信过程,使其可以在Qt UI界面进行调用。下面是实现串口通信的示例代码:
class SerialPort : public QObject
{
Q_OBJECT
public:
SerialPort(QObject *parent = nullptr): QObject(parent)
{
m_serialPort = new QSerialPort;
//配置串口参数
m_serialPort->setPortName("COM1");
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);
//打开串口
if(m_serialPort->open(QIODevice::ReadWrite)) {
//连接信号和槽
connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPort::readData);
} else {
qDebug() <readAll();
emit newData(data);
}
signals:
void newData(QByteArray data);
private:
QSerialPort *m_serialPort;
};
在上述代码中,使用QSerialPort类实现串口通信,readData()函数中使用readAll()读取串口缓冲区中的所有数据,然后通过newData()信号发送数据。
八、Qt串口助手
Qt提供了串口助手的例子工程,在Qt Creator中可以快速打开。串口助手提供了UI界面进行串口通信调试,包括发送和接收数据。下面是串口助手的截图:
九、Qt多线程通信
Qt提供了多线程通信的支持,可以在不同的线程中传递数据。下面是在不同线程中传递数据的示例:
class MyThread: public QThread
{
Q_OBJECT
public:
MyThread(QObject *parent = nullptr) : QThread(parent) {}
protected:
void run() {
QByteArray data;
//数据处理
emit send(data); //发送数据到主线程
}
signals:
void send(QByteArray data);
};
在MyThread中,处理数据后发送信号到主线程,主线程可以接收这个信号来获取线程中发送的数据。
原创文章,作者:CTJJ,如若转载,请注明出处:https://www.506064.com/n/134804.html
微信扫一扫
支付宝扫一扫