AI脑洞板
完整教案
自学课件
第 4 课 · 共 4/51 课

让板子开口说话——串口、波特率和你的第一个电脑软件 串口、波特率和你的第一个电脑软件

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
无
配套代码
见项目 demo 目录

你好,我是吴老师。

这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。

读完之后,你应该能:说出 TX、RX 各管什么方向、为什么烧录前要关闭串口;解释波特率是什么,并说出本板"改了波特率却不乱码"的原因;让板子汇报按键、听懂你的命令;设计一套自己的命令表;说出串口、I2C、SPI 三种通信方式各自用在哪、差在哪。

用时:基础实验 60–90 分钟;自制命令表与两个案例另留 30–40 分钟(可分两次做)。准备:板子、数据线、已经接入板卡 Skill 的 WorkBuddy——串口小助手不用提前准备,第五节我们会让 AI 现场给你造一个。


一、前三课,板子一直很沉默

回头看看我们做过的东西:第 1 课灯会变色,第 2 课板子能感觉到按键,第 3 课整块屏幕能亮出一种颜色。

可是我有个问题:灯亮着的时候,你怎么知道板子认为它是亮的?程序跑到一半卡住了,你怎么知道它卡在哪一步?

以前我们只能靠"看结果"猜。今天给板子装一根"电话线",让它把心里想的说出来,也能听懂你说的话。这根线叫串口。今天做三件事:

  1. 弄明白串口是什么、波特率又是什么;
  2. 用你自己的小软件和板子对话;
  3. 让板子听懂你的命令:按按钮它汇报,你说"红色"它就亮红灯,你说"屏幕绿色"整屏变绿。

二、串口是什么:两条传送带,方向相反

先纠正一个容易搞错的地方:串口不是一条线,而是两条,各管一个方向。

  • TX(Transmit,发送):板子往外说。
  • RX(Receive,接收):别人往板子里说。

串口:两条方向相反的传送带

把它们想成两条并排的传送带:一条只往外运,一条只往里运——所以板子可以一边说一边听,不用像对讲机那样"说完请回答"。

但这个比喻少了真实串口的第三样东西:GND,共同的地线。两条传送带要"共地"才能对齐高度。没有共地,两边对"高"和"低"的理解不一样,说出来的话全是乱的。

还有一件重要的事:发送和接收要交叉连接——我这边的 TX 接你那边的 RX,我这边的 RX 接你那边的 TX。就像打电话,听筒要对着话筒;接反了,两边都在对着自己说。

我们这块板用的是 USB 串口:ESP32-S3 芯片自己有 USB 接口,插上数据线,电脑上就会出现一个"COM 口"。不用额外接线,串口已经在那儿了。

三、串口能帮我们做什么

三件事,这节课一件一件遇到:

用处例子
板子汇报自己启动时打印"我醒了",按键时打印"按钮已按下"——这些文字叫日志
你给板子下命令电脑上打"红色",板子收到就把灯点亮——这就是"遥控器"
出问题时找原因程序卡在哪一步?打印出来看一眼,比猜快得多

第三件以后你调试作品时会天天用到。

四、波特率:先说好一秒钟敲几下

现在认识今天最容易绕晕的词——波特率。

串口线上只有"高"和"低"两种状态。要说话就得约定:一个信号持续多久算一个? 两边必须一样快,否则我数成 3 下,你数成 5 下,听到的就不是同一句话。

波特率就是这个约定:每秒钟传送多少个基本信号单元。 我们课上常用 115200,意思是一秒传 115200 个单元。

打个比方:两个人隔着墙敲管子,先约好"我一秒敲十下"。敲的人按这个节奏敲,听的人也按这个节奏数——听的人若按"一秒五下"数,听到的全是乱码。

比喻有个地方和真实硬件不一样:串口不是靠人敲,是靠两边各自的时钟;而且两边不需要分毫不差,一小段时间内差不多就行。

波特率:两边得数得一样快

