这两天在帮小伙伴做项目,给我提了一个任务,就是用Qt做一个串口通信的上位机。研究了两天后,直接利用Qt封装了一个类。
关于串口通信协议,我就不多扯了,别人说的比我专业,我这里直接把我参考的作者的连结放在这里,感兴趣的直接跳转过去就好了。
《Qt实现串口通信(C++实现串口通信小助手)—串口收发及串口数据解码、串口通信模拟器。》
如果你需要代码的话,直接拷贝复制到你的项目就可以用了,除了Qt的库以外没有用任何第三方库,所以应该很容易移植的。
H文件部分
#ifndef SERIALHELPER_H
#define SERIALHELPER_H
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
class SerialHelper
{
private:
QSerialPort serial;
public:
SerialHelper();
public:
void connect(QString portName, qint32 baudRate, QSerialPort::DataBits dataBits,
QSerialPort::StopBits stopBits, QSerialPort::Parity parity);
void disconnect();
bool connected();
bool available();
QSerialPort* getInstance();
void send(QString msg);
QString recv();
QString errormsg();
};
#endif // SERIALHELPER_H
C++ 文件部分
#include "serialhelper.h"
SerialHelper::SerialHelper() : serial()
{
}
void SerialHelper::connect(QString portName, qint32 baudRate, QSerialPort::DataBits dataBits,
QSerialPort::StopBits stopBits, QSerialPort::Parity parity)
{
serial.setPortName(portName);
serial.setBaudRate(baudRate);
serial.setStopBits(stopBits);
serial.setDataBits(dataBits);
serial.setParity(parity);
// connect to remote device via serial port
serial.open(QIODevice::ReadWrite);
};
void SerialHelper::disconnect()
{
serial.clear();
serial.close();
};
bool SerialHelper::connected()
{
return serial.isOpen();
};
bool SerialHelper::available()
{
return serial.isOpen() & serial.isWritable() & serial.isReadable();
};
QSerialPort* SerialHelper::getInstance()
{
return &serial;
};
void SerialHelper::send(QString msg)
{
serial.write(msg.toLocal8Bit());
};
QString SerialHelper::recv()
{
auto buf = serial.readAll();
if (!buf.isEmpty())
{
QString msg = QString::fromLocal8Bit(buf); //支持中文显示
buf.clear();
return msg;
} else {
return "read data failed";
buf.clear();
}
};
QString SerialHelper::errormsg()
{
return serial.errorString();
}
你要做的就是拷贝以上两段代码,然后在下面做如下操作:
// 创建对象
SerialHelper helper;
// 创建Serial的连结
helper.connect("COM", QSerialPort::Baud1200,
QSerialPort::Data8,
QSerialPort::OneStop,
QSerialPort::NoParity);
// 断开连结
helper.disconnect();
// 收发数据
if (helper.available()) {
// 发送数据
helper.send("Hello world!");
...
// 接收数据
auto msg = helper.recv();
...
}
大概就这么简单,好了,祝你顺利!