<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>ikn0w1T&#039;s blog - UART</title>
<link>https://blog.lihan.cyou/index.php/tag/UART/</link>
<atom:link href="https://blog.lihan.cyou/index.php/feed/tag/UART/" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description></description>
<lastBuildDate>Wed, 29 Oct 2025 10:36:00 +0800</lastBuildDate>
<pubDate>Wed, 29 Oct 2025 10:36:00 +0800</pubDate>
<item>
<title>UART串口通信简记</title>
<link>https://blog.lihan.cyou/index.php/archives/198/</link>
<guid>https://blog.lihan.cyou/index.php/archives/198/</guid>
<pubDate>Wed, 29 Oct 2025 10:36:00 +0800</pubDate>
<dc:creator>ikn0w1T</dc:creator>
<description><![CDATA[流程空闲时线路保持 高电平（逻辑 1）起始位,发送方先故意拉低 1 位时间（逻辑 0），这个低电平就是 “哨子”：“注意啦，我要开始发一个字节！”接收方检测到从高→低的跳变，立刻开始按约定波特率...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h2>流程</h2><ol><li>空闲时线路保持 <strong>高电平</strong>（逻辑 1）</li><li><strong>起始位</strong>,发送方先故意拉低 1 位时间（逻辑 0），这个低电平就是 “哨子”：“注意啦，我要开始发一个字节！”</li><li>接收方检测到从高→低的跳变，立刻开始按约定波特率采样后面的位。</li><li><strong>数据位</strong>+<strong>校验位</strong></li><li><strong>停止位</strong>，校验位之后再发 1~2 位高电平（逻辑 1），表示“本帧结束，线路恢复空闲”，如果接收方在预期位置没采样到高电平，就会报“帧错误（frame error）”。</li></ol><h2>波特率</h2><p><strong>常用值</strong>：4800 / 9600 / 115200</p><p>例如波特率9600表示每秒传 9600 个 <strong>bit</strong></p><p><strong>注意</strong>：通信双方必须设为一致</p><h2>校验位</h2><table><thead><tr><th>校验方式</th><th>规则</th><th>举例（发 0x35 = 0b0011\_0101）</th></tr></thead><tbody><tr><td><strong>偶校验</strong>(even)</td><td>整个帧（数据+校验）里 1 的个数 = 偶数</td><td>原数据有 4 个 1 → 校验位 = 0</td></tr><tr><td><strong>奇校验</strong>(odd)</td><td>1 的个数 = 奇数</td><td>同上 → 校验位 = 1</td></tr><tr><td><strong>0 校验</strong></td><td>校验位固定为 0</td><td>不用算，直接写 0</td></tr><tr><td><strong>1 校验</strong></td><td>校验位固定为 1</td><td>不用算，直接写 1</td></tr><tr><td><strong>无校验</strong></td><td>没有第 9 位，速度快，省 1 位时间</td><td>常见于现代高速 UART</td></tr></tbody></table><blockquote><ul><li>奇偶校验是为了使得数据+校验里的1的个数满足奇或偶，</li><li><strong>0 校验</strong> = “第 9 位必须是 0”——简单拉低检测；</li><li><strong>1 校验</strong> = “第 9 位必须是 1”——简单拉高检测；</li><li><strong>无校验</strong> = “根本没有第 9 位”——速度最快，错误交给上层。</li></ul></blockquote><h2>LSB&MSB</h2><p>LSB = Least Significant Bit<br>最低有效位 → 数值最小那一位 → 先发/先存<br>MSB = Most Significant Bit<br>最高有效位 → 数值最大那一位 → 后发/后存</p><h3>用 1 字节 0xB5 举例</h3><p>二进制：<code>1011 0101</code></p><table><thead><tr><th>位权</th><th>128</th><th>64</th><th>32</th><th>16</th><th>8</th><th>4</th><th>2</th><th>1</th></tr></thead><tbody><tr><td>值</td><td>1</td><td>0</td><td>1</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td></tr><tr><td>别名</td><td>MSB</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>LSB</td></tr></tbody></table><h4>UART 规定：先传 LSB，再传 MSB</h4><p>所以 0xB5 在 TXD 线上出现的顺序是：</p><pre><code>1  0  1  0  1  1  0  1
↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑
LSB              MSB
（时间从左→右）</code></pre><h4>内存/文件怎么存？</h4><p>小端（Little-Endian）：低地址存 LSB（x86、ARM Cortex-M）</p><p>大端（Big-Endian）：低地址存 MSB（网络字节序、部分 MCU）</p><h3>例：16 位数值 0x1234</h3><p>分组计算0001 0010 0011 0100，8位一字节存储。</p><table><thead><tr><th>地址</th><th>小端</th><th>大端</th></tr></thead><tbody><tr><td>0x00</td><td>0x34 (LSB)</td><td>0x12 (MSB)</td></tr><tr><td>0x01</td><td>0x12 (MSB)</td><td>0x34 (LSB)</td></tr></tbody></table><blockquote><ul><li><strong>LSB</strong>：数值最小，<strong>串口先发</strong>，小端先存。</li><li><strong>MSB</strong>：数值最大，<strong>串口后发</strong>，大端先存。</li></ul></blockquote>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.lihan.cyou/index.php/archives/198/#comments</comments>
<wfw:commentRss>https://blog.lihan.cyou/index.php/feed/tag/UART/</wfw:commentRss>
</item>
</channel>
</rss>