Qt 官方串口库QSerialPort的 readyRead() 信号,只要有数据就抛出,这就导致一条数据分多次抛出。由于正常的数据没有固定的开头和结尾,这就导致无法获取正常的一组数据。
下面是示例代码:
1、打开串口的操作代码:
m_pSerialPort->setPortName(m_szComPort);
m_pSerialPort->setBaudRate(m_eRate);
m_pSerialPort->setDataBits(m_eDataBtis);
m_pSerialPort->setParity(m_eParity);
m_pSerialPort->setStopBits(m_eStopBits);
//设置BUFFER SIZE
m_pSerialPort->setReadBufferSize(1024);
//打开串口
if (m_pSerialPort->open(QIODevice::ReadWrite))
{
Q_APP_ADDLOG(QString("串口:%1打开成功...").arg(m_szComPort));
//设置流控制 设置为无流控制
m_pSerialPort->setFlowControl(QSerialPort::NoFlowControl);
QObject::connect(m_pSerialPort,&QSerialPort::readyRead,this,&QYTEP_CommPortItem::ReadDataSerial);
return true;
}
else
{
qDebug()<<"串口打开失败,什么也不做!";
Q_APP_ADDLOG(QString("串口:%1打开失败...").arg(m_szComPort));
return false;
}在这里插入代码片
2、串口接收过程代码:
void QYTEP_CommPortItem::ReadDataSerial()
{
bool m_bDataOK = false;
QByteArray m_temp;
int nTimes = 0;
//设置超进等待为200ms
bool m_bWaitTimeout = m_pSerialPort->waitForReadyRead(m_uWriteSerialTimeOut);
if (!m_bWaitTimeout)
{
Q_APP_ADDLOG(QString("串口等待超时..."));
return;
}
m_nReadArray.clear();
//m_nReadArray = m_pSerialPort->read(m_uNeedReadLen);
m_temp = m_pSerialPort->readAll();
m_nReadArray.append(m_temp);
while(!m_bDataOK && nTimes++<20)
{
m_pSerialPort->waitForReadyRead(m_uWriteSerialTimeOut);
int nDatas = m_pSerialPort->bytesAvailable();
if (nDatas>0)
{
m_temp.clear();
m_temp = m_pSerialPort->readAll();
m_nReadArray.append(m_temp);
}
if (m_nReadArray.size() == (int)m_uNeedReadLen)
{
m_bDataOK = true;
}
}
if (m_nReadArray.size() == (int)m_uNeedReadLen)
emit readDataOK();
else
emit readDataError();
}