C# SerialPort 使用詳解

總目錄


前言

在工業控制、物聯網、嵌入式開發等領域,串口通信(Serial Port Communication)是連接串行設備(如條碼掃描器、GPS接收器等)與計算機的重要手段。C# 提供了內置的 SerialPort 類,簡化了串口開發的流程。本文將詳細介紹如何在C#中使用SerialPort類進行串口通信。


一、什么是 SerialPort?

1. 定義

System.IO.Ports.SerialPort 類(簡稱 SerialPort)是 .NET 框架中用于串口通信的核心類,它提供了對串行端口的訪問,允許我們進行數據的讀寫、配置串口參數以及處理事件等操作。

2. 串行通信簡介

串口通信(Serial Communication)是通過單條數據線按順序傳輸數據的通信方式,具有接線簡單、成本低廉的特點。在工業控制、物聯網設備、傳感器等領域廣泛應用,波特率范圍常見為 9600 9600 9600 115200 115200 115200

  • 在工業自動化、嵌入式系統開發等場景中,串口通信(Serial Communication)仍是硬件交互的核心技術之一。
  • 串行通信是一種數據按位順序傳輸的通信方式,常用于連接各種串行設備。
  • C# 通過 System.IO.Ports.SerialPort 類為開發者提供了簡潔高效的串口操作接口,支持參數配置、數據讀寫及事件處理等功能。

3. SerialPort核心功能

  • 端口配置參數:波特率、數據位、校驗位、停止位等。
  • 數據讀寫操作:同步或異步發送/接收數據。
  • 事件驅動通信:通過 DataReceived 事件實時響應數據到達。

4. 典型應用場景

  • 工業設備通信
  • 傳感器數據采集
  • 嵌入式系統交互

二、常用的屬性和方法

1. 常用屬性

屬性名類型/說明
PortNamestring 串口名稱(如 COM1COM3)。
BaudRateint 波特率,表示數據傳輸速率。
常用的有9600192003840057600以及115200
ParityParity 奇偶校驗類型
None無奇偶校驗、Even偶檢驗、Odd奇檢驗。
DataBitsint 數據位數。
常見數據位為8位,如需要特別設置,還可設置位5位,6位,7位
StopBitsStopBits 停止位數
None 不使用停止位One 1個停止位、Two2個停止位、OnePointFive1.5個停止位)。
HandshakeHandshake 握手協議(如 NoneRequestToSendXOnXOff)。
EncodingEncoding 數據編碼方式(如 Encoding.UTF8)。
ReadTimeoutint 讀取操作超時時間(毫秒),默認為 InfiniteTimeout
WriteTimeoutint 寫入操作超時時間(毫秒),默認為 InfiniteTimeout
IsOpenbool 表示串口是否已打開。
NewLinestring 定義行結束符(如 "\r\n"),用于 ReadLine()WriteLine()
DtrEnablebool 控制數據終端就緒(DTR)信號狀態。
RtsEnablebool 控制請求發送(RTS)信號狀態。
ReceivedBytesThresholdint 觸發 DataReceived 事件的最小字節數。

2. 常用方法

方法名說明
Open()打開串口。
Close()關閉已打開的串口。
Read(byte[] buffer, int offset, int count)從串口讀取指定字節數到緩沖區。
ReadByte()讀取單個字節(返回 int,范圍 0-255,失敗返回 -1)。
ReadLine()讀取一行數據,直到遇到 NewLine 定義的結束符。
ReadExisting()讀取接收緩沖區中所有可用數據(不阻塞)。
Write(string text)寫入字符串到串口(自動按 Encoding 編碼)。
Write(byte[] buffer, int offset, int count)寫入字節數組到串口。
DiscardInBuffer()清空輸入緩沖區中的數據。
DiscardOutBuffer()清空輸出緩沖區中的數據。

3. 常用事件

事件名說明
DataReceived當接收到數據且字節數達到 ReceivedBytesThreshold 時觸發。
ErrorReceived當串口發生錯誤(如奇偶校驗錯誤)時觸發。

4. 其他重要屬性(擴展)

屬性名類型/說明
BytesToReadint 接收緩沖區中已接收的字節數。
BytesToWriteint 輸出緩沖區中待發送的字節數。
ReadBufferSizeint 設置輸入緩沖區大小(默認 4096)。
WriteBufferSizeint 設置輸出緩沖區大小(默認 2048)。

