引言
串行通信是嵌入式电子学中最基础的技能之一。无论你是调试传感器、与GPS模块通信,还是向PC发送数据,USART(通用同步/异步收发器)都是你的得力工具。在本教程中,我们将使用Velxio模拟器中的Arduino Uno构建一个简单的串口回显项目。你在串口监视器中输入的每个字符都会被回显,并附带其ASCII值和累计计数。这就是串行通信领域的”Hello, World!”。

电路讲解
这个项目非常简单——它只使用了Arduino Uno板本身。不需要任何外部元件,因为串行通信是通过Uno内置的USB转串口转换器进行的。在Velxio中,串口监视器集成在编辑器工具栏中,因此你可以立即与代码进行交互。
组件
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Uno (wokwi-arduino-uno) | 1 | 项目的大脑 |
仅此而已!Arduino Uno的TX(引脚1)和RX(引脚0)在内部连接到USB接口,Velxio完美地模拟了这一过程。无需任何接线。

代码讲解
让我们深入代码。打开Velxio编辑器,你会看到以下草图:
// Serial Echo — USART Protocol Test
// Open the Serial Monitor to send and receive data.
// Everything you type is echoed back with extra info.
void setup() {
Serial.begin(9600);
Serial.println("=============================");
Serial.println(" Serial Echo Test (USART)");
Serial.println("=============================");
Serial.println("Type something and press Send.");
Serial.println();
// Print system info
Serial.print("CPU Clock: ");
Serial.print(F_CPU / 1000000);
Serial.println(" MHz");
Serial.print("Baud rate: 9600");
Serial.println();
Serial.println();
}
unsigned long charCount = 0;
void loop() {
if (Serial.available() > 0) {
char c = Serial.read();
charCount++;
Serial.print("[");
Serial.print(charCount);
Serial.print("] Received: '");
Serial.print(c);
Serial.print("' (ASCII ");
Serial.print((int)c);
Serial.println(")");
}
// Periodic heartbeat
static unsigned long lastBeat = 0;
if (millis() - lastBeat >= 5000) {
lastBeat = millis();
Serial.print("Uptime: ");
Serial.print(millis() / 1000);
Serial.print("s | Chars received: ");
Serial.println(charCount);
}
}

工作原理
-
设置:我们使用
Serial.begin(9600)以9600波特率初始化串行通信。然后打印一个标题和系统信息:CPU时钟速度(F_CPU / 1000000 得到MHz)和波特率。 -
全局变量:
unsigned long charCount = 0;用于跟踪我们接收到的字符数量。 -
循环:
if (Serial.available() > 0)检查接收缓冲区中是否有数据等待处理。char c = Serial.read();读取一个字符。- 我们递增
charCount并打印一条格式化消息:[count] Received: 'c' (ASCII 99)。 - 每5秒,我们打印一次心跳信息,包含运行时间和接收到的总字符数。
学生需掌握的关键概念
- 波特率:串行通信的速度。通信双方必须使用相同的波特率(此处为9600)。
- Serial.available():返回等待读取的字节数。在读取之前务必检查,以避免得到-1。
- Serial.read():从缓冲区读取一个字节(字符)。
- ASCII:每个字符都有一个数字代码。例如,‘A’是65。代码将
c强制转换为int以显示此值。 - millis():返回自程序启动以来的毫秒数。用于非阻塞定时。
- 静态变量:
static unsigned long lastBeat在循环迭代之间保留其值,这与局部变量不同。
常见问题与调试技巧
- 串口监视器没有显示输出? 确保你已在Velxio中打开串口监视器(点击工具栏中的”Serial Monitor”按钮)。同时检查监视器中的波特率是否与9600匹配。
- 出现乱码? 波特率不匹配是最常见的原因。请仔细检查
Serial.begin(9600)和监视器设置。 - 输入后无反应? 确保你在输入后按下了”Send”或回车键。代码一次只读取一个字符。
- 心跳信息未打印?
if (millis() - lastBeat >= 5000)条件使用>=以避免错过时间间隔。如果看不到心跳信息,请检查lastBeat是否正确更新。
建议的扩展练习
掌握基本回显后,尝试以下增强功能:
- 回显整行:不再逐个回显字符,而是累积字符直到换行,然后回显整行。
- 命令解析器:解释特殊命令,如”LED ON”来点亮LED(在电路中添加一个LED)。
- 二进制输出:以二进制格式打印接收到的字符。
- 多波特率支持:允许用户通过命令更改波特率。
- 记录到虚拟EEPROM:将接收到的数据存储到模拟的EEPROM中。
结论
你已经完成了第一个串行通信项目!串口回显是一个简单但强大的演示,展示了微控制器如何与外部世界通信。借助Velxio,你无需任何硬件即可进行实验——只需打开模拟器,编写代码,并立即测试。
准备好亲自尝试了吗?在Velxio中打开实时示例并开始输入:Velxio上的串口回显。祝你编码愉快!