主頁 > 後端開發 > STM32--MODBUS 通訊篇

STM32--MODBUS 通訊篇

2020-10-12 02:15:18 後端開發

STM32–MODBUS 通訊篇


文章目錄

  • STM32--MODBUS 通訊篇
  • 一、MODBUS簡介
  • 二、MODBUS功能碼詳解
    • 1. 暫存器分類
    • 2. 常用功能碼
    • 2. 常用功能碼說明
      • ①讀線圈暫存器——01H
      • ②讀離散輸入暫存器——02H
      • ③讀保持暫存器——03H
      • ④讀輸入暫存器——04H
      • ⑤寫單個線圈暫存器——05H
      • ⑥寫單個保持暫存器——06H
      • ⑦寫多個線圈暫存器——0FH
      • ⑧寫多個保持暫存器——10H
    • 3.小結
  • 三、MODBUS協議詳解
    • 1.兩種串行傳輸模式
      • ①.ASCII模式
      • ②.RTU模式
      • ③小結
    • 2. ModbusTCP
      • ①結構幀MBAP
      • ②結構幀PDU
      • ②小結
  • 四、基于STM32-MODBUS實作


一、MODBUS簡介

①Modbus協議是一種請求/應答的串行鏈路協議,是一種工業現場總線協議標準,是一項應用層報文傳輸協議,用于在通過不同型別的總線或網路連接的設備之間的客戶機/服務器通信,

②Modbus協議是一項應用層報文傳輸協議,包括ASCII、RTU、TCP三種報文型別,

③標準的Modbus協議物理層介面有RS232、RS422、RS485和以太網介面,采用master/slave方式通信,

④MODBUS 是一項應用層報文傳輸協議,用于在通過不同型別的總線或網路連接的設備之間的客戶機/服務器通信,

MODBUS 通用幀如圖:在這里插入圖片描述


二、MODBUS功能碼詳解

1. 暫存器分類

Modbus暫存器分為四種,如表

暫存器種類資料型別訪問型別功能碼PLC地址暫存器地址
線圈暫存器讀寫01H 05H 0FH00001-099990000H-FFFFH
離散輸入暫存器只寫02H10001-199990000H-FFFFH
輸入暫存器只寫04H30001-399990000H-FFFFH
保持暫存器讀寫03H 06H 10H40001-499990000H-FFFFH

2. 常用功能碼

Modbus中常用功能碼有8個,可以分為位操作和字操作兩類,如表所示:

功能碼描述PLC地址暫存器地址位/字操作運算元量
01H讀線圈暫存器00001-099990000H-FFFFH位操作單個或多個
02H讀離散輸入暫存器10001-199990000H-FFFFH位操作單個或多個
03H讀保持暫存器40001-499990000H-FFFFH字操作單個或多個
04H讀輸入暫存器30001-399990000H-FFFFH字操作單個或多個
05H寫單個線圈暫存器00001-099990000H-FFFFH位操作單個
06H寫單個保持暫存器40001-499990000H-FFFFH字操作單個
0FH寫多個線圈暫存器00001-099990000H-FFFFH位操作多個
10H寫多個保持暫存器40001-499990000H-FFFFH字操作多個

2. 常用功能碼說明

①讀線圈暫存器——01H

●功能碼01H讀取Modbus從機中線圈暫存器的狀態,可以是單個暫存器,或者多個連續的暫存器,

●假設從機地址為01H,讀取的線圈暫存器的起始地址為0017H,讀取38個暫存器,指令如表所示:
發送讀線圈暫存器指令:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
0101001700260DD4

●回應:各線圈的狀態與資料內容的每個bit對應,1代表ON,0代表OFF,如果查詢的線圈數量不是8的倍數,則在最后一個位元組的高位補0,

讀線圈暫存器狀態回應:

從機地址功能碼回傳位元組數資料1資料2資料3資料4資料5CRC高位CRC低位
010105CD6BB20E1B44EA

●其中,第一個位元組CDH對應線圈0017H到001E的狀態,轉為二進制是11001101,其中bit0對應0017H,bit7對應001E,如表所示:

線圈0017H到001EH的狀態:

001EH001DH001CH001BH001AH0019H0018H0017H
ONONOFFOFFONONOFFON

