Qt Library庫系列----Serial串口

前言

? ? ? ? 每次寫串口相關的功能時,總是需要重新寫或者復制原來寫過的文件,容易出錯不說,這也不是碼農的風格,所以還是得有一套自己得代碼庫,方便調用,又能保持神秘感。

一、開發需求

? ? ? ? 1.有個實例類;

? ? ? ? 2.設置串口參數:COM,Baudrate,databits等;

? ? ? ? 3.打開,關閉;

? ? ? ? 4.發送,接收功能,而且數據類型比較多;

? ? ? ? 5.bytearry和hex轉換;

? ? ? ? 6.定時發送(非必要);

? ? ? ? 7.獲取所有串口;

? ? ? ? 8.串口當前狀態;

二、工作流

三、實現過程

? ? ? ? 1.創建lib,名稱為?Serialportlibrary

2.pro中添加 QT += serialport? .h中添加引用

3.定義參數(.h)

    QSerialPort *m_serialPort;QTimer *m_timer;QByteArray m_timerSendData;

4.修改類(.cpp),AutoRead是手動添加的,用來區分是否自動讀取數據,還是可自定義讀取數據。

Serialportlibrary::Serialportlibrary(bool AutoRead, QObject *parent):QObject(parent)
{m_serialPort = new QSerialPort(this);//實例化串口m_timer = new QTimer(this);//實例化timerif(AutoRead) connect(m_serialPort, &QSerialPort::readyRead, this, &Serialportlibrary::handleReadyRead);connect(m_timer, &QTimer::timeout, this, &Serialportlibrary::handleTimeout);
}

5.析構,主要是關閉串口,否則連續操作會有問題。

Serialportlibrary::~Serialportlibrary()
{if (m_serialPort->isOpen()) {m_serialPort->close();}
}

6.獲取所有串口,并返回一個QString的List格式,可以直接用Combobox調用。

QList<QString> Serialportlibrary::getSerialPorts()
{QList<QString>  stringlist;QList<QSerialPortInfo> portInfoList;portInfoList = QSerialPortInfo::availablePorts();for(const QSerialPortInfo &portinfo:portInfoList){stringlist.append(portinfo.portName());}return stringlist;
}

7.設置Serial參數,只有設置,沒有打開操作,返回狀態(內部可以判斷,但是我直接判斷是否能打開串口,這里默認true)。

bool Serialportlibrary::setSerialPortParams(const QString &portName, qint32 baudRate,QSerialPort::DataBits dataBits,QSerialPort::Parity parity,QSerialPort::StopBits stopBits,QSerialPort::FlowControl flowControl)
{m_serialPort->setPortName(portName);m_serialPort->setBaudRate(baudRate);m_serialPort->setDataBits(dataBits);m_serialPort->setParity(parity);m_serialPort->setStopBits(stopBits);m_serialPort->setFlowControl(flowControl);return true;
}

8.打開串口,返回bool值

bool Serialportlibrary::openSerialPort()
{if (m_serialPort->open(QIODevice::ReadWrite)) {return true;}return false;
}

9.關閉串口,要判斷是否open,ClearBuffer在后面(可以和open放在一起,但是盡量結構簡單化,愿意的話可以自己二次封裝)。

void Serialportlibrary::closeSerialPort()
{if (m_serialPort->isOpen()) {ClearBuffer();m_serialPort->close();}
}

10.發送,共2種方式。

qint64 Serialportlibrary::sendData(const QByteArray &data)
{if (m_serialPort->isOpen()) {return m_serialPort->write(data);}return -1;
}qint8 Serialportlibrary::sendData(char data)
{if(m_serialPort->isOpen()){return m_serialPort->write(&data,1);}return -1;
}

11.轉換,注意這個轉換是自定義的,2個char中間添加空格,備用的方法,在庫里沒用到,在外面可以調用。

QByteArray Serialportlibrary::hexStringToByteArray(const QString &hexString)
{QByteArray byteArray;QString trimmedHex = hexString.trimmed();for (int i = 0; i < trimmedHex.length(); i += 2) {QString byteString = trimmedHex.mid(i, 2);bool ok;char byte = static_cast<char>(byteString.toInt(&ok, 16));if (ok) {byteArray.append(byte);}}return byteArray;
}QString Serialportlibrary::byteArrayToHexString(const QByteArray &byteArray)
{return byteArray.toHex(' ').toUpper();
}

12.接收,如果定義AutoRead,則自動發射信號,否則需要手動讀取,接收返回值