再算一笔账。传一个字节时,通常会额外带上"开始信号"和"结束信号",一个字节约占 10 个单元:

115200 ÷ 10 ≈ 11520 字节/秒

一秒约一万字——打印日志快得几乎感觉不到延迟;但以后要传图片,就得算时间了。

关键点:板子程序和电脑软件必须设成同一个波特率。 板子上写 Serial.begin(115200),电脑上也选 115200。不过——我们这块板有个特别的地方,等下你会亲自发现。

五、认识你的新工具:串口小助手

这节课我们不再一直借用 WorkBuddy 的串口看消息。我给你一个你自己的软件:它叫串口小助手,双击就能运行、不用安装。

这个软件不用下载——你自己让 AI 写一个。

让 AI 帮你造一个串口小助手

把下面这段发给 AI,它会写好程序、保存到电脑上,并帮你打开:

请帮我用 Python 写一个"串口小助手"桌面程序,并保存到桌面,然后运行它。

界面要有五个部分(从上到下):
1. 串口选择下拉框 + 一个"刷新"按钮,点刷新重新扫描电脑上可用的串口;
2. 波特率下拉框,默认 115200;
3. 一个"打开串口 / 关闭串口"按钮(同一个按钮切换文字);
4. 接收区:显示板子发来的内容,每行前面带 [时:分:秒] 时间戳,只读;
5. 发送区:一个输入框 + "发送"按钮,旁边一个"发送后加换行"的勾选框(默认勾上)。

其它要求:
- 串口列表要能自动列出电脑上的串口,下拉框里显示端口名(Windows 上是 `COM3` 这样,Mac 上是 `/dev/cu.usbmodem1101` 这样),点"刷新"能重新扫;
- 打开串口后,接收区要持续刷新,不能卡住界面;
- 发送时按勾选框决定要不要在末尾加换行符;
- 左上角标题写"串口小助手";
- 给我一个"清空接收区"的按钮。

请先告诉我你打算用哪个库、界面大概长什么样,等我确认后再动手写代码。
想好了再点开:AI 大概会怎么做

**这不是标准答案。**AI 的写法可能和下面不一样,但道理是通的。

它多半会用一个叫 PySerial 的库(专门负责跟串口打交道)+ Tkinter(Python 自带的界面工具)。大概过程是:

  1. 先问你要装在哪个位置、用不用某个库;
  2. 写一个 .py 文件保存到桌面;
  3. 帮你打开它——你会看到一个窗口。

它可能需要先装库。如果 AI 说"需要先装 pyserial",照着它给的命令做就行(通常是 pip install pyserial)。

如果它一次没写对,别急着重开对话——把你看不懂的地方描述给它:"接收区不刷新,要重新点一下才出来"。这跟我们前面调试板子程序是一样的:说清现象,别说猜测。

造出来大概长这样:

串口小助手的界面

五个区域要记住:

区域作用
串口下拉 + 刷新选板子现在在哪个 COM 口。烧录后端口会变,要按刷新
波特率下拉必须和板子一致,我们固定用 115200
打开/关闭串口连接和断开。烧录前一定要点"关闭串口"
接收区板子发来的文字,带时间,方便数秒
发送框 + 发送你发给板子的话。勾了"发送后加换行",板子才知道一句话说完了

为什么不用现成的:因为**"造一个自己的工具"这件事,你已经会了**。以后你想要任何小工具——串口助手、数据记录仪、批量改名的脚本——都可以用今天这套办法让 AI 给你造出来。

如果你确实想用老师做好的版本:下载源码包 serial-pal.zip(含 serial_pal.py)。但请先自己试一次。

为什么烧录前要关闭串口?

电脑上一个串口同时只能被一个程序占用。串口小助手连着时,WorkBuddy 就烧不进去;反过来也一样。

烧录时看到"端口被占用 / port is busy"?先回串口小助手点关闭串口,再让 AI 重新烧录。烧完后端口名可能变了(Windows 上比如 COM34 → COM17),按刷新重新选一次再打开。

