51單片機-實現串口模塊教程

本章概述思維導圖:

51單片機實現串口模塊教程

通信基本概念

通信,至少是需要兩個對象,一個收一個發數據。

根據數據通信的傳輸時序協調方式,可分為:同步通信和異步通信;

根據數據通信的傳輸線路可分為:串行通信和并行通信;

根據數據通信的傳輸方向性及雙向交互能力可分為:單工通信和雙工通信(半雙工通信和全雙工通信);

串行通信和并行通信定義

串行通信:數據按位順序傳輸,使用單條線路進行數據得傳輸。例如,發送字節?10110010?時,先傳?1,再傳?0,以此類推。

并行通信:數據的多個位(通常8位、16位等)同時通過多條線獨立線路并行傳輸。如傳輸字節?10110010,會使用8根數據線,每根線同時傳1位。

串行和并行的區別;

串行通信指同一時刻,只能收或發一個bit位信息,因此只用一根數據信號線即可;并行通信指同一時刻,可以收或發多個bit位信息,因此需要多根數據信號線才行;

同步通信和異步通信定義

同步通信:發送方與接收方通過共享時鐘線的時鐘信號,確保數據按固定時間間隔傳輸,接收方能準確預測數據到達時間;

異步通信:發送方與接收方無共享時鐘線,通過數據包或數據幀格式(如起始信號/停止位)協調傳輸數據;

同步和異步的區別:同步通訊需要有時鐘信號控制,通過時鐘線的高低電平控制數據的收發;異步通信沒有時鐘信號控制,通過數據幀格式控制數據的收發(大家約定好通信速度(波特率));

小心得:就是一個有時鐘線提供時鐘時序,一個沒有時鐘線;

單工和半雙工、全雙工定義

單工通信:數據僅能沿固定方向單向傳輸,發送端與接收端角色不可互換。

應用場景:廣播系統(電臺→聽眾、衛星數據下行)、傳感器網絡(如溫濕度傳感器→數據中心)等;

半雙工通信:同一信道分時復用,雙方交替發送和接收。就是指同一時刻只允許發送或者接收;

應用場景:對講機、傳統Wi-Fi;

全雙工通信:雙方可同時發送和接收數據;

應用場景:電話通話、以太網交換機等;

單工和半雙工、全雙工的區別:

單工通信:單工要么收要么發,只能做接收設備或者發送設備。接收器不能發送數據給 ?發送器。例如:收音機;?

半雙工通信:雙發都可以發送數據,雙方不能同時發送數據或接收數據;只有一根發送/接收數據信號線。(特點:可以收可以發,但是不能同時收發)例如:對講機;?

全雙工通信:雙方可以同時發送或者接收數據;有兩根發送/接收數據信號線;(特點:可以同時即發送又接收數據)例如:手機

通信速率

通信速率(比特率)是衡量數據在信道中傳輸效率的核心指標,其本質是單位時間內傳輸的信息量。每秒傳輸的二進制比特數,單位為比特/秒(bps),是衡量信息量的直接指標。;例如1000bps表示每秒傳輸1000個二進制位(0或1);

波特率是每秒傳輸的符號(碼元)數,是物理層信號變化的頻率,用于描述UART串口通信時的通信速度,其單位(bps)即每秒鐘傳送的位(bit) 的數量

在二進制調制中(如UART),1符號=1比特,此時波特率=比特率

在多進制調制中(如QPSK、16QAM),1符號可攜帶多比特,波特率!=比特率

串口通信簡介

串口(UART)通訊:異步通訊、全雙工、串行通訊、總線協議;

UART通用同步異步收發器,是一種通用的串行、異步/同步通信總線。該總線有兩條數據信號線,可以實現全雙工的發送和接收;

上位機:就是連接串口的電腦或者手機上的APP軟件;是在自動化控制系統中,用于監控 和控制下位機(如單片機、PLC等)的計算機。它可以直接發送操作指令給下位機, 并接收下位機的反饋數據,通過用戶操作交互界面向用戶展示數據。