●最后一個位元組為1BH,對應線圈0037H到003CH的狀態,轉為二進制是00011011,其中bit0對應0037H,bit5對應003CH,其余兩位用0填充,如表所示:

線圈0037H到003CH的狀態:

001EH001DH001CH001BH001AH0019H0018H0017H
ONONOFFOFFONONOFFON

②讀離散輸入暫存器——02H

●功能碼02H讀取Modbus從機中離散輸入暫存器的狀態,可以是單個暫存器,或者多個連續的暫存器,

●假設從機地址為01H,讀取的離散輸入暫存器的起始地址為00C4H,讀取22個暫存器,指令如表所示:

發送讀離散輸入暫存器指令:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
010200C40016B839

●回應:各個離散輸入暫存器的狀態與資料內容的每個bit對應,1代表ON,0代表OFF,如果查詢的線圈數量不是8的倍數,則在最后一個位元組的高位補0

讀離散輸入暫存器的回傳結果:

從機地址功能碼回傳位元組數資料1資料2資料3CRC高位CRC低位
010203ACDB352288

●其中,第一個位元組ACH對應00C4H到00CBH暫存器的狀態,轉為二進制是10101100,其中bit0對應00C4H,bit7對應00CB,如表所示:

暫存器00C4H到00CBH的狀態:

00CBH00CAH00C9H00C8H00C7H00C6H00C5H00C4H
10101100
ONOFFONOFFONONOFFOFF

●最后一個位元組為35H,對應暫存器00D4H到00D9H的狀態,轉為二進制是00110101,其中bit0對應00D4H,bit5對應00D9H,其余兩位用0填充,如表所示:

暫存器00D4H到00D9H的狀態

00DBH00DAH00D9H00D8H00D7H00D6H00D5H00D4H
00110101
ONOFFONOFFONONOFFOFF

③讀保持暫存器——03H

●功能碼03H讀取Modbus從機中保持暫存器的資料,可以是單個暫存器,或者多個連續的暫存器,
●假設從機地址為01H,讀取的保持暫存器的起始地址為006BH,讀取3個暫存器,指令如表所示:

發送讀保持暫存器指令:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
0103006B00037417

●回應:每個保持暫存器的長度為2個位元組,保持暫存器之間,低地址暫存器先傳輸,高地址暫存器后傳輸,單個保持暫存器,高位元組資料先傳輸,低位元組資料后傳輸,

讀保持暫存器的回傳結果:

從機地址功能碼位元組數006BH高位位元組006BH低位位元組006CH高位位元組006CH低位位元組006BH高位位元組006BH低位位元組CRC高位CRC低位
010306006B00130000F579

④讀輸入暫存器——04H

●功能碼04H讀取Modbus從機中輸入暫存器的資料,可以是單個暫存器,或者多個連續的暫存器,
●假設從機地址為01H,讀取的保持暫存器的起始地址為0008H,讀取2個暫存器,指令如表所示:

發送讀輸入暫存器指令:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
0104006B00020017

●回應:每個輸入暫存器的長度為2個位元組,輸入暫存器之間,低地址暫存器先傳輸,高地址暫存器后傳輸,單個輸入暫存器,高位元組資料先傳輸,低位元組資料后傳輸,

讀輸入暫存器的回傳結果:

從機地址功能碼位元組數0008H高位位元組0008H低位位元組0009H高位位元組0009H低位位元組CRC高位CRC低位
010404000A000B9A41

⑤寫單個線圈暫存器——05H

●功能碼05H寫單個線圈暫存器,FF00H請求線圈處于ON狀態,0000H請求線圈處于OFF狀態,
●假設從機地址為01H,線圈暫存器的地址為00ACH,使其處于ON狀態的指令,如表所示:

發送寫單個線圈指令:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
010500ACFF004C1B

●回應:如果寫入成功,回傳發送的指令,即010500ACFF004C1B,

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
010500ACFF004C1B

⑥寫單個保持暫存器——06H

●功能碼06H寫單個保持暫存器,
●假設從機地址為01H,保持暫存器的地址為0001H,資料位0003H,指令如表所示:

發送寫單個保持暫存器指令:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
010600010003980B

●回應:如果寫入成功,回傳發送的指令,即010600010003980B,

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
010600010003980B

⑦寫多個線圈暫存器——0FH