这不是软件坏了,是规矩:一根电话线,一次只能一个人用。

第一次连接

先把串口跑起来:

请使用课程的 esp32s3-touchboard-hardware-dev Skill,
给触摸屏板写一个串口测试程序:
启动时用 115200 打开串口,打印一句"我醒了,我是第 4 课的板子",
然后每隔 ___ 秒打印一次"我还活着,已经过了 N 秒",N 是实际秒数。
屏幕不用画复杂界面,保持清屏即可。
请用中文注释;烧录前先运行 arduino-cli board list 核对端口,
并且提醒我先关掉串口小助手再烧;另存一个新版本,保留原来的示例。
想好了再点开:我们的参考数字

这不是标准答案。 参考值:1 秒一次。

想清楚再填:这个数字决定了接收区冒字的速度。

  • 填 1 秒:一秒冒一行,你能从容地数、对时间。
  • 填 0.2 秒(也就是 200 毫秒):接收区会疯狂刷屏,你根本看不清,也数不过来。
  • 填 5 秒:要等很久才冒一行,做后面的实验会不耐烦。

想亲手体验"刷屏"是什么感觉?先填 0.2 秒跑一次,再改回 1 秒——对比一下你就明白了。

烧录完(记得先关闭串口助手)按顺序做:打开串口小助手 → 点刷新 → 选检测到的 COM 口 → 波特率 115200 → 点"打开串口"。

看到了吗?接收区不停地冒出"我还活着"——板子在你不插手的情况下,一直主动说话。

如果看到一堆 ���� 或奇怪方块,多半是波特率不一致,或板子正在重启。把现象如实记下来,下面用得上。

六、动手实验

实验 1:波特率改错了,会怎么样?

先猜再试。 把电脑上的波特率从 115200 改成 9600(板子程序不改),你猜会发生什么?

✏️ 可以直接在表格里填写
我改了什么我预测的现象我实际看到的现象
电脑改成 9600,板子仍是 115200
电脑改回 115200

操作顺序:关闭串口 → 波特率改 9600 → 打开串口 → 观察十秒 → 改回 115200。

结果可能是两种之一:

情况一:变成乱码。 正好印证:两边数得不一样快,话就听不懂了。

情况二:字还是好好的,一点没乱。 如果你看到的是这个——恭喜,你发现了一个更重要的问题。把这段话发给 AI:

我把电脑上的波特率改成了 9600,板子程序里还是 115200,
可是收到的字并没有乱码,仍然是正确的中文。
请结合我们这块板的资料解释:为什么波特率不一致却还能正常通信?
是不是这块板的串口和我想的不一样?
请用简单例子讲,讲完问我一个小问题,等我回答再继续。

答案大概是这样:这块 ESP32-S3 板用的是 USB CDC——"用 USB 假装出来的串口"。数据真正跑在 USB 线上,速度由 USB 协议自己决定;两边填的那个波特率数字,很多时候只是"记账用的标签",没有真的去控制时钟。

而如果你用另一块带独立 USB 转换芯片的板子,波特率就必须严格一致,乱设就乱码。

记住这个发现:你从实验里看到的现象,比书本上的结论更可靠。 书上写"波特率必须一致",在我们的板上却不成立——不是书错了,是书上讲的是另一种串口。以后再遇到"照着做却和说的不一样",先别急着说自己做错了——记录现象,追问为什么。

实验 2:按下按钮,让板子自己汇报

请使用课程的 Skill,在刚才的程序上加一个功能:
板载 BOOT 按键(GPIO0)被按下时,
通过串口打印一行"按钮已按下,第 N 次",N 是累计次数。
按住不放手时只允许打印一次,必须做消抖,消抖时间你自己定 ___ 毫秒。
屏幕上用中文显示累计次数,方便我一眼对照。
请用中文注释;烧录前先运行 arduino-cli board list 核对端口;
另存一个新版本,保留每秒一次的"我还活着"。
想好了再点开:我们的参考数字

这不是标准答案。 参考值:30 毫秒。

