因為參加一個小項目,需要對繼電器進行串口控制,所以這兩天學習了基本的串口編程。同事那邊有JAVA的串列埠通訊包,不過是從網路下載的,比較零亂,難以精確掌握串口通訊的流程與內含。因此,個人透過學習網路上大牛的方法,利用C#實現了基本的串口通訊程式設計。以下將學習成果總結歸納,希望對大家有幫助。
一、串口通訊簡介
串行介面(串口)是一種可以將接受來自CPU的平行資料字元轉換為連續的串行資料流傳送出去,同時可將接受的串列資料流轉換為並行的資料字元供給CPU的裝置。一般完成這種功能的電路,我們稱為串列介面電路。
字串埠通訊(Serial Communications)的概念非常簡單,串列埠位元(bit)發送和接收位元組。儘管比按位元組(byte)的並行通訊慢,但是串列埠可以在使用一條線發送資料的同時用另一根線接收資料。串列通訊最重要的參數是波特率、資料位元、停止位元和奇偶校驗。對於兩個進行通訊的端口,這些參數必須匹配。
1. 波特率:這是一個測量符號傳輸速率的參數。指的是訊號被調變以後在單位時間內的變化,即單位時間內載波參數變化的次數,如每秒鐘傳送960個字符,而每個字符格式包含10位(1個起始位,1個停止位,8個資料位),這時的波特率為960Bd,位元率為10位*960個/秒=9600bps。
2. 資料位元:這是測量通訊中實際資料位元的參數。當電腦發送一個訊息包,實際的資料往往不會是8位元的,標準的值是6、7和8位元。標準的ASCII碼是0~127(7位元),擴充的ASCII碼是0~255(8位元)。
3. 停止位元:用來表示單一套件的最後幾位。典型的值為1,1.5和2位元。由於資料是在傳輸線上定時的,且每個裝置都有自己的時鐘,很可能在通訊中兩台裝置間出現了小小的不同步。因此停止位元不僅僅是表示傳輸的結束,並且提供電腦校正時鐘同步的機會。
4. 校驗位元:在串口通訊中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高、低。當然沒有校驗位也是可以的。
二、C#字串埠程式設計類別
從.NET Framework 2.0開始,C#提供了SerialPort類別用來實作串列埠控制。 命名空間:System.IO.Ports。其中詳細成員介紹參看MSDN文件。以下介紹其常用的欄位、方法和事件。
1. 常用欄位:
#名稱 | ##說明 |
##PortName | |
##BaudRate | 取得或設定序列波特率 |
#DataBits | 取得或設定每個位元組的標準資料位元長度 |
2. 常用方法:
名稱 | 說明 |
Close | 關閉連接埠連接,將 IsOpen 屬性設定為 false,並釋放內部 Stream 物件 |
#GetPortNames | 取得目前電腦的序列埠名稱陣列 |
#Open | 開啟一個新的序列埠連線 |
Read | #從 SerialPort 輸入緩衝區中讀取 |
Write | # 將資料寫入串列埠輸出緩衝區 |
#3.常用事件:
名稱 | |
##DataReceived | 表示將處理 SerialPort 物件的資料接收事件的方法 |
三、基本用法
下面結合現有的一個繼電器給予串口通信的基本用法,以供參考。
1 using System; 2 using System.Windows.Forms; 3 using System.IO.Ports; 4 using System.Text; 5 6 namespace Traveller_SerialPortControl 7 { 8 public partial class Form1 : Form 9 { 10 //定义端口类 11 private SerialPort ComDevice = new SerialPort(); 12 public Form1() 13 { 14 InitializeComponent(); 15 InitralConfig(); 16 } 17 /// <summary> 18 /// 配置初始化 19 /// </summary> 20 private void InitralConfig() 21 { 22 //查询主机上存在的串口 23 comboBox_Port.Items.AddRange(SerialPort.GetPortNames()); 24 25 if (comboBox_Port.Items.Count > 0) 26 { 27 comboBox_Port.SelectedIndex = 0; 28 } 29 else 30 { 31 comboBox_Port.Text = "未检测到串口"; 32 } 33 comboBox_BaudRate.SelectedIndex = 5; 34 comboBox_DataBits.SelectedIndex = 0; 35 comboBox_StopBits.SelectedIndex = 0; 36 comboBox_CheckBits.SelectedIndex = 0; 37 pictureBox_Status.BackgroundImage = Properties.Resources.red; 38 39 //向ComDevice.DataReceived(是一个事件)注册一个方法Com_DataReceived,当端口类接收到信息时时会自动调用Com_DataReceived方法 40 ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived); 41 } 42 43 /// <summary> 44 /// 一旦ComDevice.DataReceived事件发生,就将从串口接收到的数据显示到接收端对话框 45 /// </summary> 46 /// <param> 47 /// <param> 48 private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e) 49 { 50 //开辟接收缓冲区 51 byte[] ReDatas = new byte[ComDevice.BytesToRead]; 52 //从串口读取数据 53 ComDevice.Read(ReDatas, 0, ReDatas.Length); 54 //实现数据的解码与显示 55 AddData(ReDatas); 56 } 57 58 /// <summary> 59 /// 解码过程 60 /// </summary> 61 /// <param>串口通信的数据编码方式因串口而异,需要查询串口相关信息以获取 62 public void AddData(byte[] data) 63 { 64 if (radioButton_Hex.Checked) 65 { 66 StringBuilder sb = new StringBuilder(); 67 for (int i = 0; i 97 /// 接收端对话框显示消息 98 /// 99 /// <param>100 private void AddContent(string content)101 {102 BeginInvoke(new MethodInvoker(delegate103 { 104 textBox_Receive.AppendText(content); 105 }));106 }107 108 /// <summary>109 /// 串口开关110 /// </summary>111 /// <param>112 /// <param>113 private void button_Switch_Click(object sender, EventArgs e)114 {115 if (comboBox_Port.Items.Count 168 /// 将消息编码并发送169 /// 170 /// <param>171 /// <param>172 private void button_Send_Click(object sender, EventArgs e)173 {174 if (textBox_Receive.Text.Length > 0)175 {176 textBox_Receive.AppendText("\n");177 }178 179 byte[] sendData = null;180 181 if (radioButton_Hex.Checked)182 {183 sendData = strToHexByte(textBox_Send.Text.Trim());184 }185 else if (radioButton_ASCII.Checked)186 {187 sendData = Encoding.ASCII.GetBytes(textBox_Send.Text.Trim());188 }189 else if (radioButton_UTF8.Checked)190 {191 sendData = Encoding.UTF8.GetBytes(textBox_Send.Text.Trim());192 }193 else if (radioButton_Unicode.Checked)194 {195 sendData = Encoding.Unicode.GetBytes(textBox_Send.Text.Trim());196 }197 else198 {199 sendData = strToHexByte(textBox_Send.Text.Trim());200 }201 202 SendData(sendData);203 }204 205 /// <summary>206 /// 此函数将编码后的消息传递给串口207 /// </summary>208 /// <param>209 /// <returns></returns>210 public bool SendData(byte[] data)211 {212 if (ComDevice.IsOpen)213 {214 try215 {216 //将消息传递给串口217 ComDevice.Write(data, 0, data.Length);218 return true;219 }220 catch (Exception ex)221 {222 MessageBox.Show(ex.Message, "发送失败", MessageBoxButtons.OK, MessageBoxIcon.Error);223 }224 }225 else226 {227 MessageBox.Show("串口未开启", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);228 }229 return false;230 }231 232 /// <summary>233 /// 16进制编码234 /// </summary>235 /// <param>236 /// <returns></returns>237 private byte[] strToHexByte(string hexString)238 {239 hexString = hexString.Replace(" ", "");240 if ((hexString.Length % 2) != 0) hexString += " ";241 byte[] returnBytes = new byte[hexString.Length / 2];242 for (int i = 0; i
軟體實作基本介面
以上是C#串口通訊的實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C#在.NET生態系統中扮演核心角色,是開發者的首選語言。 1)C#提供高效、易用的編程方式,結合C、C 和Java的優點。 2)通過.NET運行時(CLR)執行,確保跨平台高效運行。 3)C#支持從基本到高級的用法,如LINQ和異步編程。 4)優化和最佳實踐包括使用StringBuilder和異步編程,提高性能和可維護性。

C#是微軟在2000年發布的編程語言,旨在結合C 的強大功能和Java的簡潔性。 1.C#是一種類型安全、面向對象的編程語言,支持封裝、繼承和多態。 2.C#的編譯過程將代碼轉化為中間語言(IL),然後在.NET運行時環境(CLR)中即時編譯成機器碼執行。 3.C#的基本用法包括變量聲明、控制流和函數定義,而高級用法涵蓋異步編程、LINQ和委託等。 4.常見錯誤包括類型不匹配和空引用異常,可通過調試器、異常處理和日誌記錄來調試。 5.性能優化建議包括使用LINQ、異步編程和提高代碼可讀性。

C#是一種編程語言,而.NET是一個軟件框架。 1.C#由微軟開發,適用於多平台開發。 2..NET提供類庫和運行時環境,支持多語言。兩者協同工作,構建現代應用。

C#.NET是一個強大的開發平台,結合了C#語言和.NET框架的優勢。 1)它廣泛應用於企業應用、Web開發、遊戲開發和移動應用開發。 2)C#代碼編譯成中間語言後由.NET運行時環境執行,支持垃圾回收、類型安全和LINQ查詢。 3)使用示例包括基本控制台輸出和高級LINQ查詢。 4)常見錯誤如空引用和類型轉換錯誤可以通過調試器和日誌記錄解決。 5)性能優化建議包括異步編程和優化LINQ查詢。 6)儘管面臨競爭,C#.NET通過不斷創新保持其重要地位。

C#.NET的未來趨勢主要集中在雲計算、微服務、AI和機器學習集成以及跨平台開發三個方面。 1)雲計算和微服務:C#.NET通過Azure平台優化雲環境表現,支持構建高效微服務架構。 2)AI和機器學習集成:借助ML.NET庫,C#開發者可在應用中嵌入機器學習模型,推動智能化應用發展。 3)跨平台開發:通過.NETCore和.NET5 ,C#應用可在Windows、Linux和macOS上運行,擴展部署範圍。

C#.NET開發的最新動態和最佳實踐包括:1.異步編程提高應用響應性,使用async和await關鍵字簡化非阻塞代碼;2.LINQ提供強大查詢功能,通過延遲執行和表達式樹高效操作數據;3.性能優化建議包括使用異步編程、優化LINQ查詢、合理管理內存、提升代碼可讀性和維護性、以及編寫單元測試。

如何利用.NET構建應用?使用.NET構建應用可以通過以下步驟實現:1)了解.NET基礎知識,包括C#語言和跨平台開發支持;2)學習核心概念,如.NET生態系統的組件和工作原理;3)掌握基本和高級用法,從簡單控制台應用到復雜的WebAPI和數據庫操作;4)熟悉常見錯誤與調試技巧,如配置和數據庫連接問題;5)應用性能優化與最佳實踐,如異步編程和緩存。

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器