Arduino 串口通信完全指南:UART 基础、RS232 兼容与实战代码
Arduino 串口通信:UART 原理、RS232 电平转换与编程实战
串行通信背景
早期并行通信需 8 根数据线,远距离信号失真、成本高。串行协议仅用 3 线(TX、RX、GND)传输 8 位数据:发送端并入串出移位寄存器,接收端串入并出还原。两种模式:同步(块传输)与异步(字节传输),异步模式最常用。
三种通信模式:单工(仅发)、半双工(收发分时)、全双工(同时收发)。
RS232 标准与 TTL 电平转换
RS232 早于 TTL 制定:逻辑 1 = -3~-25V,逻辑 0 = +3~+25V。接 TTL(0/5V 或 0/3.3V)需电平转换,经典芯片 MAX232。Arduino 内置 USB-UART 桥接,直接兼容 TTL 电平与 PC 虚拟串口,免外置 MAX232。
Arduino 串口核心 API
| 函数 | 作用 | 典型调用 |
|---|---|---|
Serial.begin(baud) | 初始化波特率(常用 9600) | Serial.begin(9600); 在 setup() 中 |
Serial.available() | 检查接收缓冲区字节数 | 返回 0 无数据,>0 有数据 |
Serial.read() | 读取 1 字节(返回 int,-1 表示空) | 发送字符 '1' 读得 ASCII 码 49 |
Serial.println(val) | 发送数据 + 换行符 | 调试输出、上位机显示 |
Serial.flush() | 清空发送缓冲区(等待发送完成) | 关键数据发送后调用 |
Serial.print(val) | 发送数据不换行 | 格式化输出 |
Serial.write(byte) | 发送原始字节 | 二进制协议 |
实战:PC 串口监视器收发演示
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
char cmd = Serial.read();
if (cmd == '1') {
digitalWrite(13, HIGH);
Serial.println("LED ON");
} else if (cmd == '0') {
digitalWrite(13, LOW);
Serial.println("LED OFF");
}
}
}
上传后打开 IDE “串口监视器”,波特率设 9600,发送 '1'/'0' 控制板载 LED 并回显状态。自行修改体会收发流程。
常见坑与技巧
Serial.read()返回 int 而非 char,需显式转型;读到字符 '1' 得 ASCII 49,切勿直接比较数值 1。- 波特率两端必须一致,常用 9600/115200。
- 长距离/抗干扰场合建议外挂 MAX232/MAX485 转 RS485 总线。
Serial.flush()仅阻塞等待发送缓冲区清空,不清空接收缓冲区。
延伸阅读
工业技术
- Arduino 与树莓派 2 I2C 通信集成:打造物联网传感器项目的最佳搭档
- 基于 Infineon 3D 磁传感器的 Arduino 无线磁通讯实验
- 基于 1Sheeld 与 Arduino 的盲聋人士沟通辅助系统
- Arduino + DHT11 + 以太网盾板温湿度数据记录仪
- Arduino UNO + WiFi 盾板:串口实时推送温度到网页绘图
- Python 3 控制 Arduino UNO - 串口通信点亮内置 LED 入门教程
- 理解数据流:从单工到全双工通信
- 光数据通信:利用光实现高带宽、无干扰传输
- 理解网络协议:从物理层到高级仲裁
- 微处理器:存储程序计算的演进
- MQTT 与 DDS:为物联网选择正确的 M2M 协议
- 工业物联网通信:6大成熟基础设施协议深度对比