这个数字管的是"两次抖动算不算同一次按下":

  • 填 太小(比如 1 毫秒):手指抖动仍会被当成好几次按下,接收区还是会多打印。
  • 填 太大(比如 500 毫秒):你飞快连点两下,第二下会被无视掉。
  • 30 毫秒左右刚好——比手指抖得慢,比人连点得快。

记住这个数字,第 2 课讲消抖时也是它。可以故意改成 1 毫秒跑一次,看接收区会不会多冒几行。

记录:

✏️ 可以直接在表格里填写
我按了几次接收区出现几行"按钮已按下"两者一致吗
1 次
3 次
按住不放 3 秒

第三行是故意的。先猜,再试:按住不放,会打印一次还是很多次?

消抖做好了通常只算一次;如果程序写的是"只要按键是低电平就打印",三秒里会刷出几百上千行——板子一秒钟能检查几千次。真看到刷屏,你就亲眼看见了重复触发:把现象告诉 AI,请它解释"按下瞬间"和"按住期间"的区别。

顺便看数据方向:你按按钮 → ESP32-S3 检测 GPIO0 变低 → 程序决定汇报 → Serial.println() 把文字放进串口 → USB 线传到电脑 → 小助手接收区显示出来。 这一整条路是板子 → 电脑。

按下按钮,数据是怎么跑到电脑上的

实验 3:你说"红色",灯就亮红

换方向:电脑 → 板子。

请使用课程的 Skill,在刚才的程序上再加一个功能:
通过串口接收一行文字并识别:
收到"红色",让板载 RGB 灯亮红色;
收到"绿色",让灯亮绿色;
收到"蓝色",让灯亮蓝色;
收到"关闭",把灯熄灭。
亮度都不超过 ___(参考 40,不要出现 255)。
收到不认识的内容,就打印"没听懂:xxx",xxx 是收到的原文。
请用中文注释;烧录前先运行 arduino-cli board list 核对端口;
另存一个新版本。
想好了再点开:我们的参考数字

这不是标准答案。 参考值:40。

第 1 课讲灯的时候用过这个数。回顾一下为什么不能填 255:

  • 灯珠很小,255 是它的满功率——长时间盯着会很刺眼,也费电。
  • 40 是课上定的"低亮度"口径,够看清颜色,又不晃眼。

这条口径要一直守着:第 1 课灯是 40,第 3 课屏幕是 80(屏幕面积大,放宽了)。本课控制的是灯,所以是 40。

在发送框输入 红色,点发送(勾上"发送后加换行")。每填一行前先说出预测:

✏️ 可以直接在表格里填写
我发送的我预测灯会怎样灯实际怎样接收区回了什么
红色
绿色
蓝色
关闭
紫色
红色(不勾换行)

最后一行又是个坑。先猜:发送时没有换行,板子还认得"红色"吗?

很多程序的写法是"一直读到换行符才算一句话"。没换行,板子就一直等——所以你会发现:不勾换行灯没反应;等下一次发送别的内容时,前面那句才被一起处理掉。

把现象告诉 AI,请它解释"程序怎么知道一句话说完了"。这里认识本课新的两个代码名字(只认名字,不学语法):

  • Serial.available():问一句"有没有话进来?",回答来了几个字符;
  • Serial.readStringUntil('\n'):一直读,读到换行为止,把整句拿进来。

还有两个老朋友:Serial.begin(115200)(开局说好速度)、Serial.println("...")(发一行字,末尾带换行)。

你可能会问:那"红色"这两个汉字,怎么穿过串口?串口线上跑的其实都是数字——每个字按一套规则变成数字,这套规则叫编码,我们用 UTF-8。发送方和接收方用同一套规则,中文就对得上;规则不一致,就变成问号或乱码。

汉字是怎么穿过串口的

实验 4:你说"屏幕绿色",整块屏幕变绿

