一次调试转台设备时,需要用到串口调试,便使用了Qt的serialport模块。这里记录下,
- pro QT += serialport
- 关键,设备的结束符,eg:本次调试的设备为:"\r\n"
- 常规初始化基本没问题
class SerPort:public QObject
{
Q_OBJECT
public:
SerPort(QString portName,QObject *parent = nullptr);
~SerPort();
signals:
void sig_messageSend(QString str);
public:
void initSerialPort();
void portClose();
public slots:
void slot_readData();
void writeData(QString data);
private:
QSerialPort *m_serialPort;
QString m_portName;
};
void SerPort::writeData(QString data)
{
qint64 writeLen = m_serialPort->write(data.toLocal8Bit());
m_serialPort->flush();
m_serialPort->waitForBytesWritten();
}
void SerPort::initSerialPort()
{
m_serialPort = new QSerialPort(this);
// 设置串口名
m_serialPort->setPortName(m_portName);
// 打开串口
m_serialPort->open(QIODevice::ReadWrite);
// 设置波特率
m_serialPort->setBaudRate(QSerialPort::Baud9600);
// 设置数据位,Data8与单字符刚好匹配,char
m_serialPort->setDataBits(QSerialPort::Data8);
// 设置校验位
m_serialPort->setParity(QSerialPort::NoParity);
// 设置停止位
m_serialPort->setStopBits(QSerialPort::OneStop);
// 设置流控制
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
QObject::connect(m_serialPort,&QSerialPort::readyRead,this,&SerPort::slot_readData);
connect(m_serialPort, &QSerialPort::errorOccurred,[this](QSerialPort::SerialPortError error){
emit sig_messageSend("error");
});
}
void SerPort::portClose()
{
m_serialPort->close();
}
void SerPort::slot_readData()
{
static QByteArray bytesAll;
QByteArray bytes = m_serialPort->readAll();
if(!bytes.isEmpty())
{
bytesAll.append(bytes);
QString itemStr(bytes);
// 接收到完整反馈
if((itemStr.contains("\r"))||(itemStr.contains("\n")))
{
QString str(bytesAll);
emit sig_messageSend(QString("%1").arg(str));
bytesAll.clear();
}
}
}
QString strCmd;
// key 结束符
m_portFirst->writeData(strCmd +"\r\n");
调试串口时,可以使用串口试助手和串口模拟工具。