●功能碼0FH寫多個線圈暫存器,如果對應的資料位為1,表示線圈狀態為ON;如果對應的資料位為0,表示線圈狀態為OFF,線圈暫存器之間,低地址暫存器先傳輸,高地址暫存器后傳輸,單個線圈暫存器,高位元組資料先傳輸,低位元組資料后傳輸,如果寫入的線圈暫存器的個數不是8的倍數,則在最后一個位元組的高位補0,

●假設從機地址為01H,線圈暫存器的起始地址為0013H,寫入10個暫存器,指令如表所示:

發送寫入多個線圈暫存器指令:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位位元組數資料1資料2CRC高位CRC低位
010F0013000A02CD0172CB

●其中,CDH對應線圈0013H到001AH的內容,01H對應線圈001B到001CH的內容,未使用位用0填充,

線圈暫存器0013H到001CH的內容:

001AH0019H0018H0017H0016H0015H0014H0013H
11001101
0022H0021H0020H001FH001EH001DH001CH001BH
00000001

●回應:如果寫入成功,回傳寫入的暫存器數量,如表所示

寫多個線圈暫存器的回傳結果:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
010F0013000A2409

⑧寫多個保持暫存器——10H

●功能碼10H寫多個保持暫存器,其中每個保持暫存器的長度為兩個位元組,
●假設從機地址為01H,保持暫存器的起始地址為0001H,寫入2個暫存器,指令如表所示:

發送寫入多個保持暫存器指令:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位位元組數0001H高位0001H低位0002H高位0002H低位CRC高位CRC低位
010100001000204000A01029230

●回應:如果寫入成功,回傳寫入的暫存器數量,如表所示:

從機地址功能碼起始地址高位起始地址低位暫存器數量高位暫存器數量低位CRC高位CRC低位
0110000100021008

3.小結

●功能碼詳解主要參考文獻為:
https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1


三、MODBUS協議詳解

1.兩種串行傳輸模式

①.ASCII模式

編碼系統:
十六進制,ASCII 字符 0-9, A-F,報文中每個 ASCII 字符含有 1 個十六進制字符

Bits per Byte:
1 起始位
7 資料位, 首先發送最低有效位
1 位作為奇偶校驗
1 停止位

奇偶校驗 :
●偶校驗是要求的, 其它模式 ( 奇校驗, 無校驗 ) 也可以使用, 為了保證與其它產品的最大兼容性,同時支持無校驗模式是建議的,默認校驗模式模式 必須為偶校驗,
注 : 使用無校驗要求 2 個停止位,

字串行傳送:
●每個字符或位元組均由此順序發送(從左到右):
●最低有效位 (LSB) . . . 最高有效位 (MSB),資料傳輸如圖:
●有奇偶檢驗
在這里插入圖片描述
●無奇偶檢驗:
在這里插入圖片描述

Modbus ASCII 報文幀:
在 ASCII 模式, 報文用特殊的字符區分幀起始和幀結束,一個報文必須以一個‘冒號’ ( : )(ASCII 十六進制 3A )起始,以 ‘回車-換行’ (CR LF) 對 (ASCII 十六進制 0D 和 0A) 結束,
注 : LF 字符可以通過特定的 Modbus 應用命令 (參見 Modbus 應用協議規范) 改變,

對于所有的域,允許傳送的字符為十六進制 0–9, A–F (ASCII 編碼), 設備連續的監視總線上的 ‘冒號’ 字符, 當收到這個字符后,每個設備解碼后續的字符一直到幀結束,

報文幀包括:起始、地址、功能碼、資料、LRC校驗位、結束,如圖:

在這里插入圖片描述
注:每個字符子節需要用兩個字符編碼,因此,為了確保 ASCII 模式 和 RTU 模式在 Modbus 應用級兼容,ASCII
資料域最大資料長度為 (2x252) 是 RTU 資料域 (252) 的兩倍,
必然的, Modbus ASCII 幀的最大尺寸為 513 個字符,

ASCII 傳輸模式狀態如圖:

在這里插入圖片描述
幀檢驗域:
①幀檢驗方式為::縱向冗余校驗 (LRC - Longitudinal Redundancy Checking)

②LRC 域檢驗不包括起始“冒號”和結尾 CRLF 對的整個報文的內容,不管報文有無奇偶校驗,均執行此檢驗,

