串口编程的分层思想
🔌 串口编程的分层思想
STC8H8K64U · 从字节到字符串 · 从硬件到应用
💡 核心结论:串口之所以分成字节层和字符串层,根本原因是——UART硬件只能处理"字节流",而人类程序需要处理"有意义的信息"。底层负责运输,上层负责理解。这并非STC8特有,而是计算机通信中一种非常普遍的分层思想。
📡 一、为什么串口天然先处理"字节"
串口(UART)的本质:一次只传 1 bit,8 个 bit 组成 1 个 byte,MCU 的串口寄存器一次也只收/发一个字节。
本质发送的是:
也就是 ASCII 里的 'A' = 65。串口硬件根本不知道"字符串"是什么,它只知道一个字节、一个字节、再一个字节地发送。例如发送 Hello,实际就是 'H' 'e' 'l' 'l' 'o' 一个个字节依次发送。
🧠 二、为什么上层又出现"字符串处理"
因为人类不会按"字节"思考,而是按"信息"思考。硬件层只会搬运字节,而软件层需要把字节组织成"有意义的数据",这就自然形成了两层结构。
👤 人类想表达
温度=25
🔧 串口实际发送
温 度 = 2 5
🏗️ 三、典型的"两层结构"
🔹 第一层:字节层(驱动层)
负责:收/发一个字节、中断接收、判断是否收到数据
void UART_SendByte(char c);
关注:波特率、起始位、停止位、TI/RI标志位、缓冲区
🔸 第二层:字符串/协议层
负责:拼接多个字节、判断消息结束、解析命令、提取参数
{ LED = 1; }
关注:信息组织与语义理解
📦 四、为什么一定要分层?—— 邮递系统类比
因为"传输"和"意义"是两件不同的事情,这是计算机系统里非常核心的思想。
运输层(字节层)
邮车只负责把箱子运过去,不关心里面是书、水果、合同还是衣服。
业务层(字符串层)
人收到箱子后拆箱、分类、理解内容。
🔑 五、字符串本质是"字节流"
在 C 语言里:char str[] = "hello";
本质:
仍然只是字节数组。字符串其实就是——按某种规则组织起来的字节流,这一点非常重要。
🌊 六、串口传输的是"数据流",上层必须自己规定边界
串口不会告诉你"这里开始是一句话、这里结束",UART只有连续字节流。因此上层必须自己规定协议:
📌 方法1:结束符协议
看到 \r\n 认为一句结束,类似"句号"。
📌 方法2:长度协议
前面 05 表示后面有5字节,类似"包裹标签"。
📌 方法3:固定长度协议
工业通信中非常常见的方式。
🌐 七、类似情况:这种"两层结构"到处都是
GET /index.html。TCP不知道HTML、JSON、图片,只负责字节运输。fgetc() 一次读一个字符(字节),fgets() 按字符串读取。底层字节,上层文本。Serial.read() 读取一个字节,Serial.readString() 读取整个字符串。本质也是两层。🏛️ 八、更深层的本质:分层抽象(Layered Abstraction)
计算机科学最核心的思想之一 —— 不同层解决不同问题
🧩 九、为什么这是"人类认知规律"
人类处理复杂系统时,都会先处理"基础粒度",再组织成"高级意义":
语言
字母 → 单词 → 句子
音乐
音符 → 旋律 → 乐曲
编程
bit → byte → string → protocol → app
⚡ 十、实际单片机开发中的经典结构
很多 STC8 项目最终都会演变成这样的层次结构:
例如:AT+LED=ON → LED = 1; 这已经是"语言"到"动作"的转换过程。
总结
串口之所以分成字节层和字符串层,
根本原因是:
UART硬件只能处理"字节流",而人类程序需要处理"有意义的信息"
因此:
底层负责运输 🚛
上层负责理解 🧠
这其实是整个计算机系统最核心的分层思想之一。
STC8H8K64U 串口编程 · 分层架构思想 · 嵌入式系统设计核心
本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!