【C#】簡單的串口發送


一、核心代碼:
SerialPort serialPort = new SerialPort("COM1",9600,0, 8, (StopBits)1);
Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
byte[] bytes = gb.GetBytes(“串口中文數據123”);
serialPort.Open();
serialPort.Write(bytes, 0, bytes.Length);
serialPort.Close();
1
2
3
4
5
6
二、實現效果:


在文本框寫入數據,點擊打印即可發送到對應的串口。

三、步驟:
新建一個窗體程序

然后從工具箱拖入一個按鈕

 

改名為發送(后面又改成了打印,無傷大雅)

 

然后我們雙擊發送按鈕,進入代碼,紅框中的函數就是點擊事件,我們直接在這里面寫發送邏輯

 

先在頂部引用System.IO.Ports,這樣才可以使用SerialPort類:

using System.IO.Ports;
1
然后使用SerialPort操作串口,注意SerialPort有多個初始化函數(輸入SerialPort,右鍵SerialPort-轉到定義),如下:

public SerialPort();

public SerialPort(IContainer container);

public SerialPort(string portName);

public SerialPort(string portName, int baudRate);

public SerialPort(string portName, int baudRate, Parity parity);

public SerialPort(string portName, int baudRate, Parity parity, int dataBits);

public SerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits);
1
2
3
4
5
6
7
8
9
10
11
12
13
為了簡單點,我們直接選擇最后一個,把串口名稱波特率什么的直接定義好

 

SerialPort serialPort = new SerialPort("COM1",9600,0, 8, (StopBits)1);
1
其中參數Parity parity可以在定義中看一下(在SerialPort構造函數中找到最后一個構造函數,然后右鍵Parity轉到定義)

 

我們常見的設置9600,n,8,1中,n是校驗位,8是數據位,1是停止位
這里的0就是n
然后注意最后一個停止位用了強制類型轉換
如果直接設置成1會報錯

 

看一下定義,1代表一個停止位

 

這里會報錯可能是把1當做一個有符號的整數,而函數中要求的是無符號的,之前的Parity參數也是,不過是因為使用0,0沒有符號所以不會報錯,
但是如果需要校驗位,則也要加上強制類型轉換,如下:

 

SerialPort serialPort = new SerialPort("COM1", 9600, (Parity)1, 8, (StopBits)1);
1
然后寫一下發送的邏輯,這里希望可以發送一段中文到串口助手

 

Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
byte[] bytes = gb.GetBytes(“串口中文數據123”);

serialPort.Open();
serialPort.Write(bytes, 0, bytes.Length);
serialPort.Close();
1
2
3
4
5
6
這里先准備一段數據,然后轉成gb2312格式的字節數組,再打開串口,發送,然后關閉。
注意這種簡單粗暴的寫法程序毫無魯棒性,它不會檢測串口被其他占用了以后怎么辦,會直接崩潰,所以后續要優化一下,現在先簡單用。

我們可以先用虛擬串口工具VSPD虛擬兩個串口連接起來

 

然后打開串口調試助手,連接上COM2
在點擊左上角的綠三角運行一下我們的程序

 

點擊發送,即可在串口助手中看到收到的數據。

 

然后我們停止掉程序,來寫一個可以選擇串口和波特率的程序。

把原來的程序窗口拉大一點,然后添加文本框,用於顯示打印指令

 

這時候我們要設置文本框的多行指令

 

然后拖動即可,也可以通過

 

實現

 

然后放一個串口名和波特率的選項,其他的校驗位、停止位之類的用n,8,1默認不管了

 

然后我們初始化一下數據,首先是ComboBox的數據初始化,比較簡單的是波特率的下拉,只要自定義好數據就行,先看一下這個控件的名稱

 

然后把數據加載進去,我們在窗口初始化的時候來寫入數據,在窗口空白處雙擊

 

進入窗口初始話函數,然后添加兩個常用的波特率

 

comboBox2.Items.Add("9600");
comboBox2.Items.Add("115200");
1
2
可以試運行一下,

 

然后串口號也是如法炮制,直接自己寫入

 

private void Form1_Load(object sender, EventArgs e)
{
comboBox2.Items.Add("9600");
comboBox2.Items.Add("115200");

comboBox1.Items.Add("COM1");
comboBox1.Items.Add("COM2");
comboBox1.Items.Add("COM3");
comboBox1.Items.Add("COM4");
comboBox1.Items.Add("COM5");

}
1
2
3
4
5
6
7
8
9
10
11
12
然后我們先在之前的輸入框中默認輸入一些信息,免得因為空數據而出現問題!(下面最后一個設置的是COM1)

 

然后在初始化的地方獲取這兩個控件當前的值,注意第二個波特率要轉成int32類型,然后gb.GetBytes函數的參數改成我們文本框的文字textBox1.Text

 

private void button1_Click(object sender, EventArgs e)
{
//現在下拉框里面的參數字符
String nowComboBoxPortNameString = comboBox1.Text;
int nowComboBoxbaudRateInt = Convert.ToInt32(comboBox2.Text);

SerialPort serialPort = new SerialPort(nowComboBoxPortNameString,
nowComboBoxbaudRateInt, (Parity)0, 8, (StopBits)1);

Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
byte[] bytes = gb.GetBytes(textBox1.Text);

serialPort.Open();
serialPort.Write(bytes, 0, bytes.Length);
serialPort.Close();

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
這樣運行的時候可以選擇自己想要的波特率或者串口名稱而不用到代碼去修改了。

 

然后我們再做一個根據現有串口自動檢測的方式,避免連接空串口

我們把Form1_Load函數體內進行如下修改

 

private void Form1_Load(object sender, EventArgs e)
{
comboBox2.Items.Add("9600");
comboBox2.Items.Add("115200");

foreach (String portName in SerialPort.GetPortNames()) {
comboBox1.Items.Add(portName);
}
}
1
2
3
4
5
6
7
8
9
通過輪詢的方式把每個獲取到的串口寫入combo1,運行效果如下(稍微改了布局)


————————————————
版權聲明:本文為CSDN博主「百分之50」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/bfz_50/article/details/90267500


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM