1. 程式人生 > 實用技巧 >Qt 串列埠相關操作

Qt 串列埠相關操作

建立串列埠物件

QSerialPort serial;

初始化串列埠

//設定串列埠名
serial.setPortName("COM7");
//設定波特率
serial.setBaudRate(QSerialPort::Baud1152000);
//設定資料位數
serial.setDataBits(QSerialPort::Data8);
//設定奇偶校驗
serial.setParity(QSerialPort::NoParity);
//設定停止位
serial.setStopBits(QSerialPort::OneStop);
//設定流控制
serial.setFlowControl(QSerialPort::NoFlowControl);
//開啟串列埠
serial.open(QIODevice::ReadWrite);
//清空快取
serial.flush();

讀寫串列埠

//讀串列埠
QByteArray buffer;
buffer = serial.readAll();
//寫串列埠
serial.write(buffer);

關閉串列埠

serial.close();

讀取隨機資料

由串列埠裝置主動發出資料,通訊時間是不明確時,可以使用訊號槽繫結串列埠讀就緒訊號,當有資料就緒時自動呼叫槽函式讀取和處理。

  1. 建立串列埠物件後,為串列埠的讀就緒訊號新增一個槽函式。
//連線訊號和槽
QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPortReadyRead);

  1. 編寫槽函式用於讀取資料
void MainWindow::serialPortReadyRead()
{
    //讀取資料
    QByteArray buffer = serial.readAll();

    //處理資料
    //……

}

讀取響應資料

這類通訊邏輯通常是主機發送指令給裝置,裝置接收指令並完成動作後返回資料。這種情況可以通過等待超時的方式進行資料接收,等待指令回覆的時間根據具體情況設定,當第一次讀取到資料後可再等待短暫的時間來確定訊息是否被接收完畢。

QByteArray MainWindow::serialPortRead(int ms)
{
    QByteArray buffer;

    if(serial.waitForReadyRead(ms))
    {
        for (;;)
        {
            buffer += serial.readAll();
            if(!serial.waitForReadyRead(20))
            {
                return buffer;
            }
        }
    }

    return NULL;
}

獲取可用串列埠

通過嘗試以讀寫方式開啟列表中的串列埠,如果能開啟成功說明這個串列埠可用。

QStringList MainWindow::GetEnableCommPort()
{
    QStringList CommPortList;

    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if (serial.open(QIODevice::ReadWrite))
        {
            CommPortList.append(serial.portName());
            serial.close();
        }
    }

    return CommPortList;
}