你好,我是吴老师。
这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。
读完之后,你应该能:说出 TX、RX 各管什么方向、为什么烧录前要关闭串口;解释波特率是什么,并说出本板"改了波特率却不乱码"的原因;让板子汇报按键、听懂你的命令;设计一套自己的命令表;说出串口、I2C、SPI 三种通信方式各自用在哪、差在哪。
用时:基础实验 60–90 分钟;自制命令表与两个案例另留 30–40 分钟(可分两次做)。准备:板子、数据线、已经接入板卡 Skill 的 WorkBuddy——串口小助手不用提前准备,第五节我们会让 AI 现场给你造一个。
一、前三课,板子一直很沉默
回头看看我们做过的东西:第 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 自带的界面工具)。大概过程是:
- 先问你要装在哪个位置、用不用某个库;
- 写一个
.py文件保存到桌面; - 帮你打开它——你会看到一个窗口。
它可能需要先装库。如果 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:输入"____",让____做____
收到不认识的内容时,打印"可用的命令有:……",把全部命令列出来。
用较低亮度,帮我修改并烧录。
最后那句"把全部命令列出来"是我特意加的——为什么?因为过几天你会忘记自己定过什么命令。让板子自己告诉你,比写在纸上可靠。这叫帮助信息,所有好用的软件都有。
完成后只改一个条件再验证一次:比如把"红色"改名叫"红灯",其它不动。先预测,再运行。
九、进阶:把板子变成小计算机
到这里,板子已经能听懂"红色""屏幕绿色"这种固定的话。可不可以让它听懂随便一个算式?
比如你发 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。它们仨是嵌入式世界里最常见的"三大通信协议",各有脾气。
为什么要现在认识它们? 因为你这块板子上,屏幕、触摸、音频芯片全都在用它们——你早就用上了,只是不知道而已。而第 2 课"为什么触摸能提前借用"、第 3 课"15 万字节怎么送进屏幕",答案都在这一节。
先分清"跟谁说话"
- 串口 UART:板子 ↔ 电脑/另一台板子,点对点,用两根线(TX/RX)。我们今天用它打字、发命令。
- I2C:板子 ↔ 几个芯片一起,用两根线(SDA 数据 + SCL 时钟),靠地址区分是你跟哪个芯片说话。板子上的触摸屏、音频芯片就是走 I2C。
- SPI:板子 ↔ 一个芯片主从连接,用四根线(SCLK 时钟 + MOSI + MISO + CS 片选),速度最快。板子上的2.8 寸屏幕就是走 SPI。
它们有什么不一样?
| 协议 | 几根线 | 要不要"时钟线" | 一次跟几个 | 速度 | 常见用途(我们板子上) |
|---|---|---|---|---|---|
| 串口 UART | 2(TX、RX) | 不要(两边约好波特率) | 一对一 | 中 | 板子↔电脑(打字、发命令) |
| I2C | 2(SDA、SCL) | 要(SCL 打拍子) | 一对多(靠地址) | 慢 | 触摸屏、音频芯片 |
| SPI | 4(SCLK、MOSI、MISO、CS) | 要(SCLK 打拍子) | 一对一 | 快 | 2.8 寸屏幕、SD 存储卡 |
三个最容易搞混的点
-
I2C 和 SPI 都"要时钟线",串口不要。 串口是两个人自己约定好节奏(波特率),没有时钟线;而 I2C/SPI 有一根专门的"时钟"线来打拍子,主机敲一下、从机走一步——所以它们不用约定波特率,速度由主机定。这也是为什么"I2C/SPI 更稳、串口会踩到波特率不对就乱码"。
-
I2C 一根线挂多个芯片,靠"地址"区分;SPI 一个主只能带一个从(要多个就加"片选"线)。 这就像 I2C 是"一条走廊,每扇门有房间号",SPI 是"一对一专线,换成另一个就换条线"。
-
速度不一: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 交叉相连,互相收发 | 不经过电脑,它们能直接说话吗? |
想做"用语音控制灯"的同学,把想法记下来——语音识别出来是一串文字,把那串文字交给今天这套命令表,就是语音控制台了。
下一课回到屏幕:把整屏的"一片色"拆开,只点亮其中的一个点——坐标、画线、画方框、画圆,都要从那个小小的点开始。