三、SerialPort 基礎

1. 添加命名空間引用

在使用SerialPort類之前,需要先添加對System.IO.Ports命名空間的引用:

using System.IO.Ports;

2. 初始化與參數配置

串口通信的核心是正確配置參數,確保與硬件設備匹配,否則通信失敗。

1)方式1:構造函數

using System.IO.Ports;// 創建對象并指定端口名稱(如COM3)
SerialPort serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);

2)方式2:屬性配置

// 可選:手動設置參數(適用于動態配置)
SerialPort serialPort = new SerialPort();
serialPort.PortName = "COM3";       // 端口號
serialPort.BaudRate = 9600;         // 波特率
serialPort.Parity = Parity.None;    // 校驗位
serialPort.DataBits = 8;            // 數據位
serialPort.StopBits = StopBits.One; // 停止位

3. 打開與關閉串口

1)打開串口

在進行數據傳輸之前,需要打開串行端口:

serialPort.Open(); // 打開串口

優化一下:加上try catch 做異常處理

try 
{if (!serialPort.IsOpen){serialPort.Open();Console.WriteLine("端口已打開");}
}
catch (Exception ex)
{Console.WriteLine($"打開失敗:{ex.Message}");
}

2)關閉串口

數據傳輸完成后,應及時關閉串行端口。務必在程序退出前調用Close

serialPort.Close(); // 關閉端口

優化一下:加上try catch 做異常處理

try 
{if (serialPort.IsOpen){// 關閉端口serialPort.Close();Console.WriteLine("端口已關閉");// 銷毀serialPort對象serialPort.Dispose();}
}
catch (Exception ex)
{Console.WriteLine($"關閉失敗:{ex.Message}");
}

4. 讀取和寫入數據

1)寫入數據

? 寫入字符串數據
  • 使用Write()方法:將指定的字符串寫入串行端口。
  • 使用WriteLine方法:將指定的字符串和 SerialPort.NewLine 值寫入串行端口。
serialPort.Write("Hello, Serial!");// 自動添加換行符:發送字符串并添加換行符(WriteLine)
serialPort.WriteLine("Hello, Serial Port!");
? 寫入字節流(字節數組)數據
// 發送字節數組
byte[] data = Encoding.UTF8.GetBytes("Test Data");
serialPort.Write(data, 0, data.Length);byte[] data = { 0x01, 0xFF, 0xAB }; // 十六進制數據
serialPort.Write(data, 0, data.Length); // 發送字節

2)讀取數據

可以通過Read()ReadLine()等方法從串口讀取數據。

// 讀取指定字節數
byte[] buffer = new byte[1024];
int bytesRead = serialPort.Read(buffer, 0, buffer.Length);
string received = Encoding.UTF8.GetString(buffer, 0, bytesRead);// 讀取一行數據(依賴 NewLine 配置)
string line = serialPort.ReadLine();

5. 處理數據接收事件

通過 DataReceived 事件實時接收串口數據。當有數據到達時,DataReceived事件會被觸發。可以通過注冊該事件來實時處理接收到的數據:

1)使用方式1

// 注冊 DataReceived 事件
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{SerialPort sp = (SerialPort)sender;string received = sp.ReadExisting(); // 讀取所有可用數據Console.WriteLine($"Received: {received}");
}

2)使用方式2

serialPort.DataReceived += SerialPort_DataReceived;
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{//首先實例化一個字節數組// 字節數組的大小:通過BytesToRead 屬性,獲取得到緩沖區中數據的字節數byte[] buffer = new byte[serialPort.BytesToRead];//再通過 Read() 方法 讀取緩存區內全部數據,并將數據寫入字節數組中serialPort.Read(buffer, 0, buffer.Length);// 解碼string received = Encoding.ASCII.GetString(buffer); Console.WriteLine(received);
}

3)使用方式3

serialPort.DataReceived += (sender, e) => 
{if (e.EventType == SerialData.Chars){byte[] buffer = new byte[serialPort.BytesToRead];serialPort.Read(buffer, 0, buffer.Length);string data = Encoding.ASCII.GetString(buffer);Console.WriteLine($"收到數據:{data}");}
};

以上三種方式,基本原理一致,只是部分的讀取數據方式和事件定義的方式稍有不同而已。

