Qt串口通信 串口打开 数据处理

Ubuntu下Qt串口通信

Qt串口通信主要使用QSerialPort类,通信的数据类可以采用底层的unsigned char数组或者QByteArray类。下面po一段本人写的与串口相关的代码。

  • 打开串口
   	if(m_serial == NULL)
       {
           m_serial = new QSerialPort();
       }
       if(m_serial->isOpen())
       {
           disconnect(m_serial, SIGNAL(readyRead()), this, SLOT(onSerialReadData()));
           m_serial->close();
       }
       m_serial->setPortName(“SerialPortName”);
       connect(m_serial, SIGNAL(error(QSerialPort::SerialPortError)),
               this, SLOT(onSerialError(QSerialPort::SerialPortError)));
       if(m_serial->open(QIODevice::ReadWrite))
       {
           if(!m_serial->setBaudRate(QSerialPort::Baud115200) &&
              !m_serial->setParity(QSerialPort::NoParity) &&
              !m_serial->setFlowControl(QSerialPort::NoFlowControl) &&
              !m_serial->setDataBits(QSerialPort::Data8) &&
              !m_serial->setStopBits(QSerialPort::OneStop))
           {
               return false;
           }
           connect(m_serial, SIGNAL(readyRead()), this, SLOT(onSerialReadData()));
           return true;
       }
       else
       {
           return false;
       }
  • 串口组包
    有的串口通信会遇到需要组包的情况,就是串口发送的数据不一定是一整串数据,而是分段发送,比如我这边定的协议是以FFFF开头,FF结尾,有的串口数据可能是FFFF010B,下一帧才是020CFF,这其实是一条帧数据,而且这只是一种可能性。下面po一段我处理组包的代码,这里处理了一下数据堆积,我只去最后一段完整数据。
 	m_srcBuffer.append(m_serial->readAll());
    if(m_srcBuffer.indexOf(m_FFFFdata) >= 0)
    {
        int beginIndex = m_srcBuffer.lastIndexOf(m_FFFFdata);
        int endIndex = beginIndex + 2;
        if(endIndex == m_srcBuffer.length())
        {
            return;
        }
        while(endIndex < m_srcBuffer.length())
        {
            if(m_srcBuffer.at(endIndex) == char(0xff))
            {
                m_handleBuffer.append(m_srcBuffer.mid(beginIndex, endIndex - beginIndex + 1));
                onDataHandle();
                m_srcBuffer.remove(beginIndex, endIndex - beginIndex + 1);
                return;
            }
            ++endIndex;
        }
        if(m_handleBuffer.size() > 0)
        {
            m_handleBuffer.append(m_srcBuffer.mid(beginIndex, endIndex - beginIndex));
        }
    }
  • 数据转换
    数据我使用的是QByteArray类,在转换成相应的数据时提供了相应的接口。
// BCD码转换成字符串
QString SerialPort::ByteArrayToHexString(QByteArray ByteArray)
{
    QDataStream out(&ByteArray,QIODevice::ReadWrite);   //将str的数据 读到out里面去
    QString HexString;
    HexString.clear();
    while(!out.atEnd())
    {
        qint8 outChar = 0;
        out >> outChar;   //每次一个字节的填充到 outchar
        QString str =QString("%1").arg(outChar & 0xFF, 2 ,16,QLatin1Char('0')).toLower();   //2 字符宽度
        HexString += str;
    }
    return HexString.toUpper();
}
// 数据转换成中文字符串
QTextCodec gbk = QTextCodec::codecForName("gbk");
QString _strData = gbk->toUnicode(m_handleBuffer.data());

注意,QByteArray如果使用[]去取数据,取到的是是char,如果要进行int型的运算或者移位运算,按需要转换成unsigned char。

你可能感兴趣的:(Tips)