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獲取或設置每個字節的標準數據位長度
Parity獲取或設置奇偶校驗檢查協議
StopBits獲取或設置每個字節的標準停止位數

2. 常用方法:

名稱說明
Close關閉端口連接,將?IsOpen?屬性設置為?false,并釋放內部?Stream?對象
GetPortNames獲取當前計算機的串行端口名稱數組
Open打開一個新的串行端口連接
Read從?SerialPort?輸入緩沖區中讀取
Write?將數據寫入串行端口輸出緩沖區

3. 常用事件:

名稱說明
DataReceived表示將處理?SerialPort?對象的數據接收事件的方法

三、C#開發串口實例

前臺頁面:

84630f1daf677b62744a088123fe2e9e.png

?后臺代碼:

using System;

using System.IO.Ports;

using System.Text;

using System.Windows.Forms;

namespace SerialPort

{

? ? public partial class SerialPort : Form

? ? {

? ? ? ? String serialPortName;

? ? ? ? public SerialPort()

? ? ? ? {

? ? ? ? ? ? InitializeComponent();

? ? ? ? }

? ? ? ? private void Form1_Load(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? string[] ports = System.IO.Ports.SerialPort.GetPortNames();//獲取電腦上可用串口號

? ? ? ? ? ? comboBox1.Items.AddRange(ports);//給comboBox1添加數據

? ? ? ? ? ? comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//如果里面有數據,顯示第0個

? ? ? ? ? ? comboBox2.Text = "115200";/*默認波特率:115200*/

? ? ? ? ? ? comboBox3.Text = "1";/*默認停止位:1*/

? ? ? ? ? ? comboBox4.Text = "8";/*默認數據位:8*/

? ? ? ? ? ? comboBox5.Text = "無";/*默認奇偶校驗位:無*/

? ? ? ? }

? ? ? ? private void button1_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? if (button1.Text == "打開串口"){//如果按鈕顯示的是打開

? ? ? ? ? ? ? ? try{//防止意外錯誤

? ? ? ? ? ? ? ? ? ? serialPort1.PortName = comboBox1.Text;//獲取comboBox1要打開的串口號

? ? ? ? ? ? ? ? ? ? serialPortName = comboBox1.Text;

? ? ? ? ? ? ? ? ? ? serialPort1.BaudRate = int.Parse(comboBox2.Text);//獲取comboBox2選擇的波特率

? ? ? ? ? ? ? ? ? ? serialPort1.DataBits = int.Parse(comboBox4.Text);//設置數據位

? ? ? ? ? ? ? ? ? ? /*設置停止位*/

? ? ? ? ? ? ? ? ? ? if (comboBox3.Text == "1") { serialPort1.StopBits = StopBits.One; }

? ? ? ? ? ? ? ? ? ? else if (comboBox3.Text == "1.5") { serialPort1.StopBits = StopBits.OnePointFive; }

? ? ? ? ? ? ? ? ? ? else if (comboBox3.Text == "2") { serialPort1.StopBits = StopBits.Two; }

? ? ? ? ? ? ? ? ? ? /*設置奇偶校驗*/

? ? ? ? ? ? ? ? ? ? if (comboBox5.Text == "無") { serialPort1.Parity = Parity.None; }

? ? ? ? ? ? ? ? ? ? else if (comboBox5.Text == "奇校驗") { serialPort1.Parity = Parity.Odd; }

? ? ? ? ? ? ? ? ? ? else if (comboBox5.Text == "偶校驗") { serialPort1.Parity = Parity.Even; }

? ? ? ? ? ? ? ? ? ? serialPort1.Open();//打開串口

? ? ? ? ? ? ? ? ? ? button1.Text = "關閉串口";//按鈕顯示關閉串口

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? catch (Exception err)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? MessageBox.Show("打開失敗"+ err.ToString(), "提示!");//對話框顯示打開失敗

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? else{//要關閉串口

? ? ? ? ? ? ? ? try{//防止意外錯誤

? ? ? ? ? ? ? ? ? ? serialPort1.Close();//關閉串口

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? catch (Exception){}

? ? ? ? ? ? ? ? button1.Text = "打開串口";//按鈕顯示打開

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? protected override void WndProc(ref Message m)

? ? ? ? {

? ? ? ? ? ? if (m.Msg == 0x0219){//設備改變

? ? ? ? ? ? ? ? if (m.WParam.ToInt32() == 0x8004){//usb串口拔出

? ? ? ? ? ? ? ? ? ? string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新獲取串口

? ? ? ? ? ? ? ? ? ? comboBox1.Items.Clear();//清除comboBox里面的數據

? ? ? ? ? ? ? ? ? ? comboBox1.Items.AddRange(ports);//給comboBox1添加數據

? ? ? ? ? ? ? ? ? ? if (button1.Text == "關閉串口"){//用戶打開過串口

? ? ? ? ? ? ? ? ? ? ? ? if (!serialPort1.IsOpen){//用戶打開的串口被關閉:說明熱插拔是用戶打開的串口

? ? ? ? ? ? ? ? ? ? ? ? ? ? button1.Text = "打開串口";

? ? ? ? ? ? ? ? ? ? ? ? ? ? serialPort1.Dispose();//釋放掉原先的串口資源

? ? ? ? ? ? ? ? ? ? ? ? ? ? comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//顯示獲取的第一個串口號

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? else{

? ? ? ? ? ? ? ? ? ? ? ? ? ? comboBox1.Text = serialPortName;//顯示用戶打開的那個串口號

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else{//用戶沒有打開過串口

? ? ? ? ? ? ? ? ? ? ? ? comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//顯示獲取的第一個串口號

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else if (m.WParam.ToInt32() == 0x8000){//usb串口連接上

? ? ? ? ? ? ? ? ? ? string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新獲取串口

? ? ? ? ? ? ? ? ? ? comboBox1.Items.Clear();

? ? ? ? ? ? ? ? ? ? comboBox1.Items.AddRange(ports);

? ? ? ? ? ? ? ? ? ? if (button1.Text == "關閉串口"){//用戶打開過一個串口

? ? ? ? ? ? ? ? ? ? ? ? comboBox1.Text = serialPortName;//顯示用戶打開的那個串口號

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else{

? ? ? ? ? ? ? ? ? ? ? ? comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//顯示獲取的第一個串口號

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? base.WndProc(ref m);

? ? ? ? }

? ? ? ? private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)

? ? ? ? {

? ? ? ? ? ? int len = serialPort1.BytesToRead;//獲取可以讀取的字節數

? ? ? ? ? ? byte[] buff = new byte[len];//創建緩存數據數組

? ? ? ? ? ? serialPort1.Read(buff, 0, len);//把數據讀取到buff數組

? ? ? ? ? ? Invoke((new Action(() =>{//C# 3.0以后代替委托的新方法

? ? ? ? ? ? ? ? ? ? textBox1.AppendText(Encoding.Default.GetString(buff));//對話框追加顯示數據

? ? ? ? ? ? })));

? ? ? ? }

? ? ? ? private void button2_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? textBox1.Clear();//清除接收對話框顯示的數據

? ? ? ? }

? ? ? ? private void button3_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? String Str = textBox2.Text.ToString();//獲取發送文本框里面的數據

? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? if (Str.Length > 0)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? serialPort1.Write(Str);//串口發送數據

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? catch (Exception){ }

? ? ? ? }

? ? ? ? private void button4_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? textBox2.Clear();//清除發送文本框里面的內容

? ? ? ? }

? ? }

}

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

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

相關文章

我在SharePoint行業的從業經歷(一)

大約10年前,我剛剛畢業的時候,找到了一個試用的機會。那個時候的我對軟件根本沒有概念。編程學的也非常少。僅僅是在系里學過一點VB和C,以為軟件就是像QQ或者游戲之類的。我從來沒想到會認識…

Linux的學習思路

自學嵌入式確實不大現實(當然也不是說沒有這個可能),畢竟嵌入式難度也是比較大的。 嵌入式的應用主要是幾個方向, 一是系統開發:側重開發環境搭建、內核原理、交叉編譯等; 二是嵌入式Linux應用開發&#xf…

tinycore php,tinycore中文支持

這兩天在弄tinycore,想用它來搭個小系統出來。下載最新的CorePlus-current.iso 4.5.2,用開源的usb的安裝工具core2usb-1.6.exe將它安裝到u盤,然后接上臺式機上,開機從u盤啟動,一切順利。好,開始搞起&#…

javascript權威指南--學習筆記

-一、JavaScript基本數據類型 1、數字--Number類 2、字符串--String類 3、布爾--Boolean類 4、函數Function 5、對象Object 6、數組Array 7、null 8、undefined 備注: 當一個未定義的值用于布爾環境,他就會轉為false,用于數字環境就會轉為…

支持 dotnet 6 的 dnSpy 神器版本

官方的 dnSpy 在 2021 時,由于某些吃瓜的原因 wtfsck 將 dnSpy 給 Archived 掉,在大佬被哄好之前,預計是不再更新。最新官方版本對 dotnet 6 的支持較弱,對于很多 dotnet 6 應用都無法成功調試,附加調試上去將會讓應用…

cmd命令

mstsc 開啟遠程連接services.msc 開啟服務sc delete 服務名稱 刪除服務telnet 106.75.97.193 查看端口是否占用netstat -a 查看端口監聽狀態

Robot Framework 教程 (3) - Resource及關鍵字 的使用

From:http://www.cnblogs.com/buaawp/p/4754399.html Robot Framework 教程 (3) - Resource及關鍵字 的使用 在進行軟件自動化測試時,我們設計并編寫好一個測試腳本的業務邏輯之后,需要將其中的業務數據提取為變量,并對業務邏輯進行封裝。在后…

mysql中的操作指令,MySQL中常用指令操作的介紹(代碼示例)

本篇文章給大家帶來的內容是關于MySQL中常用指令操作的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。l 創建數據庫:CREATE DATABASE table_name;l 刪除數據庫:DROP DATABASE table_na…

mt19937 -- 高質量隨機數

優點:產生速度快, 周期大 用法: #include<bits/stdc.h> using namespace std;int main() {mt19937 mt_rand(time(0));cout << mt_rand() << endl;return 0; } 轉載于:https://www.cnblogs.com/widsom/p/9935561.html

使用 AutoMapper 自動在多個數據模型間進行轉換

訪問數據庫、IPC 通信、業務模型、視圖模型……對于同一個業務的同一種數據&#xff0c;經常會使用多種數據模型工作在不同的代碼模塊中。這時它們之間的互相轉換便是大量的重復代碼了。使用 AutoMapper 便可以很方便地在不同的模型之間進行轉換而減少編寫太多的轉換代碼&#…

集合類型內建方法

一、集合類型方法方法名稱 操作 s.issubset(t)如果s是t的子集&#xff0c;則返回True&#xff0c;否則返回Falses.issuperset(t)如果s是t的超集&#xff0c;則返回True&#xff0c;否則返回Falses.union(t)返回一個新集合&#xff0c;該集合是s和t的并集s.intersection(t)返回…

Maven基礎:Maven環境搭建及基本使用(1)

1. Maven環境搭建 1.1 Maven簡介 1.2 Maven下載及環境設置 Maven下載地址&#xff1a;http://maven.apache.org/download.cgi 當前下載版本&#xff1a;apache-maven-3.5.0-bin.zip&#xff0c;解壓之后路徑 D:\Program Files\apache-maven-3.5.0 Maven環境變量設置&#xff1a…

mysql主外鍵引用關系,關于mysql:數據主/外鍵關系

我想對于那些已經開發了許多數據庫模式的人來說&#xff0c;這將是一個簡單的答案&#xff0c;但是我最近發現自己承擔了優化(或嘗試優化)數據庫模式的任務&#xff0c;并且一直在閱讀"高性能MySQL"&#xff0c;并且剩下一個關于在模式中使用或"過度使用"外…

解讀微軟開源MMLSpark:統一的大規模機器學習生態系統

AI前線導讀&#xff1a;目前&#xff0c;有很多深度學習框架支持與Spark集成&#xff0c;如Tensorflow on Spark等。然而&#xff0c;微軟開源的MMLSpark不僅集成了機器學習框架&#xff08;CNTK深度學習計算框架、LightGBM機器學習框架&#xff09;&#xff0c;還可以將這些計…

floyd判環算法(龜兔賽跑算法)

floyd判環算法&#xff08;龜兔賽跑算法&#xff09; 注意&#xff0c;這個算法是用來判斷一條鏈一條環的圖&#xff0c;環的長度或者環與鏈的交界處的&#xff0c;所以此floyd非彼floyd&#xff08;雖然都是一個人想出來的&#xff09;。 &#xff08;圖不是我的&#xff09; …

一個redis的連接庫的實現

2019獨角獸企業重金招聘Python工程師標準>>> import socketdef format_message( args):"""Create redis message:param args:Message data"""l u"*%d" % len(args)lines [l.encode(utf-8)]for arg in args:if not isinst…

matlab 邊緣檢測不閉合,Matlab多種圖像邊緣檢測方法

1、用Prewitt算子檢測圖像的邊緣I imread(bacteria.BMP);BW1 edge(I,prewitt,0.04); % 0.04為梯度閾值figure(1);imshow(I);figure(2);imshow(BW1);2、用不同σ值的LoG算子檢測圖像的邊緣I imread(bacteria.BMP);BW1 edge(I,log,0.003); % σ2imshow(BW1);titl…

實現CSS在線美化(格式化)、壓縮、加密、解密、混淆工具-toolfk程序員工具網

本文要推薦的[ToolFk]是一款程序員經常使用的線上免費測試工具箱&#xff0c;ToolFk 特色是專注于程序員日常的開發工具&#xff0c;不用安裝任何軟件&#xff0c;只要把內容貼上按一個執行按鈕,就能獲取到想要的內容結果。ToolFk還支持 BarCode條形碼在線生成、 QueryList采集…

只是他給的實在太多了!

工作幾年后&#xff0c;總是會問自己一個問題&#xff0c;工作的意義是什么&#xff1f;這個如果要在網絡上尋找答案&#xff0c;那一定是多如牛毛&#xff0c;每一個人都有一套自己的看法。在一開始出入社會工作之時&#xff0c;我并沒有意識到這個問題&#xff0c;更沒有思考…

[ci]jenkins server啟動,通過jnlp的方式啟動slave(容器模式)

jenkins server啟動,通過jnlp的方式啟動slave. java -jar jenkins.jar 配置jnlp端口--全局安全 配置云 配置項目 執行成功 轉載于:https://www.cnblogs.com/iiiiher/p/7978831.html