短距离硬件通信

一串口

1.定义

通信接口

2.核心硬件引脚

引脚 全称 中文名称 核心作用
TX Transmit 发送引脚 往外发数据的 "嘴",把自己的数据传给对方
RX Receive 接收引脚 收数据的 "耳朵",接收对方发来的数据
GND Ground 公共地线 双方的 "共同参考点",没有它电压信号就没基准

3.串口四大关键参数(必须两端完全一致,否则乱码)

  1. 波特率 每秒传输位数,常见:9600、115200、4800、38400数值越大,传输越快、抗干扰越弱。

  2. 数据位 单帧有效数据长度,常用:8 位(通用标准)

  3. 停止位 一帧数据结束标记,常用:1 位,可选 2 位

  4. 校验位用来纠错,三种:

    • 无校验(None):最常用
    • 奇校验(Odd)
    • 偶校验(Even)

✅ 日常默认标准:9600/115200 + 8 数据位 + 1 停止位 + 无校验

4.串口数据帧结构(一帧完整数据)

定义:

串口通信是 **"按位" 一点点发数据的,就像快递员一次只能递一个字。为了让接收方知道 "哪段是一个完整的字节",就必须给数据加上固定的 "头尾标记",这个带了标记的、完整的一个数据单元,就叫一帧数据 **。

空闲 → 起始位 → 数据位 → 校验位 (可选) → 停止位

  • 起始位:拉低电平,通知设备开始接收
  • 停止位:拉高电平,标记数据结束

传输数据靠的是约定数据为 8位(可选)然后第一次拉低代表起始位,再8次之后拉高代表停止位

5.常见串口类型

  1. TTL 串口电平:0~3.3V/5V,板载短距离通信,直接接单片机
  2. RS232电平:±12V,电脑老式 COM 口,抗干扰一般,距离中等
  3. RS485 差分信号,抗干扰极强、远距离(千米级)、支持多设备总线组网

工业上位机、设备组网优先用 485

6通信关键特征

  • 全双工 :TX/RX 独立,同时发 + 收(UART)
  • 半双工:同一时间只能发 或 只能收(RS485)
  • 共地原则:设备不共地,百分百乱码 / 丢包
  • 距离限制:波特率越高,有效通信距离越短

7.核心类

SerialPort

1.作用

SerialPort是C#帮你把【高低电平、起始位、数据位、停止位】全部封装好的现成工具,你不用管底层硬件,直接调用就行!

让电脑通过 USB / 串口 与单片机、传感器、硬件设备互相发数据、收数据。

它帮你做了:

  • 打开 / 关闭串口
  • 设置波特率、数据位、停止位、校验位
  • 发送字节 / 字符串
  • 接收字节 / 字符串
  • 监听数据到达

2.最核心的5个配置(必须和硬件一致)

cs 复制代码
SerialPort serialPort = new SerialPort();

serialPort.PortName = "COM3";       // 串口号
serialPort.BaudRate = 9600;         // 波特率
serialPort.DataBits = 8;            // 数据位(你说的8位!)
serialPort.StopBits = StopBits.One; // 停止位
serialPort.Parity = Parity.None;    // 校验位

这 5 个必须和硬件一模一样,否则乱码!

3.常用操作

1.打开串口
cs 复制代码
if (!serialPort.IsOpen)
{
    serialPort.Open();
}
2.发送数据(发字符串 / 发字节)
cs 复制代码
// 发字符串
serialPort.Write("Hello");

// 发字节数组(硬件最常用)
byte[] data = new byte[] { 0x01, 0x02, 0x03 };
serialPort.Write(data, 0, data.Length);
3. 接收数据(两种方式)

方式 A:事件监听(推荐!)

数据来了自动触发,不用你管什么时候结束

cs 复制代码
serialPort.DataReceived += SerialPort_DataReceived;

// 数据到达事件
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string str = serialPort.ReadExisting(); // 读取所有收到的数据
    // 或者读字节
    byte[] buffer = new byte[serialPort.BytesToRead];
    serialPort.Read(buffer, 0, buffer.Length);
}

方式 B:同步读取(简单)

cs 复制代码
string data = serialPort.ReadExisting();
4. 关闭串口
cs 复制代码
if (serialPort.IsOpen)
{
    serialPort.Close();
}
5.设置缓存区与发送接收超时时间

为什么需要缓存区

1.解决【收发速度不匹配】的问题//这个缓存区(桶)可以提供波动(比如程序偶尔卡)

2.解决【数据不连续】的问题

3.解决【系统调度延迟】的问题

cs 复制代码
// 接收缓冲区大小:串口收到的数据先暂存这里,最多能存4800字节
serialPort2.ReadBufferSize = 4800;

// 发送缓冲区大小:你调用Write发的数据先暂存这里,最多能存4800字节
serialPort2.WriteBufferSize = 4800;

// 发送超时:Write方法超过10000ms(10秒)没发完,就抛异常退出
serialPort2.WriteTimeout = 10000;

// 接收超时:Read方法超过10000ms(10秒)没读到数据,就抛异常退出
serialPort2.ReadTimeout = 10000;
相关推荐
振南的单片机世界4 小时前
HAL慢、ODR中、BSRR快:GPIO翻转速度的三重境界
单片机·嵌入式硬件
实在太懒于是不想取名4 小时前
STM32N6的开发日记(7):摄像头+NPU联动,完成 YOLO 实时目标检测与显示
stm32·嵌入式硬件·yolo
小柯博客6 小时前
STM32MP2安全启动技术深度解析
c语言·c++·stm32·嵌入式硬件·安全·开源·github
实在太懒于是不想取名6 小时前
STM32N6的开发日记(8):在N6中部署自训练的火焰检测模型
stm32·单片机·嵌入式硬件
木子单片机7 小时前
基于51单片机温度上下限报警设计 数码管显示
stm32·单片机·嵌入式硬件·51单片机·keil
森利威尔电子-8 小时前
森利威尔SL3180 替换LTC3639 150V降压恒压芯片 3A峰值电流能力转换效率高 静态电流低
单片机·嵌入式硬件·集成电路·芯片·电源芯片
qq_401700418 小时前
合宙4G模块Air724UG
嵌入式硬件
yugi9878389 小时前
基于51单片机的篮球计分器设计
单片机·嵌入式硬件·51单片机
编程之升级打怪9 小时前
什么是PWM
嵌入式硬件