基础入门

第 7 课:串口打印——让板子开口说话

灯只会告诉你"亮"或"灭",串口能告诉你程序内部在想什么

我是吴老师。这节课教你一个你以后每天都会用的本事。

前面几节课,你判断程序对不对,靠的是看现象——灯亮了吗?闪的快慢对吗?

但现象能告诉你的东西太少了。

灯不亮,可能是引脚接错了、可能是代码逻辑错了、可能是模块坏了。灯只会说"不行",它不会说"为什么不行"。

这节课,我们让板子开口说话

一、灯不会说话,这是个大问题

先看个场景。

你要写一个"按钮按下就亮灯"的程序。写完烧进去——按了没反应。

请问,问题在哪儿?

  • 按钮的线接错了?
  • 引脚号写错了?
  • if 判断的逻辑写反了?
  • 板子根本没读到按钮信号?

你盯着那颗不亮的灯,什么都看不出来。 它只会给你一个"不行",剩下全靠猜。

不用串口只能靠猜,用串口能直接看到数值

这就是"只能看现象"的局限:你只能看见最终结果,看不见过程

而串口打印解决的问题,就是让你看见过程——

纯文本
按钮读数:0
按钮读数:0
按钮读数:1     ← 按下了!
进入了 if 分支
灯应该亮了

现在你知道问题在哪了。 它读到 1 了,也进入判断了,说明问题在后面——比如灯那根线接错了。

这就是这节课的价值:它让你的程序变成"透明的"。

以前你只能站在门外听声音,猜屋里发生了什么。现在你有了一个窗户,能直接看见里面。

二、串口到底是什么

别被"串口"这个词吓到,它的原理特别朴素。

板子通过数据线把文字发给电脑,电脑上打开串口监视器就能看到

板子和你的电脑之间,本来就有一根数据线连着(对,就是你烧程序那根)。

平时这根线是你发给板子(烧程序、下指令)。而串口打印做的是反过来的事:板子往外发

它把文字通过这根线传到你电脑上,电脑上有个窗口专门收这些文字显示出来——那个窗口叫"串口监视器"

所以:

方向 干什么 叫什么
电脑 → 板子 烧程序、下指令 上传 / 烧录
板子 → 电脑 发文字给你看 串口打印

就这么简单。 一根线,两个方向。

一个细节你迟早会遇到:这一根线不能同时干两件事。 板子正在烧程序的时候,你发不了串口;板子正在拼命打印的时候,烧录可能失败。

遇到"烧不进去",先确认一下是不是串口监视器还开着——把监视器关掉再烧。这是新手常见的一个坑。

三、怎么用:两句话

代码里只有两句话要记。真的只有两句。

第 1 句:打开串口

C++
Serial.begin(115200);

这句放在 setup() 里(只跑一次嘛,打开一次就够了)。

115200 叫"波特率",是"说话的语速"。

板子和电脑得像两个人在对讲机上说话,频道和语速必须一致,不然就是一片乱码。

115200 是个约定俗成的常用值,你记住它就行。关键是:代码里写 115200,你读的时候也得选 115200,两边必须一样。

波特率对不上会怎样?你会看到一堆乱码,像 嚚嚚嚚嚚嚚 这种。

遇到乱码,第一反应就是检查波特率。这是仅次于接错线的第二大新手坑。

第 2 句:把想说的发出去

C++
Serial.println("灯亮了");

println 的意思是"打印一行"(print line)。

引号里写什么,板子就发什么。 中文、英文、数字都行。

它也有个兄弟叫 Serial.print()(少个 ln)——

写法 效果
Serial.print("abc") abc不换行
Serial.println("abc") abc然后换行

大部分时候你用 println,因为一行一件事看起来清楚。

完整代码

把这两句放进第 6 课的闪灯程序里:

C++
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);
}

烧进去,然后打开串口监视器,你会看到:

纯文本
灯亮了
灯灭了
灯亮了
灯灭了
...

一路滚出来,跟灯的闪烁严格同步。

看到没有? 你现在能同时"看见"两件事了——灯在闪(眼睛),程序在说(屏幕)。

这两条信息一旦对不上,问题就暴露了。比如灯不闪但文字在滚,说明程序在跑,是硬件的问题;如果连文字都没有,说明程序压根没跑起来

四、真正有用的:把数字打出来

上面打的是固定文字。但串口真正厉害的地方,是能打"变化的数字"。

C++
void loop() {
  Serial.print("当前读数:");
  Serial.println(analogRead(0));   // 把读到的值打出来
  delay(500);
}

