短距离硬件通信

一串口

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;
相关推荐
H_oRIZoN_5 小时前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机
jianqiang.xue5 小时前
ESP-IDF保姆级入门41|产品级故障排查与稳定性优化全解:死机复位排查/内存泄漏定位/性能瓶颈分析/长期稳定性测试,掌握量产运维问题定位方法论
单片机·mcu·物联网·esp32
单片机仿真设计6 小时前
【proteus仿真】基于 STM32 的林区环境监控系统设计
stm32·单片机·proteus
Doraemomo8 小时前
IMX6ULL裸机开发——GPIO的使用
单片机·嵌入式硬件
笨笨饿8 小时前
#138_解决Codex要五次回复的问题
linux·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
晊晌_h8 小时前
嵌入式从0到精通——51单片机(二)
嵌入式硬件·51单片机
云泽8088 小时前
STM32 USART 详解(七):超时设置、非阻塞发送与 ReadLine 实现
stm32·单片机·嵌入式硬件
2401_862880829 小时前
UART 通信协议
单片机·51单片机
一条破秋裤10 小时前
24_MPU6050结构参数与寄存器基础
stm32·嵌入式硬件·学习
沐欣工作室_lvyiyi10 小时前
矿井安全监测系统设计(论文+源码)
单片机·无线通信·云平台·物联网毕业设计·矿井安全监测系统·机智云