STEM学习平台团队 bio photo

Email

Zhihu

Bilibili

Arduino 串口通信综合教程

程序架构说明 以下三个程序需要分别烧录到Arduino开发板运行,每个程序独立完成特定功能

分别实现:

程序一基础消息发送:开发板通过串口向电脑发送固定信息

程序二传感器数值上报:开发板通过串口向电脑发送动态的传感器信息

程序三远程LED/蜂鸣器控制:使用电脑通过串口通信控制开发板的执行器运作

程序一:基础消息发送

功能描述

每间隔1秒通过串口发送”hello world”字符串

完整代码

void setup(){
  Serial.begin(9600); // 初始化串口通信
}

void loop(){
  Serial.println("hello world"); // 发送带换行的字符串
  delay(1000); // 保持1秒间隔
}

逐行解析

  1. Serial.begin(9600)
    • 功能:启动串口通信模块
    • 参数说明:
      • 9600:波特率(每秒传输9600比特)
      • 波特率需与接收端一致,常用值:9600, 115200
  2. Serial.println("hello world")
    • Serial:串口操作对象
    • println:发送数据并附加换行符(\r\n
    • 数据传输格式:ASCII编码
  3. delay(1000)
    • 维持当前状态1秒
    • 防止数据发送过快导致缓冲区溢出

程序二:传感器数据上报

功能描述

持续读取A0引脚电位器数值并通过串口发送

完整代码

void setup(){
  Serial.begin(9600); // 初始化串口
}

void loop(){
  int sensorValue = analogRead(A0); // 读取模拟输入
  Serial.println(sensorValue); // 发送十进制数值
  delay(100); // 适当延时降低数据频率
}

关键代码解析

  1. analogRead(A0)
    • 功能:读取模拟输入电压
    • 参数范围:A0-A5(对应模拟输入引脚)
    • 返回值:0(0V)~1023(5V)的整数
  2. 数值传输特性
    • 原始数据:10位精度(2^10=1024级)
    • 传输格式:ASCII字符串形式(如”512\r\n”)

程序三:远程LED控制

功能描述

通过串口接收指令控制D7引脚LED状态

完整代码

volatile char Light = '0'; // 存储控制指令

void setup(){
  Serial.begin(9600);
  pinMode(7, OUTPUT); // 配置D7为输出模式
}

void loop(){
  // 接收串口数据
  if(Serial.available() > 0){
    Light = Serial.read(); // 读取单字节
  }
  
  // 执行控制指令
  switch(Light){
    case '1': 
      digitalWrite(7, HIGH); // 点亮LED
      break;
    case '0': 
      digitalWrite(7, LOW); // 熄灭LED
      break;
  }
}

核心代码分析

  1. volatile关键字
    • 作用:防止编译器优化变量访问
    • 应用场景:多线程/中断环境下的共享变量
  2. Serial.available()
    • 功能:返回接收缓冲区中的字节数
    • 判断条件:>0时表示有数据待读取
  3. Serial.read()
    • 读取策略:先进先出(FIFO)
    • 返回值:ASCII字符对应的整数值
  4. switch-case结构
    • 等效于多个if-else判断
    • 优势:代码结构更清晰

串口通信协议详解

数据格式

| 参数 | 说明 | 示例 | | —— | ———————— | ———– | | 波特率 | 数据传输速度 | 9600 bits/s | | 数据位 | 每个字符的位数 | 8位 | | 停止位 | 数据包结束标志 | 1位 | | 校验位 | 错误检测(本程序未使用) | 无 |

数据收发流程

网络架构(了解)

image-20250420171101032

发送端:
应用层 → 数据格式化 → 传输层 → 物理层

接收端:
物理层 → 数据解析 → 应用层

硬件连接规范

USB转串口连接

Arduino ↔ USB线 ↔ PC
(自动建立串口通道)

电位器连接

5V → 电位器VCC
A0 → 电位器中间引脚
GND → 电位器GND

LED电路

D7 → 220Ω电阻 → LED正极
LED负极 → GND

调试与故障排查

常见问题诊断

| 现象 | 排查步骤 | 解决方法 | | ————- | ———————————- | ————————– | | 无法打开串口 | 1. 检查USB连接
2. 确认端口选择 | 重新插拔USB/安装驱动 | | 数据乱码 | 检查波特率设置 | 确保收发双方波特率一致 | | LED不响应指令 | 1. 验证引脚连接
2. 检查字符编码 | 使用’0’/’1’字符而非数字0/1 | | 数据更新延迟 | 检查delay值 | 适当减小延时参数 |


进阶应用扩展

数据格式化传输

// 发送结构化数据
Serial.print("Voltage: "); 
Serial.print(sensorValue*5.0/1023, 2); // 保留两位小数
Serial.println(" V");

多指令控制

case '2': // 新增呼吸灯模式
  for(int i=0; i<255; i++){
    analogWrite(7, i);
    delay(10);
  }
  break;

核心概念总结

  1. 数字信号
    • 离散状态:HIGH(5V)/LOW(0V)
    • 应用场景:开关控制、状态指示
  2. 模拟信号

    • 连续变化:0-5V线性对应0-1023数值
    • 应用场景:传感器数据采集
  3. 引脚模式

    模式 配置函数 典型应用
    INPUT pinMode(n,INPUT) 读取传感器信号
    OUTPUT pinMode(n,OUTPUT) 驱动执行器件
  4. 串口通信协议
    • 异步传输:无时钟信号,依赖预定义波特率
    • 数据帧结构:起始位 + 数据位 + 停止位

掌握Arduino串口通信的基础实现方法,理解数据收发机制,可以扩展开发更复杂的物联网控制系统。建议配合串口调试助手软件进行实践观察,加深对通信协议的理解。


有问题找柯萌૮ ・ﻌ・ა
邮箱mingyoufhh@outlook.com