你会看到数字在屏幕上不停滚动。这时候你就能分析它了:

  • 数值范围是多少?(是 0~4095 还是别的?)
  • 我遮住光敏的时候,它是变大还是变小?
  • 它稳定吗,还是乱跳?

这些问题,光看灯是永远得不到答案的。

一句口诀你记下来:先打印,再判断。

想写"读数超过 2000 就亮灯"?别急着写判断。先打印出来看看,确认读数真的会超过 2000、真的在合理范围里——然后再写那个 if。

反过来做(先写判断,不亮再猜),你会痛苦很多。

五、几个你迟早会用到的写法

一次打多个值

C++
Serial.print("温度:");
Serial.print(24.5);
Serial.println(" °C");

输出是:温度:24.5 °C

注意我用了两个 print 加一个 println——print 不换行,所以它们拼成了一行,最后 println 才换行。

这是一种很常用的拼装方式。

打数字和打文字,是两回事

C++
Serial.println("123");    // 输出:123(文字)
Serial.println(123);      // 输出:123(数字)

表面上输出一样,但写法不同引号里的是文字,没引号的是数字。

为什么要在意?因为数字可以参与运算,文字不行

C++
Serial.println(2 + 3);     // 输出:5
Serial.println("2 + 3");   // 输出:2 + 3(原样打出来)

新手经常在这里迷惑,"为什么我打出来的是 2 + 3 而不是 5"——因为你的引号没去掉。

六、一个小麻烦:串口监视器会"占着"

用 arduino-cli 的时候有个坑,我提前告诉你。

读串口的命令是个"交互式"命令——它会一直占着你的终端不返回。

Shell
arduino-cli monitor -p COM3 -c baudrate=115200

跑起来之后,它会一直显示板子发来的内容。你想敲下一条命令,得先按 Ctrl+C 退出。

这和烧录会冲突——刚才说过,一根线同时只能干一件事。所以流程是:

  1. 烧录 → 等下完
  2. 开监视器看
  3. 看完按 Ctrl+C 退出
  4. 再回去改代码、重新烧

顺序别乱,乱了就会出现"串口被占用"之类的报错。

如果你是用 AI 帮你跑的,得提醒它一句:arduino-cli monitor 不适合自动执行(会卡住不返回)。让它改用 Python + pyserial 读固定行数,或者直接把监视器开着让你自己看。

自测

单选题串口打印的数据是怎么从板子传到电脑的?
单选题串口监视器打开后,看到的全是一堆乱码。最可能的原因是什么?
单选题你要写一个"读数超过 2000 就亮灯"的程序。按学过的思路,第一步该做什么?
问答题有了串口打印之后,"程序不工作"的排查方式发生了什么变化?说清楚"结果"和"过程"的区别。
拓展为什么传输速度要叫"波特率",还要两边一致?它是怎么把 0 和 1 变成文字的?

这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。

提示:搜"波特率 是什么"、"串口通信 起始位 停止位"。想一想:两根线上只有高低电平,接收方怎么知道一个字符从哪儿开始、到哪儿结束?

拓展如果板子断电重启,之前打印的内容还能看到吗?串口和"保存日志"有什么区别?

这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。

提示:搜"串口 缓冲 实时流"。想一想:串口像打电话还是像发短信?你没接到的那部分,后来还能补上吗?

本节你要动手做的事

  • [ ] 让板子开口:在第 6 课的闪灯程序里加 Serial.begin(115200) 和两句 println,烧进去,打开监视器
  • [ ] 故意制造乱码:把读的时候的波特率改成 9600,看看屏幕上是什么样子。记住这个长相,以后遇到了能一眼认出来
  • [ ] 打印一个变化的数字:接上光敏或电位器,把读数打出来,用手遮一下看数值范围
  • [ ] 试试 printprintln 的区别:同一段内容分别用两种写法,看看输出有什么不同
  • [ ] 练一遍完整流程:改代码 → 按 Ctrl+C 退出监视器 → 烧录 → 再开监视器

这节课教的不是一个"功能",是一个"习惯"。

我教过很多学生,学得快的和学得慢的,差别经常不在聪明程度,而在于:遇到问题时,是想办法让程序"说话",还是继续闷头改代码。

闷头改代码的人,是在用修改代替思考——改十次碰巧对了一次,他也不知道为什么对。

而会打印的人,每一次调试都在缩小范围

从今天起,你的程序多了一个本事:它能告诉你它在想什么。 别浪费它。

下一节我们讲按钮——那是板子第一次"听"你说话。到时候你会发现,串口打印在那一课有多重要。