基础入门
第 7 课:串口打印——让板子开口说话
灯只会告诉你"亮"或"灭",串口能告诉你程序内部在想什么
我是吴老师。这节课教你一个你以后每天都会用的本事。
前面几节课,你判断程序对不对,靠的是看现象——灯亮了吗?闪的快慢对吗?
但现象能告诉你的东西太少了。
灯不亮,可能是引脚接错了、可能是代码逻辑错了、可能是模块坏了。灯只会说"不行",它不会说"为什么不行"。
这节课,我们让板子开口说话。
一、灯不会说话,这是个大问题
先看个场景。
你要写一个"按钮按下就亮灯"的程序。写完烧进去——按了没反应。
请问,问题在哪儿?
- 按钮的线接错了?
- 引脚号写错了?
if判断的逻辑写反了?- 板子根本没读到按钮信号?
你盯着那颗不亮的灯,什么都看不出来。 它只会给你一个"不行",剩下全靠猜。
这就是"只能看现象"的局限:你只能看见最终结果,看不见过程。
而串口打印解决的问题,就是让你看见过程——
按钮读数:0
按钮读数:0
按钮读数:1 ← 按下了!
进入了 if 分支
灯应该亮了现在你知道问题在哪了。 它读到 1 了,也进入判断了,说明问题在后面——比如灯那根线接错了。
这就是这节课的价值:它让你的程序变成"透明的"。
以前你只能站在门外听声音,猜屋里发生了什么。现在你有了一个窗户,能直接看见里面。
二、串口到底是什么
别被"串口"这个词吓到,它的原理特别朴素。
板子和你的电脑之间,本来就有一根数据线连着(对,就是你烧程序那根)。
平时这根线是你发给板子(烧程序、下指令)。而串口打印做的是反过来的事:板子往外发。
它把文字通过这根线传到你电脑上,电脑上有个窗口专门收这些文字显示出来——那个窗口叫"串口监视器"。
所以:
| 方向 | 干什么 | 叫什么 |
|---|---|---|
| 电脑 → 板子 | 烧程序、下指令 | 上传 / 烧录 |
| 板子 → 电脑 | 发文字给你看 | 串口打印 |
就这么简单。 一根线,两个方向。
一个细节你迟早会遇到:这一根线不能同时干两件事。 板子正在烧程序的时候,你发不了串口;板子正在拼命打印的时候,烧录可能失败。
遇到"烧不进去",先确认一下是不是串口监视器还开着——把监视器关掉再烧。这是新手常见的一个坑。
三、怎么用:两句话
代码里只有两句话要记。真的只有两句。
第 1 句:打开串口
Serial.begin(115200);这句放在 setup() 里(只跑一次嘛,打开一次就够了)。
115200 叫"波特率",是"说话的语速"。
板子和电脑得像两个人在对讲机上说话,频道和语速必须一致,不然就是一片乱码。
115200 是个约定俗成的常用值,你记住它就行。关键是:代码里写 115200,你读的时候也得选 115200,两边必须一样。
波特率对不上会怎样?你会看到一堆乱码,像
嚚嚚嚚嚚嚚这种。遇到乱码,第一反应就是检查波特率。这是仅次于接错线的第二大新手坑。
第 2 句:把想说的发出去
Serial.println("灯亮了");println 的意思是"打印一行"(print line)。
引号里写什么,板子就发什么。 中文、英文、数字都行。
它也有个兄弟叫 Serial.print()(少个 ln)——
| 写法 | 效果 |
|---|---|
Serial.print("abc") |
打 abc,不换行 |
Serial.println("abc") |
打 abc,然后换行 |
大部分时候你用 println,因为一行一件事看起来清楚。
完整代码
把这两句放进第 6 课的闪灯程序里:
void setup() {
Serial.begin(115200); // 打开串口,语速 115200
pinMode(3, OUTPUT);
}
void loop() {
digitalWrite(3, HIGH);
Serial.println("灯亮了"); // 说一句
delay(500);
digitalWrite(3, LOW);
Serial.println("灯灭了"); // 再说一句
delay(500);
}烧进去,然后打开串口监视器,你会看到:
灯亮了
灯灭了
灯亮了
灯灭了
...一路滚出来,跟灯的闪烁严格同步。
看到没有? 你现在能同时"看见"两件事了——灯在闪(眼睛),程序在说(屏幕)。
这两条信息一旦对不上,问题就暴露了。比如灯不闪但文字在滚,说明程序在跑,是硬件的问题;如果连文字都没有,说明程序压根没跑起来。
四、真正有用的:把数字打出来
上面打的是固定文字。但串口真正厉害的地方,是能打"变化的数字"。
void loop() {
Serial.print("当前读数:");
Serial.println(analogRead(0)); // 把读到的值打出来
delay(500);
}你会看到数字在屏幕上不停滚动。这时候你就能分析它了:
- 数值范围是多少?(是 0~4095 还是别的?)
- 我遮住光敏的时候,它是变大还是变小?
- 它稳定吗,还是乱跳?
这些问题,光看灯是永远得不到答案的。
一句口诀你记下来:先打印,再判断。
想写"读数超过 2000 就亮灯"?别急着写判断。先打印出来看看,确认读数真的会超过 2000、真的在合理范围里——然后再写那个 if。
反过来做(先写判断,不亮再猜),你会痛苦很多。
五、几个你迟早会用到的写法
一次打多个值
Serial.print("温度:");
Serial.print(24.5);
Serial.println(" °C");输出是:温度:24.5 °C
注意我用了两个 print 加一个 println——print 不换行,所以它们拼成了一行,最后 println 才换行。
这是一种很常用的拼装方式。
打数字和打文字,是两回事
Serial.println("123"); // 输出:123(文字)
Serial.println(123); // 输出:123(数字)表面上输出一样,但写法不同:引号里的是文字,没引号的是数字。
为什么要在意?因为数字可以参与运算,文字不行。
Serial.println(2 + 3); // 输出:5
Serial.println("2 + 3"); // 输出:2 + 3(原样打出来)新手经常在这里迷惑,"为什么我打出来的是 2 + 3 而不是 5"——因为你的引号没去掉。
六、一个小麻烦:串口监视器会"占着"
用 arduino-cli 的时候有个坑,我提前告诉你。
读串口的命令是个"交互式"命令——它会一直占着你的终端不返回。
arduino-cli monitor -p COM3 -c baudrate=115200跑起来之后,它会一直显示板子发来的内容。你想敲下一条命令,得先按 Ctrl+C 退出。
这和烧录会冲突——刚才说过,一根线同时只能干一件事。所以流程是:
- 烧录 → 等下完
- 开监视器看
- 看完按
Ctrl+C退出 - 再回去改代码、重新烧
顺序别乱,乱了就会出现"串口被占用"之类的报错。
如果你是用 AI 帮你跑的,得提醒它一句:
arduino-cli monitor不适合自动执行(会卡住不返回)。让它改用 Python + pyserial 读固定行数,或者直接把监视器开着让你自己看。
自测
答案与解析
用的就是烧程序那根线,只是方向反过来了——从"电脑发给板子"变成"板子发给电脑"。所以它不占额外引脚、不需要额外接线,插着线就能用。
答案与解析
波特率是"说话的语速",两边必须一致。代码里 Serial.begin(115200),读的时候就得分毫不差地选 115200。乱码但能看出有数据在传,基本就是这个问题。记住:遇到乱码先查波特率。
答案与解析
先打印,再判断。 阈值这种东西是跟环境有关的(房间亮度、模块差异都会影响),别人用的数在你这里可能完全不适用。而先打印出来看,你不仅知道该填多少,还能确认读数是不是在正常跳动。这一步能省掉后面大量的瞎猜。
答题要点
答题要点应该包含:没有串口时,你只能看见最终结果(灯亮不亮),而"灯不亮"这个结果对应着好几种完全不同的原因,你只能挨个试。有了串口时,你能看见过程——程序跑到哪一步了、变量当时是多少、有没有进 if 分支。于是排查从"猜哪种可能"变成了"看哪一步不对",范围一下就缩小了。关键区别:结果是二元的(行/不行),过程是连续的(走到哪了)。
拓展为什么传输速度要叫"波特率",还要两边一致?它是怎么把 0 和 1 变成文字的?
这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。
提示:搜"波特率 是什么"、"串口通信 起始位 停止位"。想一想:两根线上只有高低电平,接收方怎么知道一个字符从哪儿开始、到哪儿结束?
拓展如果板子断电重启,之前打印的内容还能看到吗?串口和"保存日志"有什么区别?
这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。
提示:搜"串口 缓冲 实时流"。想一想:串口像打电话还是像发短信?你没接到的那部分,后来还能补上吗?
本节你要动手做的事
- [ ] 让板子开口:在第 6 课的闪灯程序里加
Serial.begin(115200)和两句println,烧进去,打开监视器 - [ ] 故意制造乱码:把读的时候的波特率改成 9600,看看屏幕上是什么样子。记住这个长相,以后遇到了能一眼认出来
- [ ] 打印一个变化的数字:接上光敏或电位器,把读数打出来,用手遮一下看数值范围
- [ ] 试试
print和println的区别:同一段内容分别用两种写法,看看输出有什么不同 - [ ] 练一遍完整流程:改代码 → 按 Ctrl+C 退出监视器 → 烧录 → 再开监视器
这节课教的不是一个"功能",是一个"习惯"。
我教过很多学生,学得快的和学得慢的,差别经常不在聪明程度,而在于:遇到问题时,是想办法让程序"说话",还是继续闷头改代码。
闷头改代码的人,是在用修改代替思考——改十次碰巧对了一次,他也不知道为什么对。
而会打印的人,每一次调试都在缩小范围。
从今天起,你的程序多了一个本事:它能告诉你它在想什么。 别浪费它。
下一节我们讲按钮——那是板子第一次"听"你说话。到时候你会发现,串口打印在那一课有多重要。