//自動讀取
void Serialportlibrary::handleReadyRead()
{QByteArray data = m_serialPort->readAll();emit dataReceived(data);
}
//手動讀取
QByteArray Serialportlibrary::ReadData(uint8_t size)
{if(size != 0)return m_serialPort->read(size);elsereturn  m_serialPort->readAll();
}

13.定時發送

//設置發送事件間隔
void Serialportlibrary::setTimerInterval(int interval)
{m_timer->setInterval(interval);
}//開始發送
void Serialportlibrary::startTimerSend(const QByteArray &data)
{m_timerSendData = data;m_timer->start();
}//停止發送
void Serialportlibrary::stopTimerSend()
{m_timer->stop();
}//觸發發送
void Serialportlibrary::handleTimeout()
{sendData(m_timerSendData);
}

14.清除buffer,在關閉Serial時調用,防止再打開后還有上次的數據。

void Serialportlibrary::ClearBuffer()
{if(m_serialPort->isOpen())m_serialPort->clear();
}

15.串口是否打開檢測

bool Serialportlibrary::ComIsOpen()
{if(m_serialPort->isOpen())return true;return false;
}

四、結尾

? ? ? ? 這就完成了串口的基本功能與需求,上層需要自己去進行二次開發,庫只保留最基本最通用的功能。

? ? ? ? 本人想創建一些基礎的開源庫使用,大家可以使用,也可以幫忙完善。

generaltoolshttps://gitee.com/klein_tools/general_tools? ? ? ??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84533.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第八節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 用戶管理(下)

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 對接后端登錄接口(上) ? 第四節:Vben Ad…

Redis 性能瓶頸時如何處理?

當 Redis 遇到性能瓶頸時&#xff0c;需要從多個維度進行排查和優化。以下是系統化的解決方案&#xff0c;涵蓋硬件、配置、數據模型、網絡等關鍵點&#xff1a; 一、硬件資源優化 內存瓶頸 現象&#xff1a;頻繁觸發 OOM 或 used_memory 接近物理內存。解決&#xff1a; 升級服…

多相機三維人臉掃描儀:超寫實數字人模型制作“加速器”

超寫實數字人&#xff0c;又稱“數字分身”&#xff0c;是以真人形象為原型構建的高仿真虛擬形象&#xff0c;按維度可分為2D數字人與3D數字人。這類數字人已廣泛應用于影視制作、游戲交互、品牌直播等場景&#xff0c;其核心價值在于通過技術手段實現真人形象的數字化復刻&…

ceph 自動調整 pg_num

要讓 Ceph 的 pool 自動調整 pg_num(PG 數量),你需要啟用 PG autoscaler。這是從 Ceph Octopus(15.x) 開始引入的功能,能根據池的容量和對象數量自動建議或調整 pg_num,以實現負載均衡。 ? 一步步開啟 Pool 的 pg_num 自動調整 1. 啟用 PG autoscaler 模塊(通常默認啟…

Python Beautiful Soup 4【HTML/XML解析庫】 簡介

全面剖析大模型 圖解大模型&#xff1a;生成式AI原理與實戰 大語言模型大模型應用開發Transformer DeepSeek模型原理開發深度學習 圖靈出品 大模型強化學習詳解 大模型算法&#xff1a;強化學習、微調與對齊&#xff08;全彩&#xff09;詳解強化學習 RLHF GRPO DPO SFT CoT D…

AI Agent開發與安全

AI Agent的核心演進 Level 1&#xff1a;LLM Agent&#xff08;聊天機器人&#xff09; 特點&#xff1a;靠提示詞工程賦予人設&#xff08;如星座占卜、角色扮演&#xff09;&#xff0c;但存在幻覺問題&#xff0c;輸出不可控。局限&#xff1a;娛樂性強&#xff0c;難勝任嚴…

NumPy玩轉數據科學

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 一、引言二、NumPy 概述2.1 NumPy 的定義與發展2.2 NumPy 的重要性 三、NumPy 的多維數組支持3.1 多維數組的概念3.2 多維數組的創建與操作3.2.1 數組的創建3.2.2 數組的索引和切片3.2.3 數組的運…

【uniapp小程序開發】圖表組件ucharts的使用(入門)

一、插件的安裝 安裝非常簡單&#xff0c;打開uniapp的插件市場&#xff0c;導入到項目中即可 下載地址&#xff1a;https://ext.dcloud.net.cn/plugin?id271 二、開始實踐 先看頁面的效果 頁面中實現了三個基本圖形的展示&#xff1a;折線圖、餅圖和柱狀圖。 上圖左一&a…

APISIX+etcd高可用集群部署方案詳解

#作者&#xff1a;任少近 文章目錄 一、背景二、部署etcd1、etcd的svc部署yaml2、Etcd 服務定義說明3、etcd的statefulset部署yaml4、Etcd 狀態集&#xff08;StatefulSet&#xff09;配置說明5、查看集群狀態 三、部署apisix的deployment部署1、apisix部署yaml文件2、APISIX …

Excel常用公式大全

資源寶整理分享&#xff1a;https://www.httple.net Excel常用公式大全可以幫助用戶提高工作效率&#xff0c;掌握常用的Excel公式&#xff0c;讓數據處理和計算工作更加便捷高效。了解公式學習方法、用途&#xff0c;不再死記硬背&#xff0c;拒絕漫無目的。 命令用途注釋說…

什么是Seata?

深入解析Seata&#xff1a;分布式事務的終極解決方案 什么是Seata&#xff1f; Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是一款開源的分布式事務解決方案&#xff0c;由阿里巴巴中間件團隊于2019年1月發起并開源&#xff08;最初…

【系統規劃與管理師第二版】1.3 新一代信息技術及發展

一、物聯網 物聯網&#xff08;IoT&#xff09;是指通過信息傳感設備&#xff0c;按約定的協議將任何物品與互聯網相連接&#xff0c;進行信息交換和通信&#xff0c;以實現智能化識別、定位、跟蹤、監控和管理的網絡。物聯網主要解決物品與物品&#xff08;T2T&#xff09;、人…

在Spring Boot中自定義JSON返回日期格式的指南

在開發Spring Boot應用時&#xff0c;很多時候需要在返回的JSON數據中以特定格式顯示日期和時間。例如&#xff0c;使用LocalDateTime、Date等類型的字段時&#xff0c;默認的序列化格式可能不是你期望的路徑。本文將介紹如何在Spring Boot中實現控制返回JSON數據的日期格式&am…

【大數據高并發核心場景實戰】 - 數據持久化之冷熱分離

大數據高并發核心場景實戰 - 數據持久化之冷熱分離 當云計算平臺的業務后臺處理工單突然接入客服系統的請求洪流&#xff0c;每日新增10萬工單&#xff0c;3000萬主表1.5億明細表的數據庫開始呻吟——是時候請出「冷熱分離」這劑退燒藥了&#xff01; 一、業務場景&#xff1a;…

【AI Study】第四天,Pandas(6)- 性能優化

文章概要 本文詳細介紹 Pandas 的性能優化技術&#xff0c;包括&#xff1a; 內存優化計算優化大數據處理實際應用示例 內存優化 數據類型優化 # 查看數據類型 df.dtypes# 查看內存使用情況 df.memory_usage(deepTrue)# 優化數值類型 # 將 float64 轉換為 float32 df[floa…

c++系列之智能指針的使用

&#x1f497; &#x1f497; 博客:小怡同學 &#x1f497; &#x1f497; 個人簡介:編程小萌新 &#x1f497; &#x1f497; 如果博客對大家有用的話&#xff0c;請點贊關注再收藏 &#x1f31e; 智能指針的使用及原理 AII&#xff08;Resource Acquisition Is Initializatio…

知識蒸餾(Knowledge Distillation, KD)

知識蒸餾&#xff08;Knowledge Distillation, KD&#xff09;是一種模型壓縮與知識遷移技術&#xff0c;通過讓小型學生模型&#xff08;Student&#xff09;模仿大型教師模型&#xff08;Teacher&#xff09;的行為&#xff08;如輸出概率分布或中間特征表示&#xff09;&…

chatGPT 會擴大失業潮嗎?

擊上方關注 “終端研發部” 設為“星標”&#xff0c;和你一起掌握更多數據庫知識 對于部分人而言&#xff0c;失業是必然趨勢。 這不&#xff0c;身后的一測試大哥&#xff0c;自從公司解散之后&#xff0c;已經在家待業半年了。。。 自打OpenAI推出了chatGPT3.0之后&#xff…

FPGA基礎 -- Verilog行為級建模之時序控制

Verilog 行為級建模&#xff08;Behavioral Modeling&#xff09;中“時序控制”機制的系統化由淺入深培訓內容&#xff0c;適用于初學者到進階 FPGA 設計工程師的學習路徑。 &#x1f3af; 一、行為級建模的定位 行為級建模&#xff08;Behavioral Modeling&#xff09;是 Ve…