请使用课程的 Skill,再加一条命令:
收到"屏幕绿色",把整块屏幕填充成绿色;
收到"屏幕红色",填充成红色;
收到"屏幕蓝色",填充成蓝色;
收到"清屏",把屏幕刷成黑色,亮度都不超过 ___(参考 40)。
命令的格式你自己设计一套 ___(可以沿用"屏幕红",也可以自定前缀,说清规则就行)。
屏幕上方留一条信息栏,用中文显示收到的原话和当前颜色。
收到不认识的命令时,回一句中文提示,别让程序卡住。
请用中文注释;烧录前先运行 arduino-cli board list 核对端口;
另存一个新版本。
想好了再点开:我们的参考命令格式

这不是标准答案。 我们用的格式是 屏幕 + 颜色名(屏幕红色、屏幕绿色、屏幕蓝色)。

你也可以自己定一套,比如:

你定的格式举例好处代价
屏幕红色屏幕红色一看就懂,和"红色"区分得开打字长一点
屏:红色屏:红色短,前缀一目了然要打冒号,容易漏
S红S红最快别人看不懂,你自己过几天也忘

判断标准:别的同学不看说明,能不能猜到你的规则? 能猜到,这套格式就设计对了。

停下来想一个问题:同样是"红色"两个字,为什么控制灯要说"红色",控制屏幕要说"屏幕红色"?

因为板子收到一句话后要判断它是给谁的——我们在话里加个前缀来区分。这就是最简单的命令格式。规则是你定的:用 灯:红色、屏:绿色 也行,只要板子和你说好。

这引出本课最后、也最有用的东西——命令表。

七、命令表:板子里的"如果……否则"

把板子里的逻辑写成中文步骤,它会越来越像一张"表格":

启动时:
    以 115200 打开串口                      对应动作:Serial.begin
    初始化板载 RGB 灯(GPIO42)
    初始化屏幕
    打印"我醒了"                            对应动作:Serial.println

不断重复(每一小圈做下面几件事):
    如果按键刚被按下,而且已经消抖:
        按下次数加 1
        打印"按钮已按下,第 N 次"

    如果串口有话进来:                      对应动作:Serial.available
        一直读到换行,取出一整句             对应动作:Serial.readStringUntil
        去掉句子首尾的空格和换行

        如果这句话是"红色":
            设置灯为红色并发送
        否则如果这句话是"绿色":
            设置灯为绿色并发送
        否则如果这句话是"屏幕绿色":
            整块屏幕填成绿色
        否则如果这句话是"关闭":
            熄灭灯
        否则:
            打印"没听懂:这句话"

    短暂停顿一下,然后回到"不断重复"

命令表:板子里的一串「如果……否则」

请做两件事:

第一,遮住"否则:打印没听懂"一整块。假如删掉它,你发送"紫色"会怎样?用上面的步骤解释,不要猜。

第二,找一找:哪几行是板子说给电脑听的?哪几行是电脑说给板子听的?

这一整块"如果……否则如果……否则",就是命令表。你以后做遥控器、做菜单、做语音控制,用的都是这个结构——只是收到的命令来源不同:今天是串口,以后可能是蓝牙、WiFi 或语音识别出来的文字。

八、轮到你设计一套自己的命令

先想清三件事,再填空:

  1. 你想控制谁?(灯、屏幕,还是两个一起?)
  2. 每个命令叫什么名字?(要短、好记、不容易打错)
  3. 收到不认识的命令时,板子该怎么办?
请帮我把串口命令改成我自己设计的一套,保留按键汇报功能:
命令 1:输入"____",让____做____
命令 2:输入"____",让____做____
命令 3:输入"____",让____做____
收到不认识的内容时,打印"可用的命令有:……",把全部命令列出来。
用较低亮度,帮我修改并烧录。

最后那句"把全部命令列出来"是我特意加的——为什么?因为过几天你会忘记自己定过什么命令。让板子自己告诉你,比写在纸上可靠。这叫帮助信息,所有好用的软件都有。

完成后只改一个条件再验证一次:比如把"红色"改名叫"红灯",其它不动。先预测,再运行。

