一、成品圖展示
成品圖如下所示:
二、串口通訊步驟
1、在工程文件(.pro)中添加串口通信相關運行庫:QT += serialport
2、在頭文件中添加:
#include <QSerialPort>
#include <QSerialPortInfo>
3、在頭文件中定義全局的串口對象:QSerialPort *m_serialPort;
4、掃描可用串口:
// 掃描可用串口
QStringList Serial::scanSerial()
{
QStringList serialStrList;
// 讀取串口信息
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
m_serialPort->setPort(info);
// 判斷端口能否以讀寫方式打開
if(m_serialPort->open(QIODevice::ReadWrite))
{
serialStrList.append(m_serialPort->portName());
m_serialPort->close(); // 然后自動關閉等待人為開啟(通過"打開串口按鈕")
}
}
return serialStrList;
}
5、打開串口:
// 打開串口
bool Serial::open(QString serialName, int baudRate)
{
// 設置串口名
m_serialPort->setPortName(serialName);
// 打開串口(以讀寫方式)
if(m_serialPort->open(QIODevice::ReadWrite))
{
m_serialPort->setBaudRate(baudRate); // 設置波特率(默認為115200)
m_serialPort->setDataBits( QSerialPort::Data8 ); // 設置數據位(數據位為8位)
m_serialPort->setParity( QSerialPort::NoParity ); // 設置校驗位(無校驗位)
m_serialPort->setStopBits( QSerialPort::OneStop ); // 設置停止位(停止位為1)
m_serialPort->setFlowControl( QSerialPort::NoFlowControl ); // 設置流控制(無數據流控制)
// 當下位機中有數據發送過來時就會響應這個槽函數
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
// 當下位機中有數據發送過來時就會觸發這個信號,以提示其它類對象
connect(m_serialPort, SIGNAL(readyRead()), this, SIGNAL(readSignal()));
return true;
}
return false;
}
6、關閉串口:
// 關閉串口
void Serial::close()
{
m_serialPort->clear();
m_serialPort->close();
}
7、 發送數據給下位機:
// 發送數據給下位機
void Serial::sendData(QByteArray &sendData)
{
// 發送數據幀
m_serialPort->write(sendData);
}
8、讀取下位機發來數據:
// 讀取下位機發來數據
void Serial::readData()
{
// 將下位機發來數據存儲在數據緩沖區
m_readBuf = m_serialPort->readAll();
}
上述代碼都進行了封裝,單獨構建了一個 Serial 類,沒有和 Widget 類混雜在一起。
注:測試串口時,若沒有硬件條件,可以使用 VSPD 工具生成虛擬串口,具體請參考:【實用教程】VSPD虛擬串口工具——從此告別硬件串口調試。
三、UI展示
四、源碼下載:
參考: