Unix時間戳BKP備份寄存器RTC實時時鐘

Unix時間戳

Unix時間戳,也稱為POSIX時間或Epoch時間,是一種在Unix和類Unix操作系統中使用的時間表示方法。它表示的是自1970年1月1日00:00:00 UTC(協調世界時)至當前時間經過的秒數,不考慮閏秒。Unix時間戳通常以秒為單位,也可以表示為毫秒、微秒等更小的時間單位。

Unix時間戳的特點:

  1. 簡單性:Unix時間戳是一個10位數的整數(在32位系統中),表示從Epoch至某一時刻經過的秒數,易于計算和處理。

  2. 通用性:Unix時間戳被廣泛用于Unix、Linux、macOS、Windows等操作系統中,以及各種編程語言和數據庫系統中。

  3. 連續性:Unix時間戳是連續的,不受時區、夏令時等因素的影響。

  4. 易轉換:Unix時間戳可以方便地轉換為各種日期時間格式,如ISO 8601、RFC 2822等。

BKP備份寄存器

BKP是“Backup Registers”的縮寫,中文意思是備份寄存器。它用于存儲用戶應用程序數據,在主電源VDD(2.0~3.6V)被切斷的情況下,這些數據仍然由備用電源VBAT(1.8~3.6V)維持供電。BKP寄存器在STM32微控制器中通常用于存儲重要的數據,如RTC(實時時鐘)的校驗值或其他關鍵信息,即使在系統斷電的情況下也能保持數據不丟失。BKP寄存器是位于備份域的,當VDD電源被切斷,它們仍然由VBAT維持供電。當系統在待機模式下被喚醒,或系統復位或電源復位時,它們也不會被復位。在STM32中,BKP寄存器的數量可能有所不同,例如STM32F103系列有10個16位寬度的BKP寄存器。

RTC實時時鐘

在秒計數器讀取時間,得到秒數,然后使用time.h里的localtime函數,就可以直到年月日時分秒的信息了,再填充struct tm結構體,用mktime函數得到秒數,寫入32位計數器即可

1. 輸入時鐘源

  • PCLK1:這是來自微控制器的時鐘信號,用于驅動RTC預分頻器和備份區域。

  • RTCCLK:這是RTC模塊的時鐘輸入,可以由外部晶振或內部RC振蕩器提供。

2. RTC預分頻器

  • RTC_PRL 和 RTC_DIV:這些寄存器用于設置RTC時鐘的預分頻值。通過調整這些值,可以控制RTC計數器的時鐘頻率。RTC_DIV來一個時鐘自減一次,計數器溢出一次,產生一個輸出脈沖,分頻后是1hz

3. RTC計數器

  • 82位可編程計數器 RTC_CNT:這是RTC的核心計數器,用于跟蹤時間。它是一個可編程的計數器,可以配置為不同的時間單位(如秒、分鐘、小時等)。

4. RTC報警

  • RTC_ALR:RTC報警寄存器,用于設置一個特定的時間點,當RTC計數器達到這個時間點時,可以觸發一個中斷或事件。

5. RTC控制寄存器(RTC_CR)

  • SECIE, ALRIE, OWIE:這些是RTC的中斷使能位,分別用于使能秒中斷、報警中斷和溢出中斷。

  • SECIF, ALRIF, OWIF:這些是RTC的中斷標志位,用于指示相應的中斷事件是否發生。

6. 中斷控制器

  • NVIC中斷控制器:RTC模塊可以通過NVIC(嵌套向量中斷控制器)向微控制器的主處理器發送中斷請求。

7. 備用區域

  • APB1總線和APB1接口:RTC模塊通過APB1總線與微控制器的其他部分通信。APB1接口用于配置RTC和訪問其寄存器。

8. 喚醒功能

  • WKUP pin:這是RTC的喚醒引腳,可以在RTC計數器達到預設值時喚醒微控制器。

首先三個時鐘煊LSE當作RTCCLK,RTCCLK通過預分頻器對時鐘進行分頻,余數寄存器是一個自減計數器,存儲當前的計數值,重裝寄存器是計數目標,決定分頻值,分頻之后,得到1hz的秒計數信號,通過CNT32位計數器,一秒自增一次

配置數據選擇器,選擇時鐘來源;配置重裝寄存器,可以選擇分頻系數;配置32位計數器,可以進行日期時間的讀寫

代碼示例

代碼1:讀寫備份寄存器

?

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"uint8_t KeyNum;					//定義用于接收按鍵鍵碼的變量uint16_t ArrayWrite[] = {0x1234, 0x5678};	//定義要寫入數據的測試數組
uint16_t ArrayRead[2];						//定義要讀取數據的測試數組int main(void)
{/*模塊初始化*/OLED_Init();				//OLED初始化Key_Init();					//按鍵初始化/*顯示靜態字符串*/OLED_ShowString(1, 1, "W:");OLED_ShowString(2, 1, "R:");/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);		//開啟PWR的時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);		//開啟BKP的時鐘/*備份寄存器訪問使能*/PWR_BackupAccessCmd(ENABLE);							//使用PWR開啟對備份寄存器的訪問while (1){KeyNum = Key_GetNum();		//獲取按鍵鍵碼if (KeyNum == 1)			//按鍵1按下{ArrayWrite[0] ++;		//測試數據自增ArrayWrite[1] ++;BKP_WriteBackupRegister(BKP_DR1, ArrayWrite[0]);	//寫入測試數據到備份寄存器BKP_WriteBackupRegister(BKP_DR2, ArrayWrite[1]);OLED_ShowHexNum(1, 3, ArrayWrite[0], 4);		//顯示寫入的測試數據OLED_ShowHexNum(1, 8, ArrayWrite[1], 4);}ArrayRead[0] = BKP_ReadBackupRegister(BKP_DR1);		//讀取備份寄存器的數據ArrayRead[1] = BKP_ReadBackupRegister(BKP_DR2);OLED_ShowHexNum(2, 3, ArrayRead[0], 4);				//顯示讀取的備份寄存器數據OLED_ShowHexNum(2, 8, ArrayRead[1], 4);}
}

沒有備用電源,主電源掉電后不會備份

代碼2:是實時時鐘

第一步:開啟PWR和BKP時鐘,使能BKP和RTC訪問

第二步:啟動RTC時鐘(手動開啟LSE,這個時鐘默認關閉)

第三步:配置RTCCLK這個數據選擇器,指定LSE為RTCCLK

第四步:調用等待同步、等待上一次操作完成的函數

第五步:配置預分頻器,給PRL重裝寄存器一個合適的分頻值,以確保輸出給計數器的頻率是1HZ

第六步:配置CNT的值,給RTC一個初始時間

#include "stm32f10x.h"                  // Device header
#include <time.h>uint16_t MyRTC_Time[] = {2023, 1, 1, 23, 59, 55};	//定義全局的時間數組,數組內容分別為年、月、日、時、分、秒void MyRTC_SetTime(void);				//函數聲明/*** 函    數:RTC初始化* 參    數:無* 返 回 值:無*/
void MyRTC_Init(void)
{/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);		//開啟PWR的時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);		//開啟BKP的時鐘/*備份寄存器訪問使能*/PWR_BackupAccessCmd(ENABLE);							//使用PWR開啟對備份寄存器的訪問if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)			//通過寫入備份寄存器的標志位,判斷RTC是否是第一次配置//if成立則執行第一次的RTC配置{RCC_LSEConfig(RCC_LSE_ON);							//開啟LSE時鐘while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);	//等待LSE準備就緒RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);				//選擇RTCCLK來源為LSERCC_RTCCLKCmd(ENABLE);								//RTCCLK使能RTC_WaitForSynchro();								//等待同步RTC_WaitForLastTask();								//等待上一次操作完成RTC_SetPrescaler(32768 - 1);						//設置RTC預分頻器,預分頻后的計數頻率為1HzRTC_WaitForLastTask();								//等待上一次操作完成MyRTC_SetTime();									//設置時間,調用此函數,全局數組里時間值刷新到RTC硬件電路BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);			//在備份寄存器寫入自己規定的標志位,用于判斷RTC是不是第一次執行配置}else													//RTC不是第一次配置{RTC_WaitForSynchro();								//等待同步RTC_WaitForLastTask();								//等待上一次操作完成}
}//如果LSE無法起振導致程序卡死在初始化函數中
//可將初始化函數替換為下述代碼,使用LSI當作RTCCLK
//LSI無法由備用電源供電,故主電源掉電時,RTC走時會暫停
/* 
void MyRTC_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5){RCC_LSICmd(ENABLE);while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_SetPrescaler(40000 - 1);RTC_WaitForLastTask();MyRTC_SetTime();BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);}else{RCC_LSICmd(ENABLE);				//即使不是第一次配置,也需要再次開啟LSI時鐘while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();}
}*//*** 函    數:RTC設置時間* 參    數:無* 返 回 值:無* 說    明:調用此函數后,全局數組里時間值將刷新到RTC硬件電路*/
void MyRTC_SetTime(void)
{time_t time_cnt;		//定義秒計數器數據類型struct tm time_date;	//定義日期時間數據類型time_date.tm_year = MyRTC_Time[0] - 1900;		//將數組的時間賦值給日期時間結構體time_date.tm_mon = MyRTC_Time[1] - 1;time_date.tm_mday = MyRTC_Time[2];time_date.tm_hour = MyRTC_Time[3];time_date.tm_min = MyRTC_Time[4];time_date.tm_sec = MyRTC_Time[5];time_cnt = mktime(&time_date) - 8 * 60 * 60;	//調用mktime函數,將日期時間轉換為秒計數器格式//- 8 * 60 * 60為東八區的時區調整RTC_SetCounter(time_cnt);						//將秒計數器寫入到RTC的CNT中RTC_WaitForLastTask();							//等待上一次操作完成
}/*** 函    數:RTC讀取時間* 參    數:無* 返 回 值:無* 說    明:調用此函數后,RTC硬件電路里時間值將刷新到全局數組*/
void MyRTC_ReadTime(void)
{time_t time_cnt;		//定義秒計數器數據類型struct tm time_date;	//定義日期時間數據類型time_cnt = RTC_GetCounter() + 8 * 60 * 60;		//讀取RTC的CNT,獲取當前的秒計數器//+ 8 * 60 * 60為東八區的時區調整time_date = *localtime(&time_cnt);				//使用localtime函數,將秒計數器轉換為日期時間格式MyRTC_Time[0] = time_date.tm_year + 1900;		//將日期時間結構體賦值給數組的時間MyRTC_Time[1] = time_date.tm_mon + 1;MyRTC_Time[2] = time_date.tm_mday;MyRTC_Time[3] = time_date.tm_hour;MyRTC_Time[4] = time_date.tm_min;MyRTC_Time[5] = time_date.tm_sec;
}
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"int main(void)
{/*模塊初始化*/OLED_Init();		//OLED初始化MyRTC_Init();		//RTC初始化/*顯示靜態字符串*/OLED_ShowString(1, 1, "Date:XXXX-XX-XX");OLED_ShowString(2, 1, "Time:XX:XX:XX");OLED_ShowString(3, 1, "CNT :");OLED_ShowString(4, 1, "DIV :");while (1){MyRTC_ReadTime();							//RTC讀取時間,最新的時間存儲到MyRTC_Time數組中OLED_ShowNum(1, 6, MyRTC_Time[0], 4);		//顯示MyRTC_Time數組中的時間值,年OLED_ShowNum(1, 11, MyRTC_Time[1], 2);		//月OLED_ShowNum(1, 14, MyRTC_Time[2], 2);		//日OLED_ShowNum(2, 6, MyRTC_Time[3], 2);		//時OLED_ShowNum(2, 9, MyRTC_Time[4], 2);		//分OLED_ShowNum(2, 12, MyRTC_Time[5], 2);		//秒OLED_ShowNum(3, 6, RTC_GetCounter(), 10);	//顯示32位的秒計數器OLED_ShowNum(4, 6, RTC_GetDivider(), 10);	//顯示余數寄存器}
}

?

?如果RTC晶振起振不了,可備選內部低數時鐘LSI

if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)			//通過寫入備份寄存器的標志位,判斷RTC是否是第一次配置//if成立則執行第一次的RTC配置{RCC_LSEConfig(RCC_LSE_ON);							//開啟LSE時鐘while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);	//等待LSE準備就緒RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);				//選擇RTCCLK來源為LSERCC_RTCCLKCmd(ENABLE);								//RTCCLK使能RTC_WaitForSynchro();								//等待同步RTC_WaitForLastTask();								//等待上一次操作完成RTC_SetPrescaler(32768 - 1);						//設置RTC預分頻器,預分頻后的計數頻率為1HzRTC_WaitForLastTask();								//等待上一次操作完成MyRTC_SetTime();									//設置時間,調用此函數,全局數組里時間值刷新到RTC硬件電路BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);			//在備份寄存器寫入自己規定的標志位,用于判斷RTC是不是第一次執行配置}else													//RTC不是第一次配置{RTC_WaitForSynchro();								//等待同步RTC_WaitForLastTask();								//等待上一次操作完成}
}

?

這段代碼是用于配置和管理STM32微控制器中的實時時鐘(RTC)模塊的。代碼的目的是確保RTC只被配置一次,通過檢查備份寄存器(BKP)中的一個特定值來實現。以下是代碼的詳細解釋:

  1. 檢查備份寄存器

    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)

    這行代碼讀取備份寄存器BKP_DR1的值,并檢查它是否不等于0xA5A5。如果不等于,說明RTC是第一次配置。

  2. 開啟LSE時鐘

    RCC_LSEConfig(RCC_LSE_ON);

    開啟低速外部(LSE)時鐘,LSE通常用于為RTC提供精確的時鐘源。

  3. 等待LSE準備就緒

    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);

    等待LSE時鐘準備就緒,確保時鐘穩定。

  4. 配置RTC時鐘源

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    將RTC的時鐘源配置為LSE。

  5. 使能RTC時鐘

    RCC_RTCCLKCmd(ENABLE);

    使能RTC時鐘。

  6. 等待同步和上一次操作完成

    RTC_WaitForSynchro();
    RTC_WaitForLastTask();

    等待RTC同步和上一次操作完成,確保時鐘設置正確應用。

  7. 設置RTC預分頻器

    RTC_SetPrescaler(32768 - 1);

    設置RTC預分頻器,使預分頻后的計數頻率為1Hz(每秒一個脈沖)。

  8. 再次等待上一次操作完成

    RTC_WaitForLastTask();

    再次等待上一次操作完成。

  9. 設置時間

    MyRTC_SetTime();

    調用自定義函數設置RTC的時間。

  10. 寫入備份寄存器

    BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);

    在備份寄存器寫入標志位0xA5A5,用于判斷RTC是否已經配置過。

  11. 非首次配置

    else
    {RTC_WaitForSynchro();RTC_WaitForLastTask();
    }

    如果RTC不是第一次配置,只需等待同步和上一次操作完成。

這段代碼確保RTC模塊只被配置一次,通過在備份寄存器中寫入一個特定的標志位來實現。它首先檢查備份寄存器的值,如果未配置過,則進行一系列配置操作,包括開啟LSE時鐘、設置RTC時鐘源、設置預分頻器、設置時間,并在備份寄存器中寫入標志位。如果已經配置過,則只需等待同步和上一次操作完成。這種設計可以避免重復配置RTC,確保系統的穩定性和可靠性。

?

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

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

相關文章

【Linux內核系列】:進程板塊與文件板塊的綜合

&#x1f525; 本文專欄&#xff1a;Linux &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 人生中成功只是一時的&#xff0c;失敗卻是人生的主旋律&#xff0c;但是如何面對失敗卻把人分成了不同的樣子&#xff0c;有的人會被…

CellOracle|基因擾動研究基因功能|基因調控網絡+虛擬干預