③LRC 域為一個子節,包含一個 8 位二進制值,LRC 值由發送設備計算,然后將 LRC 附在報文后面,接收設備在接收報文時重新計算 LRC 的值,并將計算結果于實際接收到的 LRC 值相比較,如果兩個值不相等,則為錯誤,LRC 的計算, 對報文中的所有的連續 8 位位元組相加,忽略任何進位,然后求出其二進制補碼,執行檢驗針對不包括起始“冒號”和結尾 CRLF 對的整個 ASCII 報文域的內容,在 ASCII 模式,LRC 的結果被 ASCII 編碼為兩個位元組并放置于 ASCII 模式報文幀的結尾, CRLF 之前,


②.RTU模式

RTU模式:報文中每個 8 位位元組含有兩個 4 位十六進制字符,這種模式的主要優點是較高的資料密度,在相同的波特率下比ASCII 模式有更高的吞吐率,每個報文必須以連續的字符流傳送,

編碼系統:

8–位二進制報文中每個 8 位位元組含有兩個 4 位十六進制字符(0–9, A–F)

Bits per Byte:

1 起始位
8 資料位, 首先發送最低有效位
1 位作為奇偶校驗
1 停止位

奇偶校驗 :
●偶校驗是要求的, 其它模式 ( 奇校驗, 無校驗 ) 也可以使用, 為了保證與其它產品的最大兼容性,同時支持無校驗模式是建議的,默認校驗模式模式 必須為偶校驗,
注 : 使用無校驗要求 2 個停止位,

字串行傳送:
●每個字符或位元組均由此順序發送(從左到右):
●最低有效位 (LSB) . . . 最高有效位 (MSB),資料傳輸如圖:
●有奇偶校驗:
在這里插入圖片描述
●無奇偶校驗:
在這里插入圖片描述

Modbus RTU 報文幀:

RTU 報文幀描述如圖 :
在這里插入圖片描述
注意: Modbus RTU 幀最大為 256 位元組,

●在 RTU 模式,報文幀由時長至少為 3.5 個字符時間的空閑間隔區分,在后續的部分,這個時間區間被稱作 t3.5,如果兩個字符之間的空閑間隔大于 1.5 個字符時間,則報文幀被認為不完整應該被接收節點丟棄,傳輸格式如圖:


在這里插入圖片描述
注 :
RTU 接收驅動程式的實作,由于 t1.5 和 t3.5 的定時,隱含著大量的對中斷的管理,在高通信速率下,這導致 CPU 負擔加重,因此,在通信速率等于或低于 19200 Bps 時,這兩個定時必須嚴格遵守;對于波特率大于 19200 Bps 的情形,應該使用 2 個定時的固定值:建議的字符間超時時間(t1.5)為 750μs,幀間的超時時間 (t1.5) 為 1.750ms,

●下圖表示了對 RTU 傳輸模式狀態圖的描述, “主節點” 和 “子節點” 的不同角度均在相同的圖中表示:
在這里插入圖片描述
上面狀態圖的一些解釋:
● 從 “初始” 態到 “空閑” 態轉換需要 t3.5 定時超時: 這保證幀間延遲
● “空閑” 態是沒有發送和接收報文要處理的正常狀態,
●在 RTU 模式, 當沒有活動的傳輸的時間間隔達 3.5 個字符長時,通信鏈路被認為在 “空閑”
態,
●當鏈路空閑時, 在鏈路上檢測到的任何傳輸的字符被識別為幀起始, 鏈路變為 “活動” 狀態,
然后, 當鏈路上沒有字符傳輸的時間間個達到 t3.5 后,被識別為幀結束,
● 檢測到幀結束后,完成 CRC 計算和檢驗,然后,分析地址域以確定幀是否發往此設備,如果不是,則丟棄此幀, 為了減少接收處理時間,地址域可以在一接到就分析,而不需要等到整個幀結束,這樣,CRC 計算只需要在幀尋址到該節點 (包括廣播幀) 時進行,

幀檢驗域:
①幀檢驗方式為:回圈冗余校驗 (CRC)

②CRC 包含由兩個 8 位位元組組成的一個 16 位值,

③CRC 域作為報文的最后的域附加在報文之后,計算后,首先附加低位元組,然后是高位元組,CRC

