串口通信入门笔记
一、串口通信到底在干嘛
串口通信,说白了就是两台设备之间接一根线,让它们按约定好的规则互相传数据。
在工业现场最常见的情况是:你的电脑(叫上位机)通过串口去连一台设备(可能是 PLC、传感器、扫码枪、仪表),从它那里读数据,或者给它发指令。
这根线上跑的东西,本质上是一串一串的高低电平。我们写程序要做的,就是告诉电脑:这些电平要按照什么规则去读、去发。
二、先用一个比喻建立直觉
想象两个人用对讲机通话。要能顺利听懂对方,得先约好五件事:
- 用哪个频道
- 说话语速多快
- 一句话里几个字
- 每句话说完怎么停顿
- 有没有暗号检查自己有没有听错
任何一项对不上,两个人就聊不起来。
串口通信完全一样。这五件事,就是下面要讲的五个参数,收发双方必须完全一致。
三、逐个讲清楚五个参数
先记一个小知识点:计算机里最小的单位叫「位」,英文是 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 |

五、写代码前的思路
新手最容易一上来就闷头写。记住一个顺序:先想清楚这五个参数,再写代码。
拿到一台设备,先去翻它的说明书或者问厂家,问清楚五件事:
- 它用哪个串口
- 波特率是多少
- 数据位几位
- 停止位几位
- 校验方式是什么
这五个数字就是打开串口的钥匙。参数不对,程序写得再漂亮也收不到数据。
六、第一次动手:打开串口
C# 里已经给我们准备好了串口类,叫 SerialPort,在 System.IO.Ports 命名空间里,直接用就行。
先写最小的一段,目标只有一个:成功打开串口。
1 | using System.IO.Ports; |
如果 PortName 填了一个电脑上不存在的串口,Open 的时候会报错。所以写代码前要先确认设备插的是哪个口。
七、发送数据
打开之后,发数据很简单。
发字符串:
1 | sp.Write("hello"); |
发字节数组(工业上更常用,比如给 PLC 发指令):
1 | byte[] data = new byte[] { 0x01, 0x03, 0x00 }; |
八、接收数据
接收要稍微绕一点,因为不是你想收就收,而是数据什么时候来,程序什么时候去取。
C# 用一个「事件」来通知我们:串口一收到数据,就会触发 DataReceived 事件,我们在里面去读。
1 | sp.DataReceived += Sp_DataReceived; |
你现在不用纠结「事件」到底是什么,先知道有这么个机制就行:数据来了,自动执行 Sp_DataReceived 这个方法。等基础再扎实一点,事件我们单独讲。
九、用完要关闭
串口被程序占着的时候,别的程序用不了。用完记得关:
1 | sp.Close(); |
十、小结
这篇笔记你只需要带走三句话:
- 串口通信就是两台设备按约定好的规则传数据。
- 五个参数(串口号、波特率、数据位、停止位、校验位)收发双方必须一致。
- 写代码就是:填好五个参数,打开串口,然后发送或者接收。
下一步
建议你动手做一个小实验:找一个串口设备,或者先用虚拟串口工具,把上面「打开串口、发送、接收」这三段代码拼起来,跑通一次。
等你亲眼看到数据收发成功,这几个参数你就彻底明白了。
