串口通訊是最常見、最簡單的通訊方式,能夠方便的在計算機和設備之間建立連接。在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()。
二、串口發送數據
- 發送字符串
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();
}