QT下的串口通訊編程

     串口通訊是最常見、最簡單的通訊方式,能夠方便的在計算機和設備之間建立連接。在QT中,提供了QSeriaPort類專門負責串口通訊的編程實現, QtSerialPort模塊是Qt5庫的附加部分,爲硬件和虛擬的串口提供了統一的接口。在使用QSeriaPort前,需要在工程文件設置中添加Serial Port支持,否則編譯會報錯。

 

一、串口初始化和參數設置

    1. 建立QT工程,工程的窗體基類選爲Wdigets,在工程中增加Serial Port支持。添加include 串口類頭文件。

     #include <QSerialPort>

     #include <QSerialPortInfo>

    定義串口對象

      QSerialPort *m_pSerialPort;

    初始化串口對象

         m_pSerialPort = new QSerialPort();

     2.  檢查計算機中存在的串口並選擇其中一個進行串口初始化

          QStringList m_PortList;

          foreach(const QSerialPortInfo &Info, QSerialPortInfo::availablePorts())

          {

                 QSerialPort availablePort;

                 availablePort.setPortName(Info.portName());

                 if (availablePort.open(QIODevice::ReadWrite))

                  {

                       m_PortList.push_back(Info.portName());

                       availablePort.close();

                   }

               }

         3. 初始化串口並設置串口參數

             m_pSerialPort->setPortName(m_PortList[(int)portNo]);

              if (m_pSerialPort->open(QIODevice::ReadWrite))

             {

                 m_pSerialPort->setBaudRate(QSerialPort::Baud9600);

                m_pSerialPort->setParity(QSerialPort::EvenParity);

                m_pSerialPort->setDataBits(QSerialPort::Data8);

                m_pSerialPort->setStopBits(QSerialPort::OneStop);

 

                 connect(m_pSerialPort, SIGNAL(readyRead()), this, SLOT(_SerialRead()));

              }

      4.   串口初始化成功後可以添加串口數據讀取函數,connect(m_pSerialPort, SIGNAL(readyRead()), this, SLOT(_SerialRead()));當串口上有數據輸入時,自動調用函數模塊_SerialRead()

二、串口發送數據

  1. 發送字符串

       void _writeChr(QString dataStr)

       {

           QByteArray sendData = dataStr.toUtf8();

          if (!sendData.isEmpty() && !sendData.isNull()) {

                   m_pSerialPort->write(sendData);

             }

       }

    2. 發送十六進制數

        char _ConvertHexChar(char ch)

          {

             if ((ch >= '0') && (ch <= '9'))

                 return ch - 0x30;

              else if ((ch >= 'A') && (ch <= 'F'))

                   return ch - 'A' + 10;

             else if ((ch >= 'a') && (ch <= 'f'))

                  return ch - 'a' + 10;

               else return ch - ch;

          }

        void _StringToHex(QString str, QByteArray &senddata) //字符串轉換爲十六進制數據0-F

        {

              int hexdata, lowhexdata;

               int hexdatalen = 0;

              int len = str.length();

             senddata.resize(len / 2);

             char lstr, hstr;

              for (int i = 0; i < len; ) {

                   hstr = str[i].toLatin1();

                   if (hstr == ' ')

                  {

                             ++i;

                           continue;

                      }

                       ++i;

                     if (i >= len) break;

                     lstr = str[i].toLatin1();

                     hexdata = _ConvertHexChar(hstr);

                    lowhexdata = _ConvertHexChar(lstr);

                    if ((hexdata == 16) || (lowhexdata == 16))

                             break;

                    else

                            hexdata = hexdata * 16 + lowhexdata;

                    ++i;

                   senddata[hexdatalen] = (char)hexdata;

                  ++hexdatalen;

               }

               senddata.resize(hexdatalen);

            }

 

              void _SerialWriteHex(QString dataStr)

               {

                     / /如果發送的數據個數爲奇數的,則在前面最後落單的字符前添加一個字符0

                    if (dataStr.length() % 2) {

                           dataStr.insert(dataStr.length() - 1, '0');

                      }

QByteArray sendData;

_StringToHex(dataStr, sendData);

m_pSerialPort->write(sendData);

}

 

三、 接收數據

void _SerialRead()

{

QByteArray temp = m_pSerialPort->readAll();

QString buf;

 

for (int i = 0; i < temp.count(); i++)

{

QString s;

s.sprintf("0x%02x, ", (unsigned char)temp.at(i));

buf += s;

}

 

QMessageBox::information(NULL, "info recieved data", buf);

}

 

四、退出程序,關閉串口

 

if (m_pSerialPort->isOpen())

{

m_pSerialPort->close();

}

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章