在gzh“生信小鵬”同步文章 論文來源: 發表期刊:Nature發表時間:2023年2月23日論文題目:Dissecting cell identity via network inference and in silico gene perturbation研究團隊:Kenji Kamimoto 等,華盛頓大學醫學院1. 研究背景與問題提出 細胞身份(Cell Identit…

專線、云 和 物聯網(IoT)

專線、云 和 物聯網&#xff08;IoT&#xff09; 是現代信息與通信技術&#xff08;ICT&#xff09;領域的三大重要組成部分&#xff0c;它們在企業和個人的數字化轉型中扮演著關鍵角色。以下是對這三者的詳細介紹及其相互關系&#xff1a; 1. 專線&#xff08;Leased Line&…

[Lc14_priority_queue] 最后一塊石頭重量 | 數據流中的第 K 大元素 | 前K個高頻單詞 | 數據流的中位數

目錄 1.最后一塊石頭的重量 題解 2.數據流中的第 K 大元素 題解 3.前K個高頻單詞 題解 代碼 ?4.數據流的中位數 題解 在C中&#xff0c;使用標準庫中的priority_queue&#xff0c;默認情況下它是一個最大堆&#xff08;即大堆排序&#xff09;&#xff0c;這意味著最…

XSS漏洞靶場---(復現)

XSS漏洞靶場—&#xff08;復現&#xff09; 反射型 XSS 的特點是攻擊者誘導用戶點擊包含惡意腳本的 URL&#xff0c;服務器接收到請求后將惡意腳本反射回響應頁面&#xff0c;瀏覽器執行該腳本從而造成攻擊&#xff0c;惡意腳本不會在服務器端存儲。 Level 1(反射型XSS) 此漏…

2025/3.17 郭院安排會議與南京銀行參訪

目錄 *郭院會議&#xff1a;服務外包*1.會遇到的問題以及解決方案2.考慮行業目前會碰到的瓶頸3.后端應該呈現處理圖像的過程4.記得做報告、文檔說明和視頻等工作 *南京銀行&#xff08;鑫合易家&#xff09;參訪記錄*1. 風險評分業務流程筆記![在這里插入圖片描述](https://i-b…

Cloud Ace 宣布成為 Langfuse 亞太地區首個代理商,提供 LLM 全鏈路解決方案

Cloud Ace 宣布正式代理 Langfuse 產品&#xff0c;是 Langfuse 在亞太地區唯一的官方授權經銷商&#xff0c;全面負責其商用許可證的銷售、部署與技術支持服務。通過此次合作&#xff0c;Cloud Ace 將充分發揮 Langfuse 的先進技術能力與行業專業知識&#xff0c;為企業級客戶…

Helm 的倉庫管理與 Chart 搜索

在使用 Helm 管理 Kubernetes 應用的過程中&#xff0c;倉庫管理與 Chart 搜索是兩個核心功能。通過 Helm 倉庫&#xff0c;用戶可以方便地存儲、分享和獲取 Helm Chart&#xff0c;而搜索功能則幫助用戶快速找到所需的 Chart。本文將詳細介紹 Helm 倉庫的概念、管理方法以及如…

Matlab 汽車振動多自由度非線性懸掛系統和參數研究

1、內容簡介 略 Matlab 169-汽車振動多自由度非線性懸掛系統和參數研究 可以交流、咨詢、答疑 2、內容說明 略 第二章 汽車模型建立 2.1 汽車懸架系統概述 2.1.1 懸架系統的結構和功能 2.1.2 懸架分類 2.2 四分之一車輛模型 對于車輛動力學&#xff0c;一般都是研究其懸…

免訓練指標(Zero-Cost Proxies)

1. 什么是免訓練指標&#xff08;Zero-Cost Proxies&#xff0c;ZC proxies&#xff09;&#xff1f; 免訓練指標是一類 無需完整訓練模型即可評估其性能的度量方法&#xff0c;主要用于提高 神經架構搜索&#xff08;NAS&#xff09; 的效率。 傳統 NAS 需要訓練候選架構來評…

C語言 —— 此去經年夢浪蕩魂音 - 深入理解指針(卷二)

目錄 1. 數組名與地址 2. 指針訪問數組 3.一維數組傳參本質 4.二級指針 5. 指針數組 6. 指針數組模擬二維數組 1. 數組名與地址 我們先看下面這個代碼&#xff1a; int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p &arr[0]; 這里我們使用 &arr[0] 的方式拿到了數…

基于Python pyscard庫采集ACS ACR122U NFC讀卡器數據的詳細操作步驟

步驟1&#xff1a;安裝驅動 1. 下載驅動&#xff1a; - 訪問ACS官網的驅動下載頁面&#xff1a;[ACR122U驅動下載](https://www.acs.com.hk/en/drivers/6/acr122u-nfc-reader/)。 - 選擇適用于Windows的驅動&#xff08;如 ACR122U Driver (Windows) V3.05.02.zip&#xff09;…

深度學習 Deep Learning 第1章 深度學習簡介

第1章 深度學習簡介 概述 本章介紹人工智能&#xff08;AI&#xff09;和深度學習領域&#xff0c;討論其歷史發展、關鍵概念和應用。解釋深度學習如何從早期的AI和機器學習方法演變而來&#xff0c;以及如何有效解決之前方法無法應對的挑戰。 關鍵概念 1. 人工智能的演變 …

python實現簡單的圖片去水印工具

python實現簡單的圖片去水印工具 使用說明&#xff1a; 點擊"打開圖片"選擇需要處理的圖片 在圖片上拖拽鼠標選擇水印區域&#xff08;紅色矩形框&#xff09; 點擊"去除水印"執行處理 點擊"保存結果"保存處理后的圖片 運行效果 先簡要說明…

軟件功能性測試有哪些步驟和挑戰?軟件測評服務機構分享

軟件功能性測試是對軟件系統進行驗證的一種基本方法。其主要目標是確保軟件系統能夠按照預期的要求和功能進行操作。從用戶的角度看&#xff0c;功能性測試旨在檢查軟件是否實現了所有要求的功能&#xff0c;保證用戶體驗的順暢與滿意。 一、軟件功能性測試的測試步驟   1、…

《C#上位機開發從門外到門內》3-4:基于TCP/IP的遠程監控系統設計與實現

文章目錄 一、項目概述二、系統架構設計三、通信協議設計四、功能模塊實現五、系統安全性與穩定性六、性能優化與測試七、實際應用案例八、結論 隨著信息技術的飛速發展&#xff0c;遠程監控系統在工業自動化、智能家居、環境監測等領域的應用日益廣泛。基于TCP/IP協議的遠程監…

在react當中利用IntersectionObserve實現下拉加載數據

目錄 一、傳統的下拉加載方案 二、存在問題 1.性能較差 2.不夠精確 三、IntersectionObserve版本下拉加載 1、callback 2、options 四、IntersectionObserver實例 1、Intersection的優勢 2、實現思路 3、代碼實現 在進行前端開發的過程中&#xff0c;常常會碰到下拉…

深入理解C++編程:從內存管理到多態與算法實現

C 是一門功能強大的編程語言&#xff0c;廣泛應用于系統編程、游戲開發和高性能計算等領域。本文將通過一系列經典問題&#xff0c;深入探討 C 的核心知識點&#xff0c;包括內存管理、多態&#xff08;結合函數重載與覆蓋&#xff09;、多線程、TCP/IP 模型、軟鏈接與硬鏈接的…

相對論之光速

然而&#xff0c;基礎物理學的進步很少全部由實驗取得。為了解實驗結果背后的機制&#xff0c;法拉第問道&#xff0c;既然磁鐵沒有接觸導線&#xff0c;導線中怎么會產生電流?一股電流又怎么能使指南針指針發生偏轉?有某種作用因素必然在磁鐵、導線和指南針之間的空隙中傳遞…

文本檢測-文本內容審核-文本過濾接口如何用PHP調用?

一、什么是文本檢測接口呢&#xff1f; 文本內容審核過濾&#xff0c;提供對敏感事件、違規詞語及監管要求封禁詞語的識別審核能力&#xff0c;包含海量歷史數據&#xff0c;有效過濾違禁違規、惡意推廣、低俗辱罵、低質灌水、廣告法審核&#xff0c;該接口應用場景廣泛&#…