九、进阶:把板子变成小计算机

到这里,板子已经能听懂"红色""屏幕绿色"这种固定的话。可不可以让它听懂随便一个算式?

比如你发 12+34,它回 12+34 = 46。这就是一个真正的计算器了。

请给我这块板子的串口程序加一条"算数"功能:

我直接发送一个算式,板子就把结果算出来,按"原式 = 结果"的格式打印。
例如:
    我发 12+34      板子打印 12+34 = 46
    我发 7*8        板子打印 7*8 = 56
    我发 (1+2)*3    板子打印 (1+2)*3 = 9
    我发 10/4       板子打印 10/4 = 2.5

要支持的运算:
- 加 + 减 - 乘 * 除 / 四种都要;
- 要能算括号,括号可以嵌套,比如 ((1+2)*3)-4;
- 要能算小数,比如 3.5*2。

几条要求:
1. 除不尽的时候,保留 ___ 位小数(你自己定,参考 2 位);
2. 除以 0 的时候,板子要打印一句中文提示,这句话由你来定:
   "____"
3. 算式写错的时候(比如"1++2"、"苹果+1"),绝对不能让程序卡住或重启,
   要打印一句中文提示,这句话也由你来定:"____"
4. 屏幕上最多显示最近 ___ 条算式(你自己定,参考 1 条),要能看清;
5. 屏幕上用中文显示最近一次的算式和结果。

板子原来那几条命令(红色 / 绿色 / 屏幕绿色 / 关闭)要继续能用。
这里有个要想清楚的问题:**现在收到一句话,该先判断它是不是命令,还是先试着当算式算?**

提示:想想你发"红色"的时候会怎样——如果先当算式算,"红色"算不出来,
板子就会回一句"算式看不懂:红色",灯反而不会亮了。

请用中文注释;烧录前先运行 arduino-cli board list 核对端口;
另存一个新版本,保留旧程序。
想好了再点开:我们的参考值

这不是标准答案。 下面是我们试过的一套,你可以有自己的选择。

① 保留几位小数 —— 参考 2 位

  • 10/4 → 保留 2 位是 2.5;保留 6 位是 2.500000,屏幕上又挤又难读。
  • 10/3 → 保留 2 位是 3.33;保留 0 位就变成 3,看不出除不尽。

故意填成 0 位跑一次 10/3,看看结果差多少。

② 除以 0 说什么 —— 参考"不能除以 0"

这是数学上没答案的事。板子必须说点什么,不能沉默,也不能卡住。

③ 算式写错说什么 —— 参考"算式看不懂:__"

把原话带上很有用——你能立刻看出是自己打错了哪个字。

④ 屏幕显示几条 —— 参考 1 条

屏幕只有 240 像素宽,一条算式加结果就占掉大半。显示太多会挤成一片。

这里藏着本课最深的一句话

试完你会发现:板子并不"懂"数学。

它只是把收到的一串字符,按我们写好的规则一步一步处理:先找括号、再算乘除、最后算加减。真正在做判断的是你写的那套规则。

这也解释了一件事:为什么"1++2"这种写法它不认——因为你的规则里没有这一种。

串口收到的永远只是一串字符。是程序决定把它当命令、当算式,还是当一句听不懂的话。

想一想:如果只有 + - * / 而没有括号,1+2*3 该等于 7 还是 9?你打算让板子按什么顺序算?(这个顺序在数学里叫"运算优先级",是你要替板子定下来的规则。)

十、除了串口,还有哪两种"说话方式"

今天学的串口(UART) 是板子和电脑说话用的。但板子内部好几个芯片之间,用到的却是另外两种协议——I2C 和 SPI。它们仨是嵌入式世界里最常见的"三大通信协议",各有脾气。

三种说话方式:串口 / I2C / SPI

为什么要现在认识它们? 因为你这块板子上,屏幕、触摸、音频芯片全都在用它们——你早就用上了,只是不知道而已。而第 2 课"为什么触摸能提前借用"、第 3 课"15 万字节怎么送进屏幕",答案都在这一节。