6. 完整示例

示例1:簡單示例

using System;
using System.IO.Ports;
using System.Windows.Forms;public class SerialPortDemo
{//配置并創建SerialPort實例private SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);public void Start(){try{// 注冊數據接收事件sp.DataReceived += DataReceivedHandler;// 打開串口sp.Open();//寫入數據sp.WriteLine("Start Communication");}catch (Exception ex){MessageBox.Show($"初始化失敗:{ex.Message}");}}// 接收數據private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e){// 讀取數據string data = sp.ReadExisting();Console.WriteLine($"實時數據:{data}");}// 關閉端口public void Stop() => sp.Close();
}

示例2:WinForm 示例

以下是一個完整的示例,展示如何在C#中使用SerialPort類進行串口通信。

using System;
using System.IO.Ports;
using System.Windows.Forms;namespace SerialPortExample
{public partial class MainForm : Form{private SerialPort serialPort;public MainForm(){InitializeComponent();InitializeSerialPort();}private void InitializeSerialPort(){serialPort = new SerialPort();serialPort.PortName = "COM1";serialPort.BaudRate = 9600;serialPort.Parity = Parity.None;serialPort.DataBits = 8;serialPort.StopBits = StopBits.One;serialPort.Handshake = Handshake.None;serialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);}private void btnOpen_Click(object sender, EventArgs e){try{if (!serialPort.IsOpen){serialPort.Open();MessageBox.Show("串口已打開");}}catch (Exception ex){MessageBox.Show("打開串口時出錯: " + ex.Message);}}private void btnSend_Click(object sender, EventArgs e){if (serialPort.IsOpen){string message = txtSend.Text;serialPort.WriteLine(message);txtReceive.AppendText("發送: " + message + Environment.NewLine);}else{MessageBox.Show("請先打開串口");}}private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){SerialPort sp = (SerialPort)sender;string indata = sp.ReadExisting();this.Invoke(new Action(() =>{txtReceive.AppendText("接收: " + indata);}));}private void btnClose_Click(object sender, EventArgs e){if (serialPort.IsOpen){serialPort.Close();MessageBox.Show("串口已關閉");}}}
}

示例3:掃碼槍數據接收

SerialPort port = new("COM3", 115200, Parity.None, 8, StopBits.One);
port.DataReceived += (s, e) => 
{byte[] barcode = new byte[port.BytesToRead];port.Read(barcode, 0, barcode.Length);// 解析掃碼槍數據(通常以回車結尾)if (barcode.Last() == 0x0D) {string code = Encoding.ASCII.GetString(barcode);ProcessBarcode(code);}
};

四、SerialPort 進階

1. 高級參數配置

1)配置超時時間

防止長時間阻塞(單位:毫秒)。

// 設置讀取超時為 1000ms
serialPort.ReadTimeout = 1000;
// 設置寫入超時
serialPort.WriteTimeout = 500;

2)緩沖區設置

ReceivedBytesThreshold:指定觸發 DataReceived 事件的字節閾值,即觸發 DataReceived 事件的最小字節數。

serialPort.ReceivedBytesThreshold = 2;	//默認值 為 1

3)其余參數配置

sp.Encoding = Encoding.ASCII; 	// 編碼格式
sp.NewLine = "\r\n";       		// 換行符定義

2. 獲取所有可用 COM 端口

可以通過SerialPort.GetPortNames()方法獲取系統中所有可用的串行端口名稱:

// 獲取所有可用 COM 端口
string[] ports = SerialPort.GetPortNames();
foreach (var port in ports)
{Console.WriteLine(port);
}

3. ErrorReceived事件

當串行通信中發生錯誤(如幀錯誤/緩沖區溢出)時,ErrorReceived事件會被觸發:

serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(serialPort_ErrorReceived);
private static void serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{if ((e.EventType & SerialError.Frame) == SerialError.Frame){Console.WriteLine("Frame error detected.");}if ((e.EventType & SerialError.Overrun) == SerialError.Overrun){Console.WriteLine("Overrun error detected.");}if ((e.EventType & SerialError.RXParity) == SerialError.RXParity){Console.WriteLine("Parity error detected.");}
}
sp.ErrorReceived += (sender, e) => 
{Console.WriteLine($"錯誤類型:{e.EventType}");
};