51單片機串口相關寄存器

一、串口控制寄存器(SCON)

SCON用于控制串口工作模式,數據收發及狀態指示,其各位定義如下:?????????

? ? ????位序

名稱

功能描述

? ????????7

SM0

串口工作模式選擇位(與SM1組合)

??????????6

SM1

串口工作模式選擇位(與SM0組合)

? ? ? ? ? 5

SM2

多機通信控制位(模式2/3時啟用)

? ? ? ? ? 4

REN

接收允許位(1=允許接收,0=禁止接收)

? ? ? ? ? 3

TB8

模式2/3時發送的第9位數據

? ????????2

RB8

模式2/3時接收的第9位數據

? ? ? ? ? 1

TI

發送中斷標志(硬件置位,軟件清零)

? ? ? ? ? 0

RI

接收中斷標志(硬件置位,軟件清零)

RI位:接收中斷標志位。當數據接收完成后由硬件自動置1,響應完中斷后必須軟件復位寫0;

TI位:發送中斷標志位。當數據發送完成后由硬件自動置1,響應完中斷后必須軟件復位寫0;

RB8位:模式2/3時接收的第9位數據;模式1,若SM2=0,則為接收到的停止位;

TB8位:模式2/3時發送的第9位數據,由軟件寫0/1;可用作于數據校驗位或多機通信中表示地址幀/數據幀的標志位;

REN位:接收運行位,使用串口接收必須將改為置1(1=允許接收,0=禁止接收);

SM2位:多機通信控制位,模式2/3時,SM2位為1,REN位為1,則從機只有接收到RB8位為1(地址幀)時才會觸發RI位為1。SM2為0時,從而接收RB8位為0的數據幀;

SM1位:串口模式選擇位(與SM0組合);

SM2位:串聯模式選擇位(與SM1組合);

工作模式選擇(SM0/SM1):

????????SM0

????????SM1

模式

特點

? ? ? ? ? ?0

?????? ? ? 0

模式0

同步移位寄存器(8位數據,波特率固定)

? ? ? ? ? 0

? ? ? ? ? ?1

模式1

8位UART,波特率可變

? ? ? ? ? 1

? ? ? ? ? ?0

模式2

9位UART,波特率固定(PCON寄存器中SMOD位控制)

? ? ? ? ? 1

? ? ? ? ? ?1

模式3

9位UART,波特率可變

二、電源控制寄存器(PCON)

????????位序

名稱

功能描述

? ? ? ? ? ?7

SMOD

波特率倍增位(1=波特率加倍,僅模式1/2/3有效)

? ? ? ? ?6-0

保留

僅SMOD位有效,其他位為虛設或保留

三、串行口數據緩存寄存器SBUF

串行口數據緩存寄存器(SBUF)是串口通信中的核心寄存器,用于實現數據的發送和接收。

SBUF在物理上是一個寄存器,但在邏輯上分為發送緩沖區和接收緩沖器,兩者通過同一地址訪問,但功能獨立:

????????????????????????發送緩沖器:寫入SBUF的數據將被串口發送。

????????????????????????接收緩沖器:串口接收的數據將存入SBUF,供CPU讀取。

SBUF寄存器操作方式:

????????數據發送方式步驟:? ?

????????1、將待發送數據寫入SBUF。

????????2、硬件自動將SBUF中的數據通過TXD引腳(P3.1)發送。

????????3、發送完成后,發送中斷標志(TI)由硬件置位。

代碼示例:

SBUF = 0x41;  // 發送字符'A'(ASCII碼0x41)
while(!TI);   // 等待發送完成
TI = 0;       // 清零TI標志(必須軟件清零)

? ? ? ? 數據接收方式步驟:????????

????????1、啟用串口接收(通過SCON的REN位設置)。