先分清"跟谁说话"

  • 串口 UART:板子 ↔ 电脑/另一台板子,点对点,用两根线(TX/RX)。我们今天用它打字、发命令。
  • I2C:板子 ↔ 几个芯片一起,用两根线(SDA 数据 + SCL 时钟),靠地址区分是你跟哪个芯片说话。板子上的触摸屏、音频芯片就是走 I2C。
  • SPI:板子 ↔ 一个芯片主从连接,用四根线(SCLK 时钟 + MOSI + MISO + CS 片选),速度最快。板子上的2.8 寸屏幕就是走 SPI。

它们有什么不一样?

协议几根线要不要"时钟线"一次跟几个速度常见用途(我们板子上)
串口 UART2(TX、RX)不要(两边约好波特率)一对一中板子↔电脑(打字、发命令)
I2C2(SDA、SCL)要(SCL 打拍子)一对多(靠地址)慢触摸屏、音频芯片
SPI4(SCLK、MOSI、MISO、CS)要(SCLK 打拍子)一对一快2.8 寸屏幕、SD 存储卡

三个最容易搞混的点

  1. I2C 和 SPI 都"要时钟线",串口不要。 串口是两个人自己约定好节奏(波特率),没有时钟线;而 I2C/SPI 有一根专门的"时钟"线来打拍子,主机敲一下、从机走一步——所以它们不用约定波特率,速度由主机定。这也是为什么"I2C/SPI 更稳、串口会踩到波特率不对就乱码"。

  2. I2C 一根线挂多个芯片,靠"地址"区分;SPI 一个主只能带一个从(要多个就加"片选"线)。 这就像 I2C 是"一条走廊,每扇门有房间号",SPI 是"一对一专线,换成另一个就换条线"。

  3. 速度不一:SPI 最快(四根线,数据专线传输),I2C 最慢(两根线还要轮流说话),串口居中。

它们和"我们板子"的关系

  • 今天学的串口:让板子跟你(电脑) 说话。
  • SPI:让板子跟屏幕说话(你画的小方块、颜色,都是经 SPI 送进屏幕的——第 3 课"换一次颜色送多少数据"那个 15 万字节,就是走 SPI)。
  • I2C:让板子跟触摸和音频说话(按按钮、放音乐都是它)。

一句话:串口是"你和板子打电话",I2C 是"板子给屋里几个芯片发号施令"(一根线编房间号),SPI 是"板子和屏幕的专线高速快递"(四根线最快)。三者各管一段,谁也替代不了谁。

留给你的问题:为什么今天学串口用"波特率"约定节奏,而第 3 课屏幕走 SPI 却不用约定波特率?试着用"有没有专门的时钟线"去回答。


十一、板子没有回应?这样提问

遇到问题用这个模板,把空白换成真实记录:

我想让板子____,实际却是____。
我用的串口号是____,波特率是____,软件显示的连接状态是____。
我点发送的内容是:____。
接收区显示的是:____(完全空白就写"什么都没有")。
请帮我查原因,一次告诉我检查一件事,等我反馈再继续。

高频原因先自查:

现象先检查
接收区一片空白串口号选对了吗?烧录后端口会变,按刷新重选
收到一堆乱码方块波特率是否一致;板子是否正在重启
点发送没反应勾了"发送后加换行"吗?程序是不是在等换行符

"灯没有亮"是观察,"程序没收到"是推测。 推测要用实验验证。

十二、自检小测

先自己想,再点开对答案。

1. TX 和 RX 各管什么方向?为什么需要 GND?

TX 是发送(板子往外说),RX 是接收(别人说给板子)。需要共地(GND),两边对"高/低"的理解才一致。

2. 波特率是什么?两边不一致通常会怎样?

波特率是每秒传送多少个基本信号单元。两边数得不一样快通常会产生乱码。但我们这块板是 USB CDC,波特率数字很多时候只是"记账标签",改成 9600 也不一定乱码——以实测为准。