4. 異常處理

使用try-catch塊捕獲和處理可能的異常,確保程序的穩定性:

try
{serialPort.Open();serialPort.WriteLine("Hello, Serial Port!");serialPort.Close();
}
catch (Exception ex)
{Console.WriteLine("Error: " + ex.Message);
}
// 常見異常類型
try 
{// 串口操作代碼
}
catch (UnauthorizedAccessException ex)
{Console.WriteLine("端口訪問被拒絕");
}
catch (TimeoutException ex) 
{Console.WriteLine("操作超時");
}
catch (IOException ex)
{Console.WriteLine("I/O錯誤");
}

5. 跨線程處理

為了能夠實時響應串口接收到的數據,可以使用DataReceived事件。需要注意的是,該事件在單獨的線程中觸發,若要更新UI控件,涉及到跨線程,需要使用Invoke方法。

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{SerialPort sp = (SerialPort)sender;string received = sp.ReadExisting();// 數據接收后,通過委托更新UI(假設在 WinForms 中更新TextBox)this.Invoke(new Action(() =>{textBox.Text += received ;}));
}

6. 多線程處理

推薦使用生產者-消費者模式:

BlockingCollection<string> dataQueue = new BlockingCollection<string>();// 生產者線程
void DataReceivedHandler(...)
{dataQueue.Add(receivedData);
}// 消費者線程
Task.Run(() => 
{foreach (var data in dataQueue.GetConsumingEnumerable()){// 處理數據}
});

五、常見問題與注意事項

1. 注意事項

  • 參數一致性:確保雙方設備的波特率、數據位、停止位、校驗位一致。
  • 權限問題:在訪問串口時,需要確保程序有相應的權限,否則可能會拋出異常。
  • 線程安全:在DataReceived事件中處理數據時,由于它是在單獨的線程中觸發的,若要更新UI控件,必須使用Invoke方法來確保線程安全
  • 異常處理:使用 try-catch 處理 Open()Read()Write() 可能拋出的異常。
  • 緩沖區管理:通過 DiscardInBufferDiscardOutBuffer 清空緩沖區,避免數據殘留。
    • 避免重復打開同一端口,關閉前調用 sp.DiscardInBuffer() 清空緩存。
  • 硬件流控制
    在高速傳輸場景中啟用 Handshake.RequestToSend,避免數據丟失。

2. 常見問題

  • 端口無法打開
    • 檢查設備是否占用(如其他程序已連接)
    • 確認串口號是否正確(虛擬串口可能動態變化)
    • 異常處理:try...catch(IOException)捕獲端口不存在錯誤
  • 數據接收不完整
    • 使用BytesToRead確保讀取全部緩存數據
    • 添加延遲(如Thread.Sleep(50))等待完整幀
    • 硬件延遲:部分設備發送數據有間隔,需調整時序
  • 數據亂碼
    • 發送/接收端波特率必須一致,否則數據亂碼。
  • 字符編碼問題
    • 若接收中文字符亂碼,需設置:
    • serialPort.Encoding = Encoding.GetEncoding("GB2312")
    • serialPort.Encoding = Encoding.UTF8;

六、擴展

1. 跨平臺方案(RJCP.SerialPortStream)

對于需要跨平臺(Linux/macOS)的場景,推薦使用 RJCP.SerialPortStream 庫(通過 NuGet 安裝 RJCP.SerialPortStream):

using RJCP.IO.Ports;SerialPortStream serialPort = new SerialPortStream("COM3");
serialPort.BaudRate = 9600;
serialPort.Open();// 事件處理與讀寫方式與 SerialPort 類似
serialPort.DataReceived += (sender, e) => 
{byte[] data = new byte[serialPort.BytesToRead];serialPort.Read(data, 0, data.Length);Console.WriteLine(Encoding.UTF8.GetString(data));
};

2. 編碼

使用串口通信的時候,會涉及到數據的編碼格式,如果我們使用ASCII編碼格式,但是接收的時候采用的是其他的編碼格式,可能就會導致數據解析錯誤,因此在一些特定場景下我們需要規定好發送和接收數據的編碼格式,這個時候就需要用到System.Text.Encoding 類中的編碼解碼的功能。
詳見:C# System.Text.Encoding 使用詳解

3. 清空緩沖區的方法

關于 DiscardInBuffer / DiscardOutBuffer 的使用,詳見:C# SerialPort 類中清空緩存區的方法。

4. Handshake 設置

常用握手協議

  • Handshake.None:無握手。
  • Handshake.RequestToSend:RTS/CTS(請求發送/清除發送)。
  • Handshake.XOnXOff:軟件流控制(XON/XOFF 字符)。
serialPort.Handshake = Handshake.RequestToSend;

詳見:C# SerialPort 類中 Handshake 屬性的作用

結語

回到目錄頁:C# 上位機知識匯總
希望以上內容可以幫助到大家,如文中有不對之處,還請批評指正。


參考資料:

  • 官方文檔:SerialPort Class

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

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

相關文章

3D點云的深度學習網絡分類(按照作用分類)

1. 3D目標檢測&#xff08;Object Detection&#xff09; 用于在點云中識別和定位目標&#xff0c;輸出3D邊界框&#xff08;Bounding Box&#xff09;。 &#x1f539; 方法類別&#xff1a; 單階段&#xff08;Single-stage&#xff09;&#xff1a;直接預測3D目標位置&am…

LabVIEW 與 PLC 通訊的常見方式

在工業自動化和數據采集系統中&#xff0c;PLC&#xff08;可編程邏輯控制器&#xff09; 廣泛用于控制和監測各種設備&#xff0c;而 LabVIEW 作為強大的圖形化編程工具&#xff0c;常用于上位機數據處理和可視化。為了實現 LabVIEW 與 PLC 的高效通訊&#xff0c;常見的方法包…

2025 polarctf春季個人挑戰賽web方向wp

來個彈窗 先用最基礎的xss彈窗試一下 <script>alert("xss")</script>沒有內容&#xff0c;猜測過濾了script&#xff0c;雙寫繞過一下 <scrscriptipt>alert("xss")</scscriptript>background 查看網頁源代碼 查看一下js文件 類…

【Ai】--- 可視化 DeepSeek-r1 接入 Open WebUI(超詳細)

在編程的藝術世界里,代碼和靈感需要尋找到最佳的交融點,才能打造出令人為之驚嘆的作品。而在這座秋知葉i博客的殿堂里,我們將共同追尋這種完美結合,為未來的世界留下屬于我們的獨特印記。【Ai】--- 可視化 DeepSeek-r1 接入 Open WebUI(超詳細) 開發環境一、前情提要:你…

7.1-7.2考研408數據結構查找算法核心知識點深度解析

考研408數據結構查找算法核心知識點深度解析 一、查找基本概念 1.1 核心定義與易錯點 查找表與關鍵字 易錯點:混淆靜態查找表(僅查詢)與動態查找表(含插入/刪除操作)的應用場景。例如哈希表屬于動態查找結構,而分塊查找適用于靜態數據。難點:理解平均查找長度(ASL)的…

Redis--redis客戶端

目錄 一、引言 二、數據庫管理命令 三、redis客戶端 四、Java客戶端使用Redis 五、相關命令使用 1.get&#xff0c;set 2.exists&#xff0c;del 3.keys 4.expire&#xff0c;ttl 六、總結 一、引言 在之前學了redis相關類型命令之后&#xff0c;本篇文章&#xff0c;…

SpringBoot3.0不建議使用spring.factories,使用AutoConfiguration.imports新的自動配置方案

文章目錄 一、寫在前面二、使用imports文件1、使用2、示例比對3、完整示例 參考資料 一、寫在前面 spring.factories是一個位于META-INF/目錄下的配置文件&#xff0c;它基于Java的SPI(Service Provider Interface)機制的變種實現。 這個文件的主要功能是允許開發者聲明接口的…

鴻蒙特效教程10-卡片展開/收起效果

鴻蒙特效教程10-卡片展開/收起效果 在移動應用開發中&#xff0c;卡片是一種常見且實用的UI元素&#xff0c;能夠將信息以緊湊且易于理解的方式呈現給用戶。 本教程將詳細講解如何在HarmonyOS中實現卡片的展開/收起效果&#xff0c;通過這個實例&#xff0c;你將掌握ArkUI中狀…

hn航空app hnairSign unidbg 整合Springboot

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 學習unidbg補環境。先弄一個…

奇怪的異形選項卡樣式、弧形邊框選項卡

<template><div :class"$options.name"><div class"tab">默認選項卡</div><div class"tab" active>選中選項卡</div><el-divider /><el-tabs v-model"tabActiveName" tab-click"(t…

特殊行車記錄儀DAT視頻丟失的恢復方法

行車記錄儀是一種常見的車載記錄儀&#xff0c;和常見的“小巧玲瓏”的行車記錄儀不同&#xff0c;一些特種車輛使用的記錄儀的外觀可以用“笨重”來形容。下邊我們來看看特種車載行車記錄儀刪除文件后的恢復方法。 故障存儲: 120GB存儲設備/文件系統:exFAT /簇大小:128KB 故…

UE5小石子陰影在非常近距離才顯示的問題

Unreal中采用LandscapeGrass生成的地形&#xff0c;在MovieRenderQueue中渲染時陰影顯示距離有問題&#xff0c;在很近的時候才會有影子&#xff0c;怎么解決&#xff1f; 地面上通過grass生成的小石子的陰影只能在很近的時候才能顯示出來&#xff0c;需要如下調整 r.Shadow.R…

零基礎上手Python數據分析 (9):DataFrame 數據讀取與寫入 - 讓數據自由穿梭

回顧一下,上篇博客我們學習了 Pandas 的核心數據結構 Series 和 DataFrame。 DataFrame 作為 Pandas 的 “王牌” 數據結構,是進行數據分析的基石。 但 DataFrame 的強大功能,還需要建立在 數據輸入 (Input) 和 數據輸出 (Output) 的基礎上。 數據從哪里來? 分析結果又如何…

【商城實戰(65)】退換貨流程全解析:從前端到后端的技術實現

【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想…

SQL Server 2022 安裝問題

一、安裝與配置問題 1. SQL Server 2022 安裝失敗怎么辦&#xff1f; 常見原因&#xff1a; 硬件或操作系統不滿足最低要求&#xff08;如內存、磁盤空間不足&#xff09;。未關閉防火墻或殺毒軟件。之前版本的 SQL Server 殘留文件未清理。 解決方案&#xff1a; 確保硬件配…

解鎖 AWX+Ansible 自動化運維新體驗:快速部署實戰

Ansible 和 AWX 是自動化運維領域的強大工具組合。Ansible 是一個簡單高效的 IT 自動化工具&#xff0c;而 AWX 則是 Ansible 的開源 Web 管理平臺&#xff0c;提供圖形化界面來管理 Ansible 任務。本指南將帶你一步步在 Ubuntu 22.04 上安裝 Ansible 和 AWX&#xff0c;使用 M…

【xiaozhi贖回之路-2:語音可以自己配置就是用GPT本地API】

固件作用 打通了網絡和硬件的溝通 修改固件實現【改變連接到小智服務器的】 回答邏輯LLM自定義 自定義了Coze&#xff08;比較高級&#xff0c;自定義程度比較高&#xff0c;包括知識庫&#xff0c;虛擬腳色-戀人-雅思老師-娃娃玩具{可能需要使用顯卡對開源模型進行微調-產…

Springboot 學習 之 Shardingsphere 按照日期水平分表(二)

文章目錄 業務場景依賴配置特別注意優劣參考資料 業務場景 在 報表 等 大數據量 且需要 按照日期顯示 的業務場景下&#xff0c;按照 日期水平分表 是一個不錯的選擇 依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-b…

(UI自動化測試web端)第二篇:元素定位的方法_xpath擴展(工作當中用的比較多)

看代碼里的【driver.find_element_by_xpath( )】()里的路徑怎么寫&#xff1f; xpath元素定位有多種寫法&#xff0c;那我們現在說的就是在元素定位時&#xff0c;根據網頁的實際情況來選擇適合的xpath元素定位的寫法。信我 &#xff0c;你真正工作當中每個都有用的&#xff01…

[已解決]服務器CPU突然飆高98%----Java程序OOM問題 (2024.9.5)

目錄 問題描述問題排查問題解決參考資料 問題描述 業主單位服務器自8月29日晚上21:00起CPU突然飆高至98%&#xff0c;內存爆滿&#xff0c;一直到9月5日&#xff1a; 問題排查 ①執行 top 命令查看Java進程PID top②執行top -Hp PID 命令查看具體的線程情況 top -Hp 3058輸入上…