④高位元組為報文發送的最后一個子節,附加在報文后面的 CRC 的值由發送設備計算,接收設備在接收報文時重新計算 CRC 的值,
并將計算結果于實際接收到的 CRC 值相比較,如果兩個值不相等,則為錯誤,CRC 的計算, 開始對一個 16 位暫存器預裝全 1, 然后將報文中的連續的 8 位子節對其進行后續的計算,只有字符中的 8 個資料位參與生成 CRC 的運算,起始位,停止位和校驗位不參與 CRC計算,

⑤CRC 的生成程序中, 每個 8–位字符與暫存器中的值異或,然后結果向最低有效位(LSB)方向移動(Shift) 1 位,而最高有效位(MSB)位置充零, 然后提取并檢查 LSB:如果 LSB 為 1, 則暫存器中的值與一個固定的預置值異或;如果 LSB 為 0, 則不進行異或操作,
這個程序將重復直到執行完 8 次移位,完成最后一次(第 8 次)移位及相關操作后,下一個 8位位元組與暫存器的當前值異或,然后又同上面描述過的一樣重復 8 次,當所有報文中子節都運算之后得到的暫存器忠的最終值,就是 CRC,


③小結

MODBUS分為兩種傳輸模式,ASCII方式、RTU方式,這兩種模式的區別在于: 1、起始符,與結束符不一樣;

●ASCII模式,起始符是一個冒號“:” ASCII碼為3AH H是十六進制表示結束符是“回車換行符” ASCII碼為0DH 0AH

●RTU 模式,起始符與結束符都是至少3.5倍字符傳輸時間的停頓間隔時間標定3.5倍字符的傳輸時間的計算方法,根據“通訊格式、傳輸方式及MODBUS協議簡介”視頻中介紹的一個字符的傳輸時間的計算方法,很容易計算出來,

2、校驗和計算不一樣;

●ASCII模式,是LRC校驗
●RTU 模式,是CRC校驗
3、發送格式不一樣;
●ASCII模式,在訊息中的每個位元組都作為兩個ASCII字符發送
●RTU 模式,在訊息中的每個位元組包含兩個 4Bit的十六進制字符,


2. ModbusTCP

●ModbusTCP的資料幀可分為兩部分:MBAP+PDU,

①結構幀MBAP

MBAP為報文頭,長度為7位元組,組成如下:

事務緊急處理標識協議標識長度單元識別符號
2位元組2位元組2位元組1位元組

事務處理標識 : 可以理解為報文的序列號,一般每次通信之后就要加1以區別不同的通信資料報文,
協議識別符號 : 00 00表示ModbusTCP協議,
長度 : 表示接下來的資料長度,單位為位元組,
單元識別符號 : 可以理解為設備地址,

②結構幀PDU

PDU由功能碼+資料組成,功能碼為1位元組,資料長度不定,由具體功能決定,該處使用的url網路請求的資料,

②小結

modbus設備可分為主站(poll)和從站(slave),主站只有一個,從站有多個,主站向各從站發送請求幀,從站給予回應,在使用TCP通信時,主站為client端,主動建立連接;從站為server端,等待連接,

●主站請求:功能碼+資料
●從站正常回應:請求功能碼+回應資料
●從站例外回應:例外功能碼+例外碼,其中例外功能碼即將請求功能碼的最高有效位置1,例外碼指示差錯型別
●注意:需要超時管理機制,避免無期限的等待可能不出現的應答

在linux下使用modbusTCP連接
IANA(Internet Assigned Numbers Authority,互聯網編號分配管理機構)給Modbus協議賦予TCP埠號為502,這是目前在儀表與自動化行業中唯一分配到的埠號,
通信程序
1.connect 建立TCP連接
2.準備modbus報文
3.使用send命令發送報文
4.在同一連接下等待應答
5.使用recv命令讀取報文,完成一次資料交換
6.通信任務結束時,關閉TCP連接


四、基于STM32-MODBUS實作

有點累了,改天再寫,,,

如需要技術指導,小編QQ:271841502

如需要進入QQ技術交流群,電賽資料共享群:484040216

電賽資料共享群二維碼如下:

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168356.html

標籤:python

上一篇:嵌入式C語言深入篇之 —— 變數

下一篇:樹-1-二叉樹的三種遍歷

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more