3. 为什么烧录前要关闭串口小助手?

一个串口同时只能被一个程序占用。小助手开着,WorkBuddy 就烧不进去(报 port is busy)。烧录后 COM 口号可能变,要刷新重选。

4. Serial.println() 和 Serial.readStringUntil() 分别是干什么的?

println 是"说":往电脑发一行字(带换行)。readStringUntil 是"听":一直读到换行符,把一整句话取回来。

5. 命令表里"否则"那一块有什么用?删掉会怎样?

"否则"处理所有没列出来的内容——比如打印"没听懂"。删掉后,遇到不认识的命令,板子就什么都不做,你也搞不清它收到没有。

6. "红色"两个汉字在线上是以汉字形式跑的吗?

不是。线路上只有高低电平(数字),每个字按 UTF-8 编码变成一串数字传过去,接收方按同一套规则还原成汉字。

7. 关掉串口小助手,板子还在运行吗?打印的字去哪了?

板子照常运行,只是没人听。数据发出去没有接收方,就丢掉了——日志只有在你看着的时候才有意义。

8. 串口、I2C、SPI 三种通信方式,分别用在我们板子的哪里?最大的区别是什么?

串口 UART:板子 ↔ 电脑,两根线(TX/RX),不用时钟线(靠波特率约定节奏)。 I2C:接触摸屏和音频芯片,两根线(SDA/SCL),有时钟线,一根线挂多个芯片、靠地址区分。 SPI:接2.8 寸屏幕和 TF 卡,四根线(SCLK/MOSI/MISO/CS),有时钟线,速度最快,一对一。

最大区别:串口没有专门的时钟线(两边自己约好节奏),I2C/SPI 有时钟线(主机敲一下、从机走一步,所以不用约定波特率)。

9. 第 3 课说"整屏换色要送 153,600 字节",这批数据是走哪条路进屏幕的?

走 SPI。屏幕是 SPI 设备(SCLK/MOSI/MISO/CS 四根线),第 3 课那个 15 万字节就是主控通过 SPI 送进屏幕的。串口是给"板子跟电脑说话"用的,跟屏幕没关系。

十三、还想玩点什么

方向可以描述给 AI 的效果值得继续想
打字机电脑打一句话,屏幕显示出来中文太长一行放不下怎么办?
数据记录仪每秒把按键次数发到电脑,存成文件一小时后数据有多大?
摩斯电码练习器按键长短记成点和划,板子翻成字母多长算"长"?标准谁定?
简易聊天室两块板 TX/RX 交叉相连,互相收发不经过电脑,它们能直接说话吗?

想做"用语音控制灯"的同学,把想法记下来——语音识别出来是一串文字,把那串文字交给今天这套命令表,就是语音控制台了。

下一课回到屏幕:把整屏的"一片色"拆开,只点亮其中的一个点——坐标、画线、画方框、画圆,都要从那个小小的点开始。

第 4 课 · 串口心跳

第 4 课 · 串口心跳

板子开机先报个到,然后每秒说一次"我还活着"。

04串口入门
第 4 课 · 按一下,汇报一次

第 4 课 · 按一下,汇报一次

按下 BOOT,板子就在串口里报告"按钮已按下,第 N 次"。

04串口按键
第 4 课 · 发一句话控制灯

第 4 课 · 发一句话控制灯

在串口小助手里发"红色 / 绿色 / 蓝色 / 关闭",板载 RGB 灯就照着做。

04串口命令LED
第 4 课 · 发一句话控制屏幕

第 4 课 · 发一句话控制屏幕

发"屏幕红色 / 屏幕绿色 / 屏幕蓝色 / 清屏",整块屏幕就换颜色。

04串口命令屏幕
第 4 课 · 把板子变成小计算机

第 4 课 · 把板子变成小计算机

直接发一个算式(如 (1+2)*3),板子就把结果算出来,支持括号、小数、加减乘除。

04串口案例计算