一、串口通信到底在干嘛

串口通信,说白了就是两台设备之间接一根线,让它们按约定好的规则互相传数据。

在工业现场最常见的情况是:你的电脑(叫上位机)通过串口去连一台设备(可能是 PLC、传感器、扫码枪、仪表),从它那里读数据,或者给它发指令。

这根线上跑的东西,本质上是一串一串的高低电平。我们写程序要做的,就是告诉电脑:这些电平要按照什么规则去读、去发。


二、先用一个比喻建立直觉

想象两个人用对讲机通话。要能顺利听懂对方,得先约好五件事:

  1. 用哪个频道
  2. 说话语速多快
  3. 一句话里几个字
  4. 每句话说完怎么停顿
  5. 有没有暗号检查自己有没有听错

任何一项对不上,两个人就聊不起来。

串口通信完全一样。这五件事,就是下面要讲的五个参数,收发双方必须完全一致。


三、逐个讲清楚五个参数

先记一个小知识点:计算机里最小的单位叫「位」,英文是 bit。8 个位组成一个字节(byte),一个字节差不多就是一个英文字母或一个数字的大小。后面会一直用到。

1. 串口号(PortName)

电脑上可能有好几个串口,编号是 COM1、COM2、COM3 这样往下排。

就像一栋楼有好几个门,你要先知道设备插在哪个门。把设备插上后,在电脑的「设备管理器」里能看到它变成了 COM 几。

代码里对应的是 PortName 属性。

2. 波特率(BaudRate)

波特率就是传输速度,单位是「每秒传多少个位」,写作 bps。

你可以把它理解成两个人约定的语速:一个人讲得飞快,另一个人只听得懂慢速,就全乱套了。

常见取值:9600、19200、38400、57600、115200。数字越大越快。工业上很多老设备默认 9600,现在也常用 115200。

最容易出错的一点:收发双方必须用同一个波特率。

代码里对应的是 BaudRate 属性。

3. 数据位(DataBits)

一次真正要传的「内容」占几位。

因为 8 个位组成一个字节,一个字节通常就是一个字符,所以数据位几乎都填 8。

你基本不用纠结这个,默认写 8 就好。

代码里对应的是 DataBits 属性。

4. 停止位(StopBits)

数据传完之后,发一个停止信号,告诉对方「这一串我发完了」。

就像一句话说完要停一下,让对方知道这句话结束了。

常见取值:1 位、1.5 位、2 位。绝大多数设备用 1 位。

代码里对应的是 StopBits 属性,写 StopBits.One 表示 1 位。

5. 校验位(Parity)

数据在线上传输,可能受干扰出错。校验位就是用来检查「这一串数据有没有传错」。

打个比方:快递包裹上的封条,收件人一看封条完好,就知道没被动过。

常见取值:

  • None(无校验):不检查,最常用
  • Odd(奇校验)、Even(偶校验):按规则检查,出错能发现
  • 其他少见

工业现场很多设备直接用 None。如果设备说明书要求奇偶校验,照抄就行。

代码里对应的是 Parity 属性,写 Parity.None 表示无校验。


四、一张表帮你记牢

参数 中文意思 大白话 常用值
PortName 串口号 走哪个门 COM3
BaudRate 波特率 语速多快 9600 或 115200
DataBits 数据位 一句几个字 8
StopBits 停止位 说完停一下 1 位
Parity 校验位 有没有暗号验错 None

image-20260829080856413

五、写代码前的思路

新手最容易一上来就闷头写。记住一个顺序:先想清楚这五个参数,再写代码。

拿到一台设备,先去翻它的说明书或者问厂家,问清楚五件事:

  1. 它用哪个串口
  2. 波特率是多少
  3. 数据位几位
  4. 停止位几位
  5. 校验方式是什么

这五个数字就是打开串口的钥匙。参数不对,程序写得再漂亮也收不到数据。


六、第一次动手:打开串口

C# 里已经给我们准备好了串口类,叫 SerialPort,在 System.IO.Ports 命名空间里,直接用就行。

先写最小的一段,目标只有一个:成功打开串口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System.IO.Ports;

// 创建串口对象
SerialPort sp = new SerialPort();

// 五个参数,一个个填
sp.PortName = "COM3"; // 串口号,改成你自己的
sp.BaudRate = 9600; // 波特率
sp.DataBits = 8; // 数据位
sp.StopBits = StopBits.One; // 停止位,1 位
sp.Parity = Parity.None; // 校验位,无校验

// 打开串口
sp.Open();

如果 PortName 填了一个电脑上不存在的串口,Open 的时候会报错。所以写代码前要先确认设备插的是哪个口。


七、发送数据

打开之后,发数据很简单。

发字符串:

1
sp.Write("hello");

发字节数组(工业上更常用,比如给 PLC 发指令):

1
2
byte[] data = new byte[] { 0x01, 0x03, 0x00 };
sp.Write(data, 0, data.Length);

八、接收数据

接收要稍微绕一点,因为不是你想收就收,而是数据什么时候来,程序什么时候去取。

C# 用一个「事件」来通知我们:串口一收到数据,就会触发 DataReceived 事件,我们在里面去读。

1
2
3
4
5
6
7
sp.DataReceived += Sp_DataReceived;

private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string msg = sp.ReadExisting();
// 这里把 msg 显示到界面上
}

你现在不用纠结「事件」到底是什么,先知道有这么个机制就行:数据来了,自动执行 Sp_DataReceived 这个方法。等基础再扎实一点,事件我们单独讲。


九、用完要关闭

串口被程序占着的时候,别的程序用不了。用完记得关:

1
sp.Close();

十、小结

这篇笔记你只需要带走三句话:

  1. 串口通信就是两台设备按约定好的规则传数据。
  2. 五个参数(串口号、波特率、数据位、停止位、校验位)收发双方必须一致。
  3. 写代码就是:填好五个参数,打开串口,然后发送或者接收。

下一步

建议你动手做一个小实验:找一个串口设备,或者先用虚拟串口工具,把上面「打开串口、发送、接收」这三段代码拼起来,跑通一次。

等你亲眼看到数据收发成功,这几个参数你就彻底明白了。