????????2、當RXD引腳(P3.0)檢測到有效起始位時,硬件開始接收數據。

????????3、接收完成后,數據存入SBUF,接收中斷標志(RI)由硬件置位。

代碼示例:

if(RI) {      // 檢測接收標志char data = SBUF; // 讀取接收數據RI = 0;     // 清零RI標志(必須軟件清零)
}

串口工作模式

1、模式0

模式0:同步移位寄存器模式

????????數據格式:8位同步移位寄存器,LSB優先,無起始/停止位。

????????波特率:固定為晶振頻率(fosc)的1/12。

????????寄存器配置:

????????????????SCON寄存器:SM0=0,SM1=0。

數據通過RXD引腳(P3.0)輸入輸出,TXD引腳(P3.1)輸出(移位脈沖)同步時鐘。

如果設置中斷的情況下,發送/接收完成,對應中斷標志位TI/RI都會硬件置一,小伙伴們使用完中斷標志位要記得軟件清0呦!

2、模式1

模式1:8位UART模式(可變波特率)

????????數據格式:10位異步通信(1起始位+8數據位+1停止位)。

????????波特率:由定時器1的溢出率決定,計算公式為:

????????波特率=定時器時鐘頻率 / ?(12×(256?TH1初值))?

????????定時器時鐘頻率通常為fosc/12(12時鐘模式)或fosc/6(6時鐘模式)。

????????寄存器配置:

????????????????SCON寄存器:SM0=0,SM1=1。

????????????????TMOD寄存器:定時器1設為模式2(自動重裝載),TMOD=0x20。

? ?TH1/TL1:設置波特率初值,例如9600bps時(fosc=11.0592MHz,SMOD=0),TH1=0xFD。

3、模式2

模式2:9位UART模式(固定波特率)

????????數據格式:11位異步通信(1起始位+9數據位+1停止位)。第9位為可編程位(TB8)。

????????波特率:由PCON寄存器的SMOD位控制:

????????SMOD=0時,波特率=fosc/64;

????????SMOD=1時,波特率=fosc/32。

????????寄存器配置:

????????????????SCON寄存器:SM0=1,SM1=0。

????????????????PCON寄存器:SMOD位根據需求設置(例如,波特率倍增時SMOD=1)。

應用場景:多機通信中,第9位可用于地址識別(如TB8=1表示地址幀)。

4、模式3

模式3:9位UART模式(可變波特率)

????????數據格式:與模式2相同,但波特率生成方式不同。

????????波特率:由定時器1的溢出率決定,計算公式與模式1一致,但支持更高波特率(因 SMOD可倍增)。

????????寄存器配置:

????????SCON寄存器:SM0=1,SM1=1。

????????TMOD/TH1/TL1配置與模式1相同,但需結合PCON的SMOD位優化波特率。

應用場景:需高波特率或多機通信的復雜場景,如工業控制網絡。

串口計算波特率

計算波特率方法:

????????方式0:波特率(固定)=fosc / 12

????????方式1:波特率=(2的SMOD次方 / 32)* (T1溢出率)

????????方式2:波特率(固定)=(2的SMOD次方 / 64)* fosc

????????方式3:波特率=(2的SMOD 次方/ 32)* (T1溢出率)

????????其中T1溢出率=fosc / { 12 * [ 256 - ( TH1 )]}

在這里我使用串口波特率計算器進行計算,也會打包成文件方便大家使用喲!

51單片機串口配置步驟

配置步驟:

? ? ? ? 1、確定T1的工作方式(TMOD寄存器):選擇定時器1的方式2,波特率的產生

????????2、確定串口工作方式(SCON寄存器):一般選擇選擇串口方式1

????????3、計算T1的初值(設定波特率),賦初值裝載到TH1、TL1;

????????4、啟動T1(TCON中的TR1位);

????????5、如果使用中斷,需開啟串口中斷控制器位(IE寄存器),并開啟總中斷位EA位

代碼示例:

Void UART_Init(u8 baud)    //串口配置函數:形參為定時器計數的初值
{TMOD|=0x20;		//設置計數器工作方式2SCON=0x50;		//設置為工作方式1PCON=0x80;		//波特率加倍TH1=baud;       //賦初值TL1=baud;ES=1;			//開啟接收中斷EA=1;			//打開總中斷TR1=1;			//打開計數器
}

串口模塊硬件電路原理圖分析

小伙伴們看這個電路圖是不是非常熟悉,是我們之前學習51開發板最小系統中的下載電路,它不僅是USB轉TTF電路也是開發板與電腦上位機軟件進行串口通信的電路,因為我們下載燒錄程序的時也是用的是串口功能實現燒錄的;同時我們要使用串口與電腦上位機軟件實現通信功能需要將P5底座進行跳線帽的連接。

觀察圖中CH340G是一款USB轉串口芯片,負責將PC的USB信號轉換為TTL串口信號(RXD/TXD),從而與51單片機的串口通信模塊(如STC89C52的P3.0/P3.1)對接。

電源引腳:

? ? ? ? USB的5V(VCC)連接到CH340G的VCC引腳,為芯片供電。

? ? ? ? USB的GND與CH340G的GND引腳連接,形成公共地。

數據引腳:

? ? ? ? USB的D+和D-分別連接到CH340G的UD+和UD-引腳,實現USB通信。

串口引腳:

? ? ? ? CH340G的TXD引腳 → 單片機的RXD(如P3.0),用于向單片機發送數據。

? ? ? ? CH340G的RXD引腳 → 單片機的TXD(如P3.1),用于接收單片機發送的數據。

串口模塊軟件編程設計

實現三個主題任務:

任務一:實現串口助手(上位機)發送數據給單片機,單片機接收到后原封不動轉發給串口助手(上位機)顯示;

實現步驟:

1、我們首先要進行串口初始化函數的配置,配置內容有配置定時器1的工作模式3,這是為了生成波特率。在配置串口的工作模式,并開啟定時器和串口中斷

2、配置串口中斷服務函數

代碼示例:


#include "reg52.h"void UART_Init(u8 bps)//串口初始時化函數:形參為定時器1賦初值
{TMOD|=0x20;			//配置定時器1工作模式3,用或運算是避免影響其他定時器初始化SCON=0x50;			//配置串口工作模式1,開啟接收允許位PCON=0x80;			//波特率加倍TH1=bps;			//賦初值TL1=bps;ES=1;				//串口中斷允許位開啟EA=1;				//總中斷允許位開啟TR1=1;				//定時器1開啟
}void UART_ISR()	interrupt 4
{u8 dat=0;RI=0;				//接收中斷軟件清零dat=SBUF;			//從SBUF寄存器中取值SBUF=dat;			//將數據發送給上位機while(!TI);			//等待發送完成TI=0;				//發送中斷軟件清零
}
int main()
{UART_Init(0xFA);while(1){}
}

效果展示:

任務二:實現串口發送數據給上位機,本任務是我們主動控制MCU利用串口發送數據給上位機

實現步驟:

1、在上面的基礎上我們構建串口發送一字節數據函數

2、利用串口一字節數據發送函數實現串口數據包發生函數

代碼示例:

#include "TYPEDEF.h"
#include "reg52.h"void UART_Init(u8 bps)//串口初始時化函數:形參為定時器1賦初值
{TMOD|=0x20;			//配置定時器1工作模式3,用或運算是避免影響其他定時器初始化SCON=0x50;			//配置串口工作模式1,開啟接收允許位PCON=0x80;			//波特率加倍TH1=bps;			//賦初值TL1=bps;ES=1;				//串口中斷允許位開啟EA=1;				//總中斷允許位開啟TR1=1;				//定時器1開啟
}
void UART_TX(u8 temp)//串口發送一字節函數
{ES=0;				//在串口初始化函數中我們開啟了串口中斷,在這里我們先關閉等數據發生完成在開啟TI=0;SBUF=temp; 			//開始發送數據while(!TI);			//等待數據發送完成TI=0;				//軟件請0ES=1;				//開啟串口中斷
}
void USAR_TxPacket(u8 *temps)//串口發送數據包函數
{while(*temps){UART_TX(*temps++);Delay_10us(2);	}}
void UART_ISR()	interrupt 4
{u8 dat=0;RI=0;				//接收中斷軟件清零}
int main()
{UART_Init(0xFA);USAR_TxPacket((u8*)"今晚夜色不錯,抬頭看看月光\n");while(1){}
}

效果展示:

任務三:上位機給串口發送控制指令,串口根據控制指令完成相應的步驟(模擬物聯網控制)

實現步驟:

1、創建一個接收緩沖區數組,接收緩存區數組標志位,接收標志位。(判斷接收完成要依靠\r\n標志符)

2、在串口中斷服務函數中判斷是否接收數據,接收到數據,放入到緩沖區數組中

3、在主函數中判斷緩沖區數組的數據是否與控制指令相同,相同執行開燈,關燈指令;

代碼示例:

#include "TYPEDEF.h"
#include "reg52.h"
#include "LED.h"
void UART_Init(u8 bps)//串口初始時化函數:形參為定時器1賦初值
{TMOD|=0x20;			//配置定時器1工作模式3,用或運算是避免影響其他定時器初始化SCON=0x50;			//配置串口工作模式1,開啟接收允許位PCON=0x80;			//波特率加倍TH1=bps;			//賦初值TL1=bps;ES=1;				//串口中斷允許位開啟EA=1;				//總中斷允許位開啟TR1=1;				//定時器1開啟
}
void UART_TX(u8 temp)//串口發送一字節函數
{ES=0;				//在串口初始化函數中我們開啟了串口中斷,在這里我們先關閉等數據發生完成在開啟TI=0;SBUF=temp; 			//開始發送數據while(!TI);			//等待數據發送完成TI=0;				//軟件請0ES=1;				//開啟串口中斷
}
void USAR_TxPacket(u8 *temps)//串口發送數據包函數
{while(*temps){UART_TX(*temps++);Delay_10us(2);	}}
u8 UART_buff[10]=0;		//緩沖區接收數組
u8 UART_cnt=0;			//緩存區數組下標
u8 UART_flag=0;				//標志位
void UART_ISR()	interrupt 4
{u8 dat=0;if(RI){RI=0;				//接收dat=SBUF;if(UART_cnt>=9 || UART_buff[UART_cnt]=='\n' ){UART_buff[UART_cnt]='\0';UART_flag=1;}else{UART_buff[UART_cnt++]=dat;}}}
int main()
{UART_Init(0xFA);//USAR_TxPacket((u8*)"今晚夜色不錯,抬頭看看月光\n");while(1){if(UART_flag){if(!strcmp((char *)UART_buff,"LED_ON")){LED=0;UART_flag=0;UART_cnt=0;}if(!strcmp((char *)UART_buff,"LED_OFF")){LED=1;UART_flag=0;UART_cnt=0;}}	}
}

制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴點個關注!有不懂的地方和需要的資源隨時問我喲!

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

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

相關文章

Linux echo 命令使用說明

echo 命令使用說明(Linux) 適用環境 Bash/Zsh 等常見 Shell(echo 通常為內建命令)也可能存在外部 /bin/echo(行為與內建略有差異) 基本語法 echo [選項] [字符串...]常用選項 -n: 結尾不輸出換行-e: 解析反…

Java搭建高效后端,Vue打造友好前端,聯合構建電子采購管理系統,實現采購流程電子化、自動化,涵蓋采購全周期管理,功能完備,附詳細可運行源碼

前言:在當今數字化浪潮席卷的時代,企業的采購管理面臨著前所未有的挑戰與機遇。傳統采購模式因流程繁瑣、效率低下、信息不透明等問題,已難以滿足企業快速發展的需求。電子采購管理系統作為一種創新的采購解決方案,借助先進的信息…

應用開發使用緩存

在 Java 開發的典型架構(結合前端、后端、MyBatis、MySQL 及緩存機制)中,緩存層次可以從前端到后端再到數據庫進行劃分,通常涉及以下多層緩存:1. 前端緩存瀏覽器緩存:瀏覽器自帶的緩存機制(如 H…

leetcode算法刷題的第二十六天

今天主要是要用貪心算法來解決重置區間的問題。 1.leetcode 452.用最少數量的箭引爆氣球 題目鏈接 class Solution { public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}int findMinArrowShots(vector<vecto…

BlueZ 學習之GATT Server開發

Linux下&#xff0c;使用C語言開發一個簡單的GATT Server&#xff0c;我的Ubuntu上跑的BlueZ版本是5.79&#xff0c;使用的GLib庫版本是2.85.2&#xff0c;這里我直接使用GLib里的D?Bus來實現與BlueZ通信。BlueZ 官方推薦通過 D-Bus 進行通信和控制&#xff0c;如果是要使用原…

【Linux基礎】Linux文件系統深度解析:EXT4與XFS技術詳解與應用

目錄 引言 1 Linux文件系統概述 1.1 文件系統的基本概念 1.2 日志文件系統的概念 2 EXT4文件系統詳解 2.1 EXT4概述 2.2 EXT4的磁盤結構 2.3 EXT4的inode結構 2.4 EXT4的新特性 2.4.1 Extents 2.4.2 延遲分配 2.4.3 快速文件系統檢查 2.5 EXT4的性能特點 3 XFS文…

埃文科技榮獲2025年“數據要素×”大賽河南分賽二等獎

2025年8月19日&#xff0c;2025年“數據要素”大賽河南分賽決賽在鄭州舉行&#xff0c;本屆河南分賽聚焦數據價值賦能。鄭州埃文科技有限公司&#xff08;以下簡稱“埃文科技”&#xff09;憑借其前沿成果“IP地址高精度地理定位及應用場景劃分數據集”&#xff0c;從500多支參…

鏈上迷局:區塊鏈技術的法律暗礁與合規導航

高鵬律師首席數據官&#xff0c;數字經濟團隊創作AI輔助區塊鏈&#xff0c;這個被譽為“信任機器”的技術&#xff0c;正以顛覆性的力量重塑數字經濟的底層邏輯。從比特幣的橫空出世到NFT的全民狂歡&#xff0c;從DeFi的金融革命到DAO的組織重構&#xff0c;技術永不眠&#xf…

線性代數基礎 | 基底 / 矩陣 / 行列式 / 秩 / 線性方程組

注&#xff1a;本文為 “線性代數基礎 ” 相關合輯。 略作重排&#xff0c;未作全校。 如有內容異常&#xff0c;請看原文。 線性代數的本質&#xff08;1&#xff09;——基底、向量、線性變換、逆陣、行列式 野指針小李于 2020-08-13 16:34:45 發布 零、基底 在展開后續內…

GORM.io詳細指南

GORM.io 詳細指南 GORM&#xff08;全稱 Go ORM&#xff09;是一個功能豐富的 ORM&#xff08;Object-Relational Mapping&#xff09;庫&#xff0c;用于 Go 語言。它簡化了數據庫操作&#xff0c;將 SQL 查詢映射到 Go 結構體&#xff0c;支持多種數據庫后端。GORM 的設計理念…

【Flask】測試平臺開發,應用管理模塊實現-第十一篇

概述通過Element UI抽屜和表單校驗&增改接口合并實現應用管理Drawer 抽屜之前產品修改和添加是使用Dialog組件實現的&#xff0c;但這個組件有時候并不滿足我們的需求, 比如表單很長, 亦或是你需要臨時展示一些文檔, Drawer 是可以從側面彈出的一個層&#xff0c;可以容納更…

Elasticsearch 深分頁限制與解決方案

最近在準備面試&#xff0c;正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解&#xff0c;以及高頻業務場景的應對策略系統梳理一遍&#xff0c;既能加深記憶&#xff0c;也能讓知識體系更扎實&#xff0c;供大家參考&#xff0c;歡迎討論。在項目中遇到一個…

基于偏最小二乘法PLS多輸入單輸出的回歸預測【MATLAB】

基于偏最小二乘法&#xff08;PLS&#xff09;多輸入單輸出的回歸預測【MATLAB】 在科學研究和工程實踐中&#xff0c;我們常常需要根據多個相關變量來預測一個關鍵結果。例如&#xff0c;根據氣溫、濕度、風速等多個氣象因素預測空氣質量指數&#xff0c;或根據多種原材料成分…

SQL Server核心架構深度解析

SQL Server 的體系結構是一個復雜但設計精密的系統&#xff0c;主要可以分為四大核心組件&#xff0c;它們協同工作以管理數據庫、處理查詢、確保數據安全與一致性。以下是其體系結構的核心組成部分&#xff1a; 核心組件&#xff1a;協議層 (Protocol Layer) 作用&#xff1a;…

Django REST Framework Serializer 進階教程

1. 序列化器概述 在 Django REST Framework&#xff08;DRF&#xff09;中&#xff0c;序列化器&#xff08;Serializer&#xff09;用于將復雜的數據類型&#xff08;如模型實例&#xff09;轉換為 JSON 格式&#xff0c;以便于 API 返回給客戶端。此外&#xff0c;序列化器還…

面試問題詳解十四:Qt 多線程同步【QSemaphore】講解

在多線程開發中&#xff0c;經常需要控制多個線程對共享資源的訪問數量。例如限制同時下載文件的數量、控制數據庫連接池的連接使用等等。這時候&#xff0c;Qt 提供的 QSemaphore&#xff08;信號量&#xff09;就非常派得上用場。一、什么是 QSemaphore&#xff1f; QSemapho…

Spark mapGroups 函數詳解與多種用法示例

mapGroups 是 Spark 中一個強大的分組操作函數&#xff0c;它允許你對每個分組應用自定義邏輯并返回一個結果。以下是多個使用簡單樣例數據的具體用法示例。基礎示例數據假設我們有一個簡單的學生成績數據集&#xff1a;// 創建示例DataFrame val studentScores Seq(("Ma…

【圖論】Graphs.jl 圖數據的讀寫與生成器

文章目錄圖數據的讀寫Graphs.loadgraphGraphs.loadgraphsGraphs.savegraph保存單個圖保存圖字典Graphs.loadlg_multGraphs.savelgGraphs.savelg_mult圖的生成器1. 隨機圖模型1.1 Erd?s–Rnyi 模型1.2 巴拉巴西-阿爾伯特模型 (無標度網絡)1.3 小世界網絡模型1.4 隨機塊模型 (SB…

Go指針全解析:從基礎到實戰

基本概念與定義指針的定義指針是一種特殊的變量類型&#xff0c;它存儲的不是實際數據值&#xff0c;而是另一個變量在計算機內存中的地址。在底層實現上&#xff0c;指針本質上是保存內存位置的無符號整數&#xff0c;它直接指向內存中的特定位置&#xff0c;允許程序直接操作…

Oracle 查詢有哪些用戶 提示用戶名密碼無效

要查詢 Oracle 數據庫中的所有用戶&#xff0c;可以使用以下 SQL 查詢語句。這個查詢將返回數據庫中所有用戶的列表。 [] SELECT username FROM all_users ORDER BY username;如果你有足夠的權限&#xff08;通常是 DBA 權限&#xff09;&#xff0c;你也可以使用 dba_users 視…