<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>不知名LZJ的博客</title>
        <link>https://www.mcoi.top/</link>
        <description>分享技术与经历 | 学习嵌入式ing</description>
        <lastBuildDate>Tue, 15 Sep 2026 06:30:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>All rights reserved 2026, L_Z_J</copyright>
        <item>
            <title><![CDATA[【MatterChipTool环境】在Ubuntu下搭建python-matter-server、Chip-tool、chip-lighting-app 并简单运用]]></title>
            <link>https://www.mcoi.top/article/Post-matter-chiptool-ubuntu-python-matter-server-chip-lighting-app</link>
            <guid>https://www.mcoi.top/article/Post-matter-chiptool-ubuntu-python-matter-server-chip-lighting-app</guid>
            <pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[在 Ubuntu 上搭建 Matter 开发与测试环境：python-matter-server、Chip-tool、chip-lighting-app 的安装与基本使用。]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-31ce940c69bb8019a1b9f82a3b138a78"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><blockquote class="notion-quote notion-block-31ce940c69bb81f499f5cce017dac0d8"><div>子系统配置为：<a class="notion-link" href="/31ce940c69bb80e2b748d00796d4e47b">在Windows11环境下配置WSL Ubuntu24.04子系统</a>， 也可以使用虚拟机例如VMware等</div></blockquote><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-31ce940c69bb81ddb6ebc4038bb2dbe5" data-id="31ce940c69bb81ddb6ebc4038bb2dbe5"><span><div id="31ce940c69bb81ddb6ebc4038bb2dbe5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81ddb6ebc4038bb2dbe5" title="Python Matter 服务器配置"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Python Matter 服务器配置</span></span></h2><blockquote class="notion-quote notion-block-31ce940c69bb81458099f239bf02c222"><div><b>写在前面</b></div><div class="notion-text notion-block-31ce940c69bb81328c24fed4d2d3a83e"><b>注意今后每次开启服务器时都需要先进入虚拟环境</b></div></blockquote><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81cfafc2cbfce4f28579" data-id="31ce940c69bb81cfafc2cbfce4f28579"><span><div id="31ce940c69bb81cfafc2cbfce4f28579" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81cfafc2cbfce4f28579" title="步骤 1：创建并激活虚拟环境"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">步骤 1：创建并激活虚拟环境</span></span></h3><div class="notion-text notion-block-31ce940c69bb8102b20cfe80ef175530">安装 Python 虚拟环境、pip 和（理论上）蓝牙支持：</div><div class="notion-text notion-block-31ce940c69bb812a8fe1cefc121c6512">验证一下蓝牙（多半是没有设备的，这是预期现象）：</div><div class="notion-text notion-block-31ce940c69bb81dd88f4c29af56c0cbb">创建并激活虚拟环境：</div><div class="notion-text notion-block-31ce940c69bb81abbaf1e98d33a663a7">激活后，命令行前面会有前缀：</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81619c4dc398740d7b2e" data-id="31ce940c69bb81619c4dc398740d7b2e"><span><div id="31ce940c69bb81619c4dc398740d7b2e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81619c4dc398740d7b2e" title="步骤 2：升级 pip"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">步骤 2：升级 pip</span></span></h3><div class="notion-text notion-block-31ce940c69bb8172a35cedb37404ace7">虚拟环境就位后，先升级 pip：</div><div class="notion-text notion-block-31ce940c69bb81fd917ef7a33a3d935a">此时使用的是虚拟环境里的 <code class="notion-inline-code">pip</code>，不会影响系统全局环境。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb816cb0f5ddcb0a71029b" data-id="31ce940c69bb816cb0f5ddcb0a71029b"><span><div id="31ce940c69bb816cb0f5ddcb0a71029b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb816cb0f5ddcb0a71029b" title="步骤 3：安装 python-matter-server"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">步骤 3：安装 python-matter-server</span></span></h3><div class="notion-text notion-block-31ce940c69bb810d8526cf98f777e4ed">安装核心包：</div><div class="notion-text notion-block-31ce940c69bb8192ba04cb170041d961">安装成功后，可执行文件在虚拟环境的 <code class="notion-inline-code">bin</code> 目录下，确认一下路径：</div><hr class="notion-hr notion-block-31ce940c69bb811d847df6f70b421c2f"/><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb8101a299fabbc7dca088" data-id="31ce940c69bb8101a299fabbc7dca088"><span><div id="31ce940c69bb8101a299fabbc7dca088" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb8101a299fabbc7dca088" title="步骤 4：一次性补齐 Python 依赖"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">步骤 4：一次性补齐 Python 依赖</span></span></h3><div class="notion-text notion-block-31ce940c69bb81b0b6cfed04ce58d2b8">实际运行过程中，<code class="notion-inline-code">matter-server</code> 会在导入阶段不断暴露出缺少的模块。最开始我是通过多次执行 <code class="notion-inline-code">matter-server --help</code>，一个个看缺什么再装什么，依次踩到了：</div><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81aba5a9ddb50ee8a9fe"><li><code class="notion-inline-code">cryptography</code></li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb8150bcd1f13570563d54"><li><code class="notion-inline-code">chip.exceptions</code>（来自 <code class="notion-inline-code">home-assistant-chip-core</code>）</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81a99a8fd411cbff0e30"><li><code class="notion-inline-code">zeroconf</code></li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81649a3fc911ead57e2d"><li><code class="notion-inline-code">atomicwrites</code></li></ul><div class="notion-text notion-block-31ce940c69bb81a9b80ff250b11bde8d"><b>为了让后来的人少走弯路，可以直接一次性补齐这些依赖：</b></div><div class="notion-text notion-block-31ce940c69bb8173b81de82a68855596">依赖全部装完后，可以先试：</div><div class="notion-text notion-block-31ce940c69bb819fb82fd8208dd61fa9">如果能正常输出 Usage/Options 帮助，而不是 <code class="notion-inline-code">ModuleNotFoundError</code>，说明 Python 层依赖已经齐了。</div><hr class="notion-hr notion-block-31ce940c69bb8190b7cef19623ad2352"/><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81f485bff6e8cbd3acda" data-id="31ce940c69bb81f485bff6e8cbd3acda"><span><div id="31ce940c69bb81f485bff6e8cbd3acda" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81f485bff6e8cbd3acda" title="步骤 5：补充系统库依赖（libnl）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">步骤 5：补充系统库依赖（libnl）</span></span></h3><div class="notion-text notion-block-31ce940c69bb81689010ee154697de5e">启动时，底层 CHIP 栈会加载一些系统动态库。如果缺失，会看到类似这样的错误：</div><div class="notion-text notion-block-31ce940c69bb812d9ba4f4cd9384949b">这说明缺少 Netlink 相关的系统库。直接在 Ubuntu/WSL 中安装：</div><div class="notion-text notion-block-31ce940c69bb814b80ddebd890a48ebc">安装完成后，可以确认一下库文件是否存在：</div><div class="notion-text notion-block-31ce940c69bb819e8056d83893e395e0">到这里，底层系统库就准备好了。</div><hr class="notion-hr notion-block-31ce940c69bb81b8a0a7cea08d0d266f"/><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81169fb3f64e1edb908b" data-id="31ce940c69bb81169fb3f64e1edb908b"><span><div id="31ce940c69bb81169fb3f64e1edb908b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81169fb3f64e1edb908b" title="步骤 6：解决 CHIP 在 /data 下写配置失败的问题"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">步骤 6：解决 CHIP 在 <code class="notion-inline-code">/data</code> 下写配置失败的问题</span></span></h3><div class="notion-text notion-block-31ce940c69bb815185b2c8742c76e1a0">系统库装好后，再次启动 <code class="notion-inline-code">matter-server</code>，会看到 CHIP 栈开始初始化失败：</div><div class="notion-text notion-block-31ce940c69bb81deace8d7282021d1f4">核心问题是：CHIP 试图在 <code class="notion-inline-code">/data</code> 目录下写入 <code class="notion-inline-code">chip_factory.ini</code>，但默认的 WSL Ubuntu 并不存在 <code class="notion-inline-code">/data</code> 这个目录，导致初始化失败。</div><div class="notion-text notion-block-31ce940c69bb81da8edede85eef80f71">一个简单粗暴、实测有效的解决方案：把 <code class="notion-inline-code">/data</code> 软链接到我们自己的配置目录 <code class="notion-inline-code">~/.matter_server</code>。</div><div class="notion-text notion-block-31ce940c69bb814fa4fae175dae9e721">先确保存储路径存在：</div><div class="notion-text notion-block-31ce940c69bb81e88c14d5ef1e171d57">然后创建软链接：</div><div class="notion-text notion-block-31ce940c69bb8197b0f3f40c7665d51a">检查一下链接是否正确：</div><div class="notion-text notion-block-31ce940c69bb81d78ec9da5113d5f328">这样，当 CHIP 再次尝试访问 <code class="notion-inline-code">/data/chip_factory.ini</code> 时，实际就会落在 <code class="notion-inline-code">~/.matter_server/chip_factory.ini</code>，文件可以正常创建，栈也能顺利初始化。</div><hr class="notion-hr notion-block-31ce940c69bb8100a286ca6dcf023dbc"/><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81cba34df9ff27f80c49" data-id="31ce940c69bb81cba34df9ff27f80c49"><span><div id="31ce940c69bb81cba34df9ff27f80c49" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81cba34df9ff27f80c49" title="步骤 7：正式启动 matter-server"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">步骤 7：正式启动 matter-server</span></span></h3><div class="notion-text notion-block-31ce940c69bb81d1adb5ce8665e5270c">准备好目录之后，就可以正式启动了：</div><div class="notion-text notion-block-31ce940c69bb810f9d64fdd3c5d120b0">参数说明：</div><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81f6b698f6ebadd1416e"><li><code class="notion-inline-code">-storage-path ~/.matter_server</code>：用于保存配网信息、证书等持久化数据；</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81d08f09f298da0bba17"><li><code class="notion-inline-code">-port 5580</code>：<code class="notion-inline-code">matter-server</code> 暴露的 HTTP / WebSocket 端口；</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81979555e39c02398e77"><li><code class="notion-inline-code">-log-level DEBUG</code>：开启详细日志，方便调试。</li></ul><blockquote class="notion-quote notion-block-31ce940c69bb81f5b1ded1fcd45b94f4"><div>• 注意：新版本已经不支持旧文中的 <code class="notion-inline-code">-v</code> 参数，使用 <code class="notion-inline-code">--log-level</code> 代替。</div></blockquote><div class="notion-text notion-block-31ce940c69bb8185865fe39db250d12f">如果一切正常，此时你会在终端看到类似下面的输出，并且不会再出现 traceback / core dumped：</div><div class="notion-text notion-block-eb865053ab3e4b77ae88d30d5a823d4e">2025-12-01 17:xx:<a class="notion-link" href="http://xx.xxx" target="_blank" rel="noopener noreferrer">xx.xxx</a> (MainThread) DEBUG [matter_server.server.stack] Using storage file: ~/.matter_server/chip.json - Bluetooth commissioning enabled: NO</div><div class="notion-text notion-block-282c4c93e4254c8f91847ddd3dc41947">[...... 后面是 CHIP:CTL / CHIP:DL 等日志 ......]</div><div class="notion-text notion-block-ccaed11e9e154184b321587ecd7d8677">source ~/matter-python-server/bin/activate</div><div class="notion-text notion-block-e5c9d781a1dd450c807000c46aae4f88">curl -v <a class="notion-link" href="http://127.0.0.1:5580/" target="_blank" rel="noopener noreferrer">http://127.0.0.1:5580/</a></div><div class="notion-text notion-block-48e09e7027c74d0aa6bdb4706f8f3518">sudo apt update</div><div class="notion-text notion-block-bafb62aace444ab98f9d24154494d591">sudo apt install -y git gcc g++ pkg-config libssl-dev libdbus-1-dev \<div class="notion-text-children"><div class="notion-text notion-block-6afbd0aec8864585b00f60bc0493f0db">libglib2.0-dev libavahi-client-dev ninja-build python3-venv \</div><div class="notion-text notion-block-276a6c321cd04dad882ee03e72da4f62">python3-dev python3-pip unzip libgirepository1.0-dev libcairo2-dev \</div><div class="notion-text notion-block-12513335d4304cc38006a2226f8f02dd">libreadline-dev libncurses-dev</div></div></div><div class="notion-text notion-block-078c3f613920431aa4196ef60b97bd59">cd ~</div><div class="notion-text notion-block-dba2f3cbe51847849d79553bb2517cc1">git clone <a class="notion-link" href="https://github.com/project-chip/connectedhomeip.git" target="_blank" rel="noopener noreferrer">https://github.com/project-chip/connectedhomeip.git</a></div><div class="notion-text notion-block-e3daa04f670e482c89cc4d616b106431">cd connectedhomeip</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-5a84c6476b524c4180921bfbbbb95d0f" data-id="5a84c6476b524c4180921bfbbbb95d0f"><span><div id="5a84c6476b524c4180921bfbbbb95d0f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#5a84c6476b524c4180921bfbbbb95d0f" title="初始化/拉依赖（第一次会稍久）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">初始化/拉依赖（第一次会稍久）</span></span></h2><div class="notion-text notion-block-8d352686ec85421c9fde50f01c4a984b">source scripts/<a class="notion-link" href="http://bootstrap.sh" target="_blank" rel="noopener noreferrer">bootstrap.sh</a></div><div class="notion-text notion-block-95c100513b0f48a6b4bd0ada403ec16b">source scripts/<a class="notion-link" href="http://activate.sh" target="_blank" rel="noopener noreferrer">activate.sh</a></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-60fb481e53694b75bdc013e0b0239a4c" data-id="60fb481e53694b75bdc013e0b0239a4c"><span><div id="60fb481e53694b75bdc013e0b0239a4c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#60fb481e53694b75bdc013e0b0239a4c" title="--- 步骤 A: 编译 chip-tool (Matter 控制器) ---"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">--- 步骤 A: 编译 chip-tool (Matter 控制器) ---</span></span></h2><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-d8ba1ac9c30f425d98432db1a422134e" data-id="d8ba1ac9c30f425d98432db1a422134e"><span><div id="d8ba1ac9c30f425d98432db1a422134e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d8ba1ac9c30f425d98432db1a422134e" title="1. 在根目录生成构建配置"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. 在根目录生成构建配置</span></span></h2><div class="notion-text notion-block-d082411f401c485380057822a8180b1f">gn gen out/debug</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-adb77ea4d14142909ea976733fef1231" data-id="adb77ea4d14142909ea976733fef1231"><span><div id="adb77ea4d14142909ea976733fef1231" class="notion-header-anchor"></div><a class="notion-hash-link" href="#adb77ea4d14142909ea976733fef1231" title="2. 编译 chip-tool"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 编译 chip-tool</span></span></h2><div class="notion-text notion-block-74adeb296a5740b380cf2cf0b377fbaf">ninja -C out/debug chip-tool</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-4e2f1cbb71bf415db5c74946573f05fd" data-id="4e2f1cbb71bf415db5c74946573f05fd"><span><div id="4e2f1cbb71bf415db5c74946573f05fd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#4e2f1cbb71bf415db5c74946573f05fd" title="编译完成后，chip-tool 可执行文件位于：out/debug/chip-tool"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">编译完成后，chip-tool 可执行文件位于：out/debug/chip-tool</span></span></h2><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-356f8553d1934ce183817dcdbf95edf5" data-id="356f8553d1934ce183817dcdbf95edf5"><span><div id="356f8553d1934ce183817dcdbf95edf5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#356f8553d1934ce183817dcdbf95edf5" title="--- 步骤 B: 编译 chip-lighting-app (模拟灯泡设备) ---"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">--- 步骤 B: 编译 chip-lighting-app (模拟灯泡设备) ---</span></span></h2><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-e9693f5592ba4350a24d224ad98e67cd" data-id="e9693f5592ba4350a24d224ad98e67cd"><span><div id="e9693f5592ba4350a24d224ad98e67cd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#e9693f5592ba4350a24d224ad98e67cd" title="注意：示例应用需要进入对应的目录单独编译，不能直接在根目录编译"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">注意：示例应用需要进入对应的目录单独编译，不能直接在根目录编译</span></span></h2><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-b440b77c77a94e06b5c5eb6108e7f7f3" data-id="b440b77c77a94e06b5c5eb6108e7f7f3"><span><div id="b440b77c77a94e06b5c5eb6108e7f7f3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#b440b77c77a94e06b5c5eb6108e7f7f3" title="1. 进入 lighting-app 的 Linux 示例目录"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. 进入 lighting-app 的 Linux 示例目录</span></span></h2><div class="notion-text notion-block-818c264123d94e489e65acda17666feb">cd examples/lighting-app/linux</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2ded9bf42cb9455ebd52380bf769e3b5" data-id="2ded9bf42cb9455ebd52380bf769e3b5"><span><div id="2ded9bf42cb9455ebd52380bf769e3b5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2ded9bf42cb9455ebd52380bf769e3b5" title="2. 为该应用生成独立的构建配置 (这一步会在当前目录下生成一个新的 out/debug)"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 为该应用生成独立的构建配置 (这一步会在当前目录下生成一个新的 out/debug)</span></span></h2><div class="notion-text notion-block-c8591c64b98642f688f372a2eda5161b">gn gen out/debug</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-d0e7bc2363144f7b8fe54a1dcf61e332" data-id="d0e7bc2363144f7b8fe54a1dcf61e332"><span><div id="d0e7bc2363144f7b8fe54a1dcf61e332" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d0e7bc2363144f7b8fe54a1dcf61e332" title="3. 开始编译"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">3. 开始编译</span></span></h2><div class="notion-text notion-block-de0b1cc3cbb5469e92864cf6358e3641">ninja -C out/debug</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-3a9f1bea99154e84b574c521454bd511" data-id="3a9f1bea99154e84b574c521454bd511"><span><div id="3a9f1bea99154e84b574c521454bd511" class="notion-header-anchor"></div><a class="notion-hash-link" href="#3a9f1bea99154e84b574c521454bd511" title="编译完成后，模拟灯泡的可执行文件位于："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">编译完成后，模拟灯泡的可执行文件位于：</span></span></h2><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2c213d3572544f159cfd34538b187093" data-id="2c213d3572544f159cfd34538b187093"><span><div id="2c213d3572544f159cfd34538b187093" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2c213d3572544f159cfd34538b187093" title="examples/lighting-app/linux/out/debug/chip-lighting-app"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">examples/lighting-app/linux/out/debug/chip-lighting-app</span></span></h2><div class="notion-text notion-block-6203459ad7cc45dd9b1f60b8c4ebc527">cd ~/connectedhomeip</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-125e336779464e70b45415c786a15096" data-id="125e336779464e70b45415c786a15096"><span><div id="125e336779464e70b45415c786a15096" class="notion-header-anchor"></div><a class="notion-hash-link" href="#125e336779464e70b45415c786a15096" title="把 .gitmodules 中所有 https://github.com/ 替换为代理前缀"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">把 .gitmodules 中所有 <a class="notion-link" href="https://github.com/" target="_blank" rel="noopener noreferrer">https://github.com/</a> 替换为代理前缀</span></span></h2><div class="notion-text notion-block-1f19e9b89ffd419cbd3c38360f382ebc">sed -i &#x27;s|<a class="notion-link" href="https://github.com/|https://hk.gh-proxy.org/https://github.com/|g" target="_blank" rel="noopener noreferrer">https://github.com/|https://hk.gh-proxy.org/https://github.com/|g</a>&#x27; .gitmodules<div class="notion-text-children"></div></div><div class="notion-text notion-block-9b97782578db4979adf9a0d1db8a9db1">grep -A2 &#x27;submodule &quot;pigweed&quot;&#x27; .gitmodules</div><div class="notion-text notion-block-1c02872c59c3401ba3146cebf2b26a04">grep -A2 &#x27;submodule &quot;qrcode&quot;&#x27; .gitmodules<div class="notion-text-children"></div></div><div class="notion-text notion-block-8eda42f585ec4279ab5c0d3a49362eea">[submodule &quot;qrcode&quot;]path = examples/common/QRCode/repourl = <a class="notion-link" href="https://hk.gh-proxy.org/https://github.com/nayuki/QR-Code-generator.git" target="_blank" rel="noopener noreferrer">https://hk.gh-proxy.org/https://github.com/nayuki/QR-Code-generator.git</a></div><div class="notion-text notion-block-5fb7a6cae8b54c1eaaaae0d233f97556">[submodule &quot;pigweed&quot;]path = third_party/pigweed/repourl = <a class="notion-link" href="https://hk.gh-proxy.org/https://github.com/google/pigweed.git" target="_blank" rel="noopener noreferrer">https://hk.gh-proxy.org/https://github.com/google/pigweed.git</a><div class="notion-text-children"></div></div><div class="notion-text notion-block-f8b41e5630cd42f88dd931870a23553a">git submodule sync<div class="notion-text-children"></div></div><div class="notion-text notion-block-c0ea7e65da8540a5a55641c53ef10b15">git submodule update --init --recursive<div class="notion-text-children"></div></div><div class="notion-text notion-block-14e229a7592d4b85adb178f3516bf0f3">pip install pproxy</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-fcaedc4b08924e1c9de8b69305dfef1c" data-id="fcaedc4b08924e1c9de8b69305dfef1c"><span><div id="fcaedc4b08924e1c9de8b69305dfef1c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#fcaedc4b08924e1c9de8b69305dfef1c" title="启动转换：将本机的 8888 端口转发到 VPN 的 1080 端口"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">启动转换：将本机的 8888 端口转发到 VPN 的 1080 端口</span></span></h2><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-61c175a785ca4522ab1dd95da9b77bd8" data-id="61c175a785ca4522ab1dd95da9b77bd8"><span><div id="61c175a785ca4522ab1dd95da9b77bd8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#61c175a785ca4522ab1dd95da9b77bd8" title="注意：请根据你实际的 VPN 端口修改 1080"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">注意：请根据你实际的 VPN 端口修改 1080</span></span></h2><div class="notion-text notion-block-d334f0d46bdc4683aee2c2cf1e2118e6">pproxy -l http://:8888 -r socks5://127.0.0.1:1080 -v<div class="notion-text-children"></div></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-5688fd032d704479a3d96788a0097f5d" data-id="5688fd032d704479a3d96788a0097f5d"><span><div id="5688fd032d704479a3d96788a0097f5d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#5688fd032d704479a3d96788a0097f5d" title="设置环境变量强制走代理 (指向刚才 pproxy 设置的 8888 端口)"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">设置环境变量强制走代理 (指向刚才 pproxy 设置的 8888 端口)</span></span></h2><div class="notion-text notion-block-2fd58df7bd41475698a16b8686d86d2e">export http_proxy=&quot;<a class="notion-link" href="http://127.0.0.1:8888" target="_blank" rel="noopener noreferrer">http://127.0.0.1:8888</a>&quot;</div><div class="notion-text notion-block-18028a363f7a4b52b4af701c5552d26f">export https_proxy=&quot;<a class="notion-link" href="http://127.0.0.1:8888" target="_blank" rel="noopener noreferrer">http://127.0.0.1:8888</a>&quot;</div><div class="notion-text notion-block-3631351b7f174643a15bdb982f96d2c2">export all_proxy=&quot;<a class="notion-link" href="http://127.0.0.1:8888" target="_blank" rel="noopener noreferrer">http://127.0.0.1:8888</a>&quot;</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-b4e8ef96967244fb86b47d1c35716363" data-id="b4e8ef96967244fb86b47d1c35716363"><span><div id="b4e8ef96967244fb86b47d1c35716363" class="notion-header-anchor"></div><a class="notion-hash-link" href="#b4e8ef96967244fb86b47d1c35716363" title="防止代理本地流量"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">防止代理本地流量</span></span></h2><div class="notion-text notion-block-870a7c0ba95a455b820501a414d25d2c">export no_proxy=&quot;<a class="notion-link" href="http://localhost" target="_blank" rel="noopener noreferrer">localhost</a>,127.0.0.1,::1&quot;</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-fa4733cad83d4c6784706ef7adf2f595" data-id="fa4733cad83d4c6784706ef7adf2f595"><span><div id="fa4733cad83d4c6784706ef7adf2f595" class="notion-header-anchor"></div><a class="notion-hash-link" href="#fa4733cad83d4c6784706ef7adf2f595" title="验证网络 (应返回 200 OK)"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">验证网络 (应返回 200 OK)</span></span></h2><div class="notion-text notion-block-60ae97e3590b4660affa5d3699afa5d9">curl -I <a class="notion-link" href="https://www.google.com" target="_blank" rel="noopener noreferrer">https://www.google.com</a></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2508e02ccf4c402c906acc67ac9b0afa" data-id="2508e02ccf4c402c906acc67ac9b0afa"><span><div id="2508e02ccf4c402c906acc67ac9b0afa" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2508e02ccf4c402c906acc67ac9b0afa" title="配置 Git 代理"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">配置 Git 代理</span></span></h2><div class="notion-text notion-block-4637561d10264f88b6579dd24afdc917">git config --global http.proxy <a class="notion-link" href="http://127.0.0.1:8888" target="_blank" rel="noopener noreferrer">http://127.0.0.1:8888</a></div><div class="notion-text notion-block-fab01845bced4d4aad1f7e7410514b9b">git config --global https.proxy <a class="notion-link" href="http://127.0.0.1:8888" target="_blank" rel="noopener noreferrer">http://127.0.0.1:8888</a></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-dfc8876faff548d08ed323bab71e8cb6" data-id="dfc8876faff548d08ed323bab71e8cb6"><span><div id="dfc8876faff548d08ed323bab71e8cb6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#dfc8876faff548d08ed323bab71e8cb6" title="--- 开始初始化 ---"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">--- 开始初始化 ---</span></span></h2><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-9ad2debd51a8465fb780119971adb691" data-id="9ad2debd51a8465fb780119971adb691"><span><div id="9ad2debd51a8465fb780119971adb691" class="notion-header-anchor"></div><a class="notion-hash-link" href="#9ad2debd51a8465fb780119971adb691" title="这步会下载 Pigweed 环境和 CIPD 依赖，网速快的话约 5-10 分钟"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">这步会下载 Pigweed 环境和 CIPD 依赖，网速快的话约 5-10 分钟</span></span></h2><div class="notion-text notion-block-4a99583bb17947bcbdc8749cd5c2163c">source scripts/<a class="notion-link" href="http://bootstrap.sh" target="_blank" rel="noopener noreferrer">bootstrap.sh</a></div><div class="notion-text notion-block-90ea9ff813be4b219ea8e2093670f6d8">#注意后续取消代理<div class="notion-text-children"></div></div><div class="notion-text notion-block-19947e181fa84631a7baf9e13aec8bcc">ls ~/connectedhomeip/out/debug/chip-tool</div><div class="notion-text notion-block-9382338bc9464328a8c676926e8901e6">ls ~/connectedhomeip/examples/lighting-app/linux/out/debug/chip-lighting-app</div><div class="notion-text notion-block-7b57f8ebff1048c8a27d144c3c466e9e">cd ~/connectedhomeip/examples/lighting-app/linux</div><div class="notion-text notion-block-735e031bbd55458b886841be0fc88397">./out/debug/chip-lighting-app --discriminator 3840 --passcode 20202021</div><div class="notion-text notion-block-42adc0c4ee5d4df0854bf777405e66e7">Setup Pin Code ...: 20202021</div><div class="notion-text notion-block-4db03e1949e2498db4f6988716ac3de0">Setup Discriminator ...: 3840</div><div class="notion-text notion-block-639b4c3b18ff4ab8b9a3dfd41ede92f4">...</div><div class="notion-text notion-block-c63979571e8a49a8bb6e67d359ec5111">[SC] Waiting for PBKDF param request</div><div class="notion-text notion-block-9f3e923835af432ba1c3db98e7d75212">[DIS] CHIP minimal mDNS configured as &#x27;Commissionable node device&#x27;</div><div class="notion-text notion-block-f0f64be2f8c549da939df1759b900abc">cd ~/connectedhomeip</div><div class="notion-text notion-block-9771bbf974854476b5ea95bab3ce9ce2">source scripts/<a class="notion-link" href="http://activate.sh" target="_blank" rel="noopener noreferrer">activate.sh</a></div><div class="notion-text notion-block-7072918102814a09b77b18e1521ae659">./out/debug/chip-tool pairing onnetwork 1 20202021 \<div class="notion-text-children"><div class="notion-text notion-block-76bab72ddc8f442bb58b89856a135370">--paa-trust-store-path ~/connectedhomeip/credentials/development/paa-root-certs</div></div></div><div class="notion-text notion-block-f781c39a29404efc9d7ca3aeb693a5b3">[TOO] Secure Pairing Success</div><div class="notion-text notion-block-5dde7987624a41e08488ea9509af410f">[TOO] CASE establishment successful</div><div class="notion-text notion-block-ab97d92e43c54caebb62629a29b751a0">[CTL] Commissioning complete for node ID 0x0000000000000001: success</div><div class="notion-text notion-block-fabc4f3239ac4086ae57f1b0d2ccadc6">[TOO] Device commissioning completed with success</div><div class="notion-text notion-block-ac05faf3d9984855892d8bc161366bf7">开灯</div><div class="notion-text notion-block-4ac54543c5524b70b9f9d9447355be00">./out/debug/chip-tool onoff on 1 1</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-3950f738a3ad4e53a6edc77c30e30295" data-id="3950f738a3ad4e53a6edc77c30e30295"><span><div id="3950f738a3ad4e53a6edc77c30e30295" class="notion-header-anchor"></div><a class="notion-hash-link" href="#3950f738a3ad4e53a6edc77c30e30295" title="关灯"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关灯</span></span></h2><div class="notion-text notion-block-e2f6f716274e4484af03382b028c93ac">./out/debug/chip-tool onoff off 1 1</div><div class="notion-text notion-block-db1fc2a4823f4d79906168b79df60a07">[ZCL] Toggle ep1 on/off from state 0 to 1</div><div class="notion-text notion-block-736edfdbea6c43f481274c7b23db1a44">source ~/matter-python-server/bin/activate</div><div class="notion-text notion-block-5bf78f08f064450ea4813f1d0f9c6bc7">matter-server \<div class="notion-text-children"><div class="notion-text notion-block-e6a91e10f6b64759bdd358ba1e165a16">--storage-path ~/.matter_server \</div><div class="notion-text notion-block-e8d7e9b1c1964ad4bd22cad79e2adc61">--port 5580 \</div><div class="notion-text notion-block-ebfec61493a64cceba63d5b3fcd56c13">--log-level DEBUG</div></div></div><div class="notion-text notion-block-e2fd931619a64af0889ca0f0d9dec148">cd ~/connectedhomeip/examples/lighting-app/linux</div><div class="notion-text notion-block-19c6eb1d903247b985cf801ce6edb2f3">./out/debug/chip-lighting-app --discriminator 3840 --passcode 20202021<div class="notion-text-children"></div></div><div class="notion-text notion-block-60ea3fca97f945b586cbc01db74264b7">Setup Pin Code ...: 20202021</div><div class="notion-text notion-block-5f1a4bf08f004cf8a2f855d982e9d189">Setup Discriminator ...: 3840</div><div class="notion-text notion-block-60172756a81046e498688275f15fc17c">[DIS] CHIP minimal mDNS configured as &#x27;Commissionable node device&#x27;</div><div class="notion-text notion-block-3b7f4d72ec07453eb32700c5c50ac3ed">[SC] Waiting for PBKDF param request<div class="notion-text-children"></div></div><div class="notion-text notion-block-8517fb4762d6451aad38af8546092af6">rm -f /tmp/chip_*<div class="notion-text-children"></div></div><div class="notion-text notion-block-39df69b62b04464892206a0ea2bec532">ifconfig</div><div class="notion-text notion-block-4ad8316956f547e89d6e6aafdd3aa0fa"><a class="notion-link" href="http://172.22.133.5:5580/" target="_blank" rel="noopener noreferrer">http://172.22.133.5:5580/</a></div><div class="notion-text notion-block-c7b082e59c964e7bbfc66784a66a897b">CHIP_ERROR [chip.native.-] Unable to find PAA, err: ... CHIP Error 0x0000004A: CA certificate not found, PAI&#x27;s AKID: 6A:FD:22:77:1F:51:1F:EC:BF:16:41:97:67:10:DC:DC:31:A1:71:7E</div><div class="notion-text notion-block-eeeb5e912de34c05a465884c76f6e237">CHIP_ERROR [chip.native.CTL] Failed in verifying &#x27;Attestation Information&#x27; command received from the device: err 101 (PAA not found in DCL and/or local PAA trust store)</div><div class="notion-text notion-block-21f7afe96ea44960bd34ea7ac10429c0">CHIP_ERROR [chip.native.CTL] Error on commissioning step &#x27;AttestationVerification&#x27;: &#x27;... Failed Device Attestation&#x27;</div><div class="notion-text notion-block-f159d45831194ec0b3004513fb9c616c">cd ~/connectedhomeip/credentials/test/attestation</div><div class="notion-text notion-block-c0cf2c0b60354bb6b5537f789c140e3e">openssl x509 -in &quot;Chip-Test-PAA-FFF1-Cert.pem&quot; -noout -text | grep -A1 &quot;Subject Key Identifier&quot;</div><div class="notion-text notion-block-5257f367834e48989fb438e99dbd2234">X509v3 Subject Key Identifier:<div class="notion-text-children"><div class="notion-text notion-block-cc9ff029225f41c4a6f66618269a8145">6A:FD:22:77:1F:51:1F:EC:BF:16:41:97:67:10:DC:DC:31:A1:71:7E</div></div></div><div class="notion-text notion-block-eaed731042e548d8af13fbb801c2f576">cd ~/connectedhomeip/credentials/test/attestation</div><div class="notion-text notion-block-884a5d0780a3461cb3a0003ef75b9570">openssl x509 \<div class="notion-text-children"><div class="notion-text notion-block-ef85654787b84d4fbfa4e07e0a41947e">-in Chip-Test-PAA-FFF1-Cert.pem \</div><div class="notion-text notion-block-fb972377d66546d4a71f9882a777bda2">-outform der \</div><div class="notion-text notion-block-66507cd6328a4af286b2cd8849b96571">-out 6AFD22771F511FECBF1641976710DCDC31A1717E.der</div></div></div><div class="notion-text notion-block-1a09bb8a91b24e159351ba073bb75786">hexdump -C 6AFD22771F511FECBF1641976710DCDC31A1717E.der | head</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-073ef93d1aec4407a6d3ec23a0ed605c" data-id="073ef93d1aec4407a6d3ec23a0ed605c"><span><div id="073ef93d1aec4407a6d3ec23a0ed605c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#073ef93d1aec4407a6d3ec23a0ed605c" title="1. 建立中划线版本的默认目录"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. 建立中划线版本的默认目录</span></span></h2><div class="notion-text notion-block-4a05154115ab4b0d87cc4a911585ddfb">mkdir -p ~/.matter-server/paa-root-certs</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-d17cb84813944b619de16e79302650ad" data-id="d17cb84813944b619de16e79302650ad"><span><div id="d17cb84813944b619de16e79302650ad" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d17cb84813944b619de16e79302650ad" title="2. 把 DER 文件复制进去"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 把 DER 文件复制进去</span></span></h2><div class="notion-text notion-block-0affbf10924b4b31ac7fa59e05b5ed56">cp ~/connectedhomeip/credentials/test/attestation/6AFD22771F511FECBF1641976710DCDC31A1717E.der \<div class="notion-text-children"><div class="notion-text notion-block-1eb13e7048e844ca87a31ecee4ff4899">~/.matter-server/paa-root-certs/</div></div></div><div class="notion-text notion-block-b42cd27f55bc48b88e04c3a4fefc55b1">source ~/matter-python-server/bin/activate</div><div class="notion-text notion-block-f785d6bd700a4013ae9362c8c8c3f494">MATTER_PAA_ROOT_CERTS_DIR=~/.matter-server/paa-root-certs \</div><div class="notion-text notion-block-ccdd203b3c504b6fa3f9fb03f7a0feaf">matter-server \<div class="notion-text-children"><div class="notion-text notion-block-4304e1b5570a48879e1470601e9d5217">--storage-path ~/.matter_server \</div><div class="notion-text notion-block-5b6256fde7a54c49baf4dd2de9db8ad4">--port 5580 \</div><div class="notion-text notion-block-dc1d013592844e11b949b31647b666f0">--log-level DEBUG \</div><div class="notion-text notion-block-e1805d773a384a01a8bec20d57407470">--paa-root-cert-dir ~/.matter-server/paa-root-certs</div></div></div><ul class="notion-list notion-list-disc notion-block-8095c40e3d534d8f9f86a70cbc0293a5"><li>日志里不再有 <code class="notion-inline-code">Unable to find PAA</code>、<code class="notion-inline-code">CA certificate not found</code>、<code class="notion-inline-code">PAA not found in DCL and/or local PAA trust store</code>；</li></ul><ul class="notion-list notion-list-disc notion-block-6e50c24957a9497ba2a1c4f01a3f267a"><li>设备证明（AttestationVerification）成功，后续网络配置和访问控制步骤可以继续执行，灯泡最终成功“收进来”。</li></ul><div class="notion-text notion-block-f7f916357323498db4eb3e30ce817fe4">结果如图：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-42cd897a56ea4482b9382496a7a94481"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-matter-chiptool-ubuntu-python-matter-server-chip-lighting-app/82de4cb7-cd70-4db1-8580-a9e933540d06.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=42cd897a-56ea-4482-b938-2496a7a94481" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-5754956cc7384771a5c9a72fe542feb0"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-matter-chiptool-ubuntu-python-matter-server-chip-lighting-app/1869bfa3-e495-4fc6-a0e9-b6988e28ec54.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=5754956c-c738-4771-a5c9-a72fe542feb0" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-bf9a62be41ef499485876b7c21f999ad"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-matter-chiptool-ubuntu-python-matter-server-chip-lighting-app/8b5b9d0b-5858-4fd7-b55d-cc031dd7cc1e.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=bf9a62be-41ef-4994-8587-6b7c21f999ad" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-ddb2489174fa4a2c978a926ef070f2df"><b>由于Server是通过自身暴露的 API（REST/WebSocket/其它 RPC）由“客户端”（浏览器、自动化系统、Home Assistant 等）通过这些 API 去控制设备</b></div><div class="notion-text notion-block-172530b3ce2148f8a49f2fe21e55f121">所以。。。。。。。。。</div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[STM32-HAL库学习笔记]]></title>
            <link>https://www.mcoi.top/article/Post-stm32-hal</link>
            <guid>https://www.mcoi.top/article/Post-stm32-hal</guid>
            <pubDate>Tue, 01 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[学习STM32HAL库笔记]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2a9e940c69bb80cb9db7d32dd8e45ba1"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb80ed8c91cc584c634834"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">一个简单的开头</div></div><details class="notion-toggle notion-block-2a9e940c69bb81b9b7d6fd0c8a65fb0b"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb81b9b7d6fd0c8a65fb0b" data-id="2a9e940c69bb81b9b7d6fd0c8a65fb0b"><span><div id="2a9e940c69bb81b9b7d6fd0c8a65fb0b" class="notion-header-anchor"></div><span class="notion-h-title">介绍</span></span></h2></summary><div><div class="notion-text notion-block-2a9e940c69bb81379a42fd6a118c5f33">此笔记为观看B站UP：超子说物联网所写，感谢老师。老师的架构真的特别好！</div><div class="notion-text notion-block-2a9e940c69bb817db391cc61aca38f51">我在学习HAL库之前有标准库基础，所以学习稍快，但会尽量详细记录</div><div class="notion-text notion-block-2a9e940c69bb810b97a4d446eb19b7b0"><b>笔记和项目文件在gitee开源了</b></div><div class="notion-text notion-block-2a9e940c69bb8188a4eedf0e5e3509cc"><b>大家可以在</b><b><a class="notion-link" href="https://gitee.com/Xiao____liu/sm32--hal" target="_blank" rel="noopener noreferrer">我的gitee仓库</a></b><b> 中下载笔记源文件、STM32F1C8T6资料等</b></div><div class="notion-text notion-block-2a9e940c69bb817885c5d49912cc2a7e"><b>笔记源文件可以在Notion中导入</b></div><div class="notion-text notion-block-2a9e940c69bb814297e3f5f0fd7ae308">正在更新~</div><blockquote class="notion-quote notion-block-2a9e940c69bb813db77fce2425e8c225"><div>超子物联网 HAL库学习
写作不易，如果您觉得写的不错，欢迎给博主来一波点赞、收藏~让博主更有动力吧！</div></blockquote><details class="notion-toggle notion-block-2a9e940c69bb815d9a45d334a3b3ecda"><summary><h2 class="notion-h notion-h1 notion-block-2a9e940c69bb815d9a45d334a3b3ecda" data-id="2a9e940c69bb815d9a45d334a3b3ecda"><span><div id="2a9e940c69bb815d9a45d334a3b3ecda" class="notion-header-anchor"></div><span class="notion-h-title">内容导航</span></span></h2></summary><div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81958844ebd59c9d5a08"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143312537?sharetype=blogdetail&amp;sharerId=143312537&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：准备篇</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81c19403f752d92cddea"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143312804?sharetype=blogdetail&amp;sharerId=143312804&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：时钟篇</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81f0afd1da1e0f37a5e8"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143312972?spm=1001.2014.3001.5501" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：中断处理函数及weak弱声明中断回调函数详解</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81d7bb2ad1e8ca9ff7f0"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143313014?spm=1001.2014.3001.5501" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：GPIO篇</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8180ab3ed2026f9b5da9"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143374811?sharetype=blogdetail&amp;sharerId=143374811&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：串口篇：多指针定位+循环收发缓冲区方案设计</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb817b992ed0fc8ee87e64"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143598046?spm=1001.2014.3001.5501" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：串口篇</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81aca7d8dff1bc88d91d"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143662409?sharetype=blogdetail&amp;sharerId=143662409&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：定时器[基础定时]篇</a></li></ul></div></details><details class="notion-toggle notion-block-2a9e940c69bb81d2bf81f3c5715f79df"><summary><h2 class="notion-h notion-h1 notion-block-2a9e940c69bb81d2bf81f3c5715f79df" data-id="2a9e940c69bb81d2bf81f3c5715f79df"><span><div id="2a9e940c69bb81d2bf81f3c5715f79df" class="notion-header-anchor"></div><span class="notion-h-title">子页面开头</span></span></h2></summary><div><blockquote class="notion-quote notion-block-2a9e940c69bb816c9732f3bc5f74b201"><div>超子物联网 HAL库学习
汇总入口：<a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143312140?sharetype=blogdetail&amp;sharerId=143312140&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：[汇总]</a>
写作不易，如果您觉得写的不错，欢迎给博主来一波点赞、收藏~让博主更有动力吧！</div></blockquote></div></details><div class="notion-blank notion-block-2a9e940c69bb81748410de22b103aaeb"> </div></div></details><details class="notion-toggle notion-block-2a9e940c69bb8116a675ed0a95a31386"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb8116a675ed0a95a31386" data-id="2a9e940c69bb8116a675ed0a95a31386"><span><div id="2a9e940c69bb8116a675ed0a95a31386" class="notion-header-anchor"></div><span class="notion-h-title">准备篇</span></span></h2></summary><div><details class="notion-toggle notion-block-2a9e940c69bb81d09815e72a43d796b0"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb81d09815e72a43d796b0" data-id="2a9e940c69bb81d09815e72a43d796b0"><span><div id="2a9e940c69bb81d09815e72a43d796b0" class="notion-header-anchor"></div><span class="notion-h-title">1. HAL库简介</span></span></h3></summary><div><div class="notion-text notion-block-2a9e940c69bb8172b313d5498bd46b07"><b>HAL库</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81b0b2b6de276d219e1a"><li>HAL库（Hardware Abstraction Layer）是STMicroelectronics提供的STM32微控制器的硬件抽象层库。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb819dabf9e105908f79d7"><li>它通过一套统一的API接口，简化了对STM32外设的配置和操作，使开发者能够更快速地进行嵌入式系统开发，而不必深入了解底层硬件细节。</li></ul><div class="notion-text notion-block-2a9e940c69bb81b88e00cf221b5e959e"><b>HAL库的优点</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8129ba9fd8996d78a3ec"><li>高层次抽象：HAL库提供了高层次的抽象接口，简化了对硬件外设的操作。开发者可以通过调用库函数完成复杂的硬件配置，而不必直接操作寄存器。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb817a8daccf82387e3dc7"><li>易于使用：由于提供了丰富的库函数和示例代码，开发者可以快速上手进行开发，减少了开发时间。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8172b978c3b9eedb0bec"><li>一致性和移植性：HAL库在不同的STM32系列中保持了一致的API接口，增强了代码的移植性和重用性。如果需要更换STM32系列微控制器，代码的修改量较小。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb819ab6eac5f178e05dc3"><li>简化调试：由于HAL库屏蔽了底层的寄存器操作，调试过程中更容易定位和解决问题，减少了开发和维护的复杂性。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81269a49f7ce6d1e783f"><li>代码维护性好：HAL库的高层次封装和良好的代码结构使得代码更容易维护和更新。</li></ul><div class="notion-text notion-block-2a9e940c69bb8135b6acd73a90141f8d"><b>对比标准固件库的不同</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81639a26c31db570e905" style="list-style-type:decimal"><li><b>抽象层次：</b></li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb81639a26c31db570e905" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812a824bc06753a7e71b"><li>标准固件库：直接操作寄存器，提供底层硬件访问，要求开发者对STM32微控制器的寄存器有较深入的理解。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb815f9facd33653c24ab9"><li>HAL库：提供高层次的抽象接口，屏蔽底层寄存器操作，使开发者可以更快速地进行开发。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81edb7d6d8300d24d6c5" style="list-style-type:decimal"><li>代<b>码复杂性：</b></li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb81edb7d6d8300d24d6c5" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81869d16cfcfcba52359"><li>标准固件库：代码较复杂，涉及大量的寄存器配置，开发者需要处理更多的细节。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81ada9a8e9e393d4210b"><li>HAL库：代码简洁易读，通过调用库函数进行配置和操作，减少了代码量和复杂性。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81c9b722dc5e602151e2" style="list-style-type:decimal"><li><b>学习曲线：</b></li></ol><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8128a5b7c6e66dbc9a8e"><li>标准固件库：学习曲线较陡，需要花费较多时间了解和掌握硬件细节。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81cd8356f0d04c09cf81"><li>HAL库：学习曲线较缓，提供了丰富的示例代码和文档，开发者可以快速上手。</li></ul><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb810295a9f63638368a25" style="list-style-type:decimal"><li><b>开发效率：</b></li></ol><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81eaa8fac9f2e27a722c"><li>标准固件库：适合对性能和功耗有严格要求的项目，但开发和调试时间较长。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8193b0dfc267b435d6e5"><li>HAL库：提高了开发效率，适合快速开发和原型设计，缩短了开发周期。</li></ul><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81fa9782d6e9ed13a0d3" style="list-style-type:decimal"><li><b>移植性：</b></li></ol><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8160882ec8030df8c014"><li>标准固件库：不同系列的STM32微控制器之间存在较大的差异，代码移植工作量较大。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb814b904bc45cbd100852"><li>HAL库：提供一致的API接口，增强了代码的移植性和重用性，不同系列之间的移植工作量较小。</li></ul></div></details><details class="notion-toggle notion-block-2a9e940c69bb81ffbddfd4a3bda28e06"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb81ffbddfd4a3bda28e06" data-id="2a9e940c69bb81ffbddfd4a3bda28e06"><span><div id="2a9e940c69bb81ffbddfd4a3bda28e06" class="notion-header-anchor"></div><span class="notion-h-title">2. 创建HAL库工程模板</span></span></h3></summary><div><details class="notion-toggle notion-block-2a9e940c69bb81f9b1a8fcec5ed17b09"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb81f9b1a8fcec5ed17b09" data-id="2a9e940c69bb81f9b1a8fcec5ed17b09"><span><div id="2a9e940c69bb81f9b1a8fcec5ed17b09" class="notion-header-anchor"></div><span class="notion-h-title">1. 制作文件模板</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81409a89f037ef605585"><li>先找一个位置，存放工程模板</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812fa8f9ef8cca922ca4"><li>在工程模板中  添加 User、Library 、 Hardware 、 CMSIS  文件夹：</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812fa8f9ef8cca922ca4"><li><b>User：</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8174ae80f521ce13c39a"><li>main.c</li></ul><li><b>Library：</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8160aca0ef6945f9fbb0"><li>Include</li><li>Source</li></ul><li><b>Hardware：</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81338f27fcb53f8219f5"><li>Include</li><li>Source</li></ul><li><b>CMSIS ：</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81a2a8ddd8d3786e5ade"><li>Include</li><li>Source</li></ul></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8143bd55d5e4cdd6f7e8"><li>下载HAL库 源码 <a class="notion-link" href="https://www.st.com.cn/zh/embedded-software/stm32cube-mcu-mpu-packages/products.html" target="_blank" rel="noopener noreferrer">STM32Cube MCU和MPU包: 相关产品</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81149319d7e51178f554"><li>解压并打开</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81088f7ae38125095e17"><li><b>拷贝HAL库（Library）</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81088f7ae38125095e17"><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8149a6cec9a64f2d98fa" style="list-style-type:decimal"><li>进入<code class="notion-inline-code">\STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver</code> 
把头文件夹 Inc 和源文件夹 Src 移动到自己的<span class="notion-teal"><b>Library</b></span><span class="notion-default"><b>的对应的</b></span>文件中</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81ba872ec8bce512b188"><li><b>拷贝启动文件（CMSIS\Include）</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81ba872ec8bce512b188"><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb816e8f37fe1ef21e9b2b" style="list-style-type:decimal"><li>先进入内核文件<code class="notion-inline-code">\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS</code></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81c5bdb9e23f4bea1441" style="list-style-type:decimal"><li>进入头文件<code class="notion-inline-code">\CMSIS\Include</code>
把所有文件拷贝到自己的<span class="notion-pink"><b>CMSIS/Include</b></span>文件中
再进入<code class="notion-inline-code">\CMSIS\Device\ST\STM32F1xx\Include</code> 
把所有文件拷贝到自己的<span class="notion-pink"><b>CMSIS/Include</b></span>文件中</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812a829be58ffb60da16"><li><b>拷贝源文件（CMSYS\Source）</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812a829be58ffb60da16"><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81ef901fe914ac626a60" style="list-style-type:decimal"><li>进入<code class="notion-inline-code">\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates</code></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81b1a1e6d6a238403352" style="list-style-type:decimal"><li>把<code class="notion-inline-code">\Templates</code> 文件的的system_stm32f1xx.c拷贝到自己的<span class="notion-blue"><b>CMSIS/Source</b></span>文件中</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8124b137c0eeb1597cd3" style="list-style-type:decimal"><li>再进入/arm文件下，把所有文件拷贝到自己的<span class="notion-blue"><b>CMSIS/Source</b></span>文件中</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81f58b0be0a9364fb609"><li>编辑Hardware文件夹</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81f58b0be0a9364fb609"><div class="notion-text notion-block-2a9e940c69bb81b3a31ae94a10bc50a0">分别在源文件家和头文件夹添加stm32f1xx_it.c 和stm32f1xx_it.h
代码如下</div></ul></ul><details class="notion-toggle notion-block-2a9e940c69bb818baf05e176443f3a5b"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb818baf05e176443f3a5b" data-id="2a9e940c69bb818baf05e176443f3a5b"><span><div id="2a9e940c69bb818baf05e176443f3a5b" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div></div></details><details class="notion-toggle notion-block-2a9e940c69bb812fa9fbe2eae023450b"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb812fa9fbe2eae023450b" data-id="2a9e940c69bb812fa9fbe2eae023450b"><span><div id="2a9e940c69bb812fa9fbe2eae023450b" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.h</span></span></h4></summary><div></div></details></div></details></div></details></div></details><div class="notion-text notion-block-1416a76407ca450dbc602733d2135bef">CMSIS<div class="notion-text-children"><div class="notion-text notion-block-6e10210f62c24dbf901d42ce57bd87eb">Include<div class="notion-text-children"><div class="notion-text notion-block-bdbbf95e6bc544e09c8d909e4d849ca6">cmsis_armcc.h</div><div class="notion-text notion-block-460a920b230d4e85b913e26987b8acf1">cmsis_armclang.h</div><div class="notion-text notion-block-3da11280c31947b0a7c8cae2adcf89a8">cmsis_compiler.h</div><div class="notion-text notion-block-08e5e3dc8c544b27b19b1c835570d942">cmsis_gcc.h</div><div class="notion-text notion-block-43832585f3c443ea85ca8666a62eb364">cmsis_iccarm.h</div><div class="notion-text notion-block-00833db005144d439ecd3c7ce7ac2f1b">cmsis_version.h</div><div class="notion-text notion-block-ed23f62fb4d9494084c529bd6497a6d8">core_armv8mbl.h</div><div class="notion-text notion-block-ebcad7f5fe994a3e9a848b53ab00d96e">core_armv8mml.h</div><div class="notion-text notion-block-32a2d0ab9673450db09232614179af0a">core_cm0.h</div><div class="notion-text notion-block-ff4dd3f7f18943428e11206f94e71b24">core_cm0plus.h</div><div class="notion-text notion-block-1766170a2761460e9b08779faefe30e7">core_cm1.h</div><div class="notion-text notion-block-2a39c56c6e4b412b83dba677983549d5">core_cm23.h</div><div class="notion-text notion-block-791eab9c1d984758b928586f7720190d">core_cm3.h</div><div class="notion-text notion-block-4fa6f8f6657845eb9c9fdf962dc87b6e">core_cm33.h</div><div class="notion-text notion-block-32a5eed4d91a4341a02ab7691214f1ef">core_cm4.h</div><div class="notion-text notion-block-4602138775e94db7b7c0145ac6efee3a">core_cm7.h</div><div class="notion-text notion-block-220d55e55c0745fab9f3c9698137d812">core_sc000.h</div><div class="notion-text notion-block-3cd33093bbc84bedbbc971697a14a539">core_sc300.h</div><div class="notion-text notion-block-9110e5bf39ce4d1eb0217622dd9a5282">mpu_armv7.h</div><div class="notion-text notion-block-f6706739e9d24ba3b75184e4fd4c7245">mpu_armv8.h</div><div class="notion-text notion-block-961e32254db1475b90a0162bfe73177d">stm32f100xb.h</div><div class="notion-text notion-block-5196fe179b604aee80b559c7126d09a5">stm32f100xe.h</div><div class="notion-text notion-block-ddd777e45ff647eebe00cd6a74da25d7">stm32f101x6.h</div><div class="notion-text notion-block-89b07da97bd848ee97bfb9dc147b0751">stm32f101xb.h</div><div class="notion-text notion-block-0da3f0f1bab44be88dc3dc0bd65e567e">stm32f101xe.h</div><div class="notion-text notion-block-b35abc23fd4642809f9380cdc56c0d12">stm32f101xg.h</div><div class="notion-text notion-block-6eb1432332ff47f59be3eb59ad84242d">stm32f102x6.h</div><div class="notion-text notion-block-271e079938e343fa9a8a12e4e8063488">stm32f102xb.h</div><div class="notion-text notion-block-7801a0073fc347839e27f74b5e2ac73a">stm32f103x6.h</div><div class="notion-text notion-block-7672af0624a54628a2c92ed3c1db4a6d">stm32f103xb.h</div><div class="notion-text notion-block-3b283a2e3ed044978484cde88cd91d74">stm32f103xe.h</div><div class="notion-text notion-block-9ef819d970364fea9f8808297a53e051">stm32f103xg.h</div><div class="notion-text notion-block-268bd7d073864f828d90128479f1684f">stm32f105xc.h</div><div class="notion-text notion-block-1ace004d00364dc0ab7e3ca1632267d7">stm32f107xc.h</div><div class="notion-text notion-block-3018bb9a36c8461c831b6b13ee38ff4b">stm32f1xx.h</div><div class="notion-text notion-block-326fd9877f194320a30cceac8fd559e5">system_stm32f1xx.h</div><div class="notion-text notion-block-5d3200a0dd0d4b2ea777c90293a48c04">tz_context.h</div></div></div><div class="notion-text notion-block-2220e21c0f444278bcd9b03a6911ba12">Source<div class="notion-text-children"><div class="notion-text notion-block-5d8e1bfae2a14316bce7093dd586d23d">startup_stm32f100xb.s</div><div class="notion-text notion-block-6b960004ee9e4313a8ecc7fbbc08a86d">startup_stm32f100xe.s</div><div class="notion-text notion-block-ae0dd673c83e4f76b8e872a3cd3944a0">startup_stm32f101x6.s</div><div class="notion-text notion-block-2ab0a6dbe10a4b009918e823459209e9">startup_stm32f101xb.s</div><div class="notion-text notion-block-c3f4843187fd4bba968da8740153eeea">startup_stm32f101xe.s</div><div class="notion-text notion-block-d5d4193dde5743b99e09bbad93768db4">startup_stm32f101xg.s</div><div class="notion-text notion-block-701c30506dc04f86ac5c06fd2a2d9edd">startup_stm32f102x6.s</div><div class="notion-text notion-block-66327ba1a3824de0a66a029ccdc67249">startup_stm32f102xb.s</div><div class="notion-text notion-block-21fd446b49924b58b85ae0cc008f7196">startup_stm32f103x6.s</div><div class="notion-text notion-block-51d07989db2c40758276d530a9c6dfda">startup_stm32f103xb.s</div><div class="notion-text notion-block-b90f36181253423c823f2e48919fffbc">startup_stm32f103xe.s</div><div class="notion-text notion-block-2b0d1c26372e4f5e957e46b18c13671d">startup_stm32f103xg.s</div><div class="notion-text notion-block-d95d70d6bd1e45d9843f528ef483040e">startup_stm32f105xc.s</div><div class="notion-text notion-block-f18f83c796bc4be5bb6692a6d872755a">startup_stm32f107xc.s</div><div class="notion-text notion-block-cdb3b6cdb8d644feb7382c4c32a16d05">system_stm32f1xx.c</div></div></div></div></div><div class="notion-text notion-block-dd557ae374aa4697a6c7cae2bb4a97d8">DebugConfig<div class="notion-text-children"><div class="notion-text notion-block-71b0f64b0b4a4400bd411631d2ce97d5">Project_STM32F103C8_1.0.0.dbgconf</div><div class="notion-text notion-block-dc1868dbd3934e68a6a28afefc82ca35">Target_1_STM32F103C8_1.0.0.dbgconf</div></div></div><div class="notion-text notion-block-ab8c19ce8b9f41688cf86aae71adf2f7">Hardware<div class="notion-text-children"><div class="notion-text notion-block-faf8143e572b4dcdaa237ef05826edfe">Include<div class="notion-text-children"><div class="notion-text notion-block-5ea17201bb2d4098b6b4241f118eb64b">stm32f1xx_it.h</div></div></div><div class="notion-text notion-block-7d03a14b27c7439885e6090c0f5e9adf">Source<div class="notion-text-children"><div class="notion-text notion-block-7d1ecf3b52b445088ea33b1ed27581e1">stm32f1xx_it.c</div></div></div></div></div><div class="notion-text notion-block-79a6301d85a04e2fb08527c0b84547a8">Library<div class="notion-text-children"><div class="notion-text notion-block-5c45bd431d2b429e8c33e140ccb3606f">Include<div class="notion-text-children"><div class="notion-text notion-block-15dc0b2d00f544e68dbd4a04dd52f5b1">Legacy<div class="notion-text-children"><div class="notion-text notion-block-5938a24aee134ba09f9314cc95410dfe">stm32f1xx_hal_can_ex_legacy.h</div><div class="notion-text notion-block-3c0de7606fd241248c0ac8f9c809dd50">stm32f1xx_hal_can_legacy.h</div><div class="notion-text notion-block-1d8936ab9f0547dbaccdd46e6669d8c4">stm32_hal_legacy.h</div></div></div><div class="notion-text notion-block-4066e6dd71104dc794c933a7d4ffb7bb">stm32f1xx_hal.h</div><div class="notion-text notion-block-2ae35fbe824047ea9d8c10b0f7fc17bd">stm32f1xx_hal_adc.h</div><div class="notion-text notion-block-0ec3e95a9966476bbd415236b8db664f">stm32f1xx_hal_adc_ex.h</div><div class="notion-text notion-block-d62c08444166472ba1b93dcd61a0a25d">stm32f1xx_hal_can.h</div><div class="notion-text notion-block-121360d1f3524793a862dd9fe22aea54">stm32f1xx_hal_cec.h</div><div class="notion-text notion-block-ff4e84d137f1477893fc5ea5d13205c2">stm32f1xx_hal_conf.h</div><div class="notion-text notion-block-a2ed2ad4e46a418fb4fbf77c2e67ea5b">stm32f1xx_hal_cortex.h</div><div class="notion-text notion-block-52ee9361d35042b69aaee93be187ac84">stm32f1xx_hal_crc.h</div><div class="notion-text notion-block-a9b08974a4cc442ea7ed5e2ad43f2713">stm32f1xx_hal_dac.h</div><div class="notion-text notion-block-2b53d8188f074efe86d7cd8e7b34a54d">stm32f1xx_hal_dac_ex.h</div><div class="notion-text notion-block-789896f0e2814b15ab82718e7f18045f">stm32f1xx_hal_def.h</div><div class="notion-text notion-block-386c70281f9c4977830db28220c49d26">stm32f1xx_hal_dma.h</div><div class="notion-text notion-block-0c363cad6313460db5454fbcb3a7b2aa">stm32f1xx_hal_dma_ex.h</div><div class="notion-text notion-block-776a358984784da89d1f883d396e180e">stm32f1xx_hal_eth.h</div><div class="notion-text notion-block-24222c6dde6445bc9e1322feb308e7f0">stm32f1xx_hal_exti.h</div><div class="notion-text notion-block-1887636002ff4867b70995f5336ad89f">stm32f1xx_hal_flash.h</div><div class="notion-text notion-block-0c0dc15b970e499486b3824262605d7b">stm32f1xx_hal_flash_ex.h</div><div class="notion-text notion-block-7f9e6c792ab74609a3cececf86b4acf2">stm32f1xx_hal_gpio.h</div><div class="notion-text notion-block-b4ec2cf59bbe47fb9ebf3b1472b58b1c">stm32f1xx_hal_gpio_ex.h</div><div class="notion-text notion-block-d071789b65004a669ee42ef9168211ae">stm32f1xx_hal_hcd.h</div><div class="notion-text notion-block-65c60678251b4c72bca7fade9edfbb6e">stm32f1xx_hal_i2c.h</div><div class="notion-text notion-block-b974ff30cab44067b09f740123c02e5c">stm32f1xx_hal_i2s.h</div><div class="notion-text notion-block-270d0fec9361428e9c398d8b1091fcd6">stm32f1xx_hal_irda.h</div><div class="notion-text notion-block-a8f8ea3bab3344d2a3669ed3d6dcf91c">stm32f1xx_hal_iwdg.h</div><div class="notion-text notion-block-cb48848c57a343bba73397c7961c2434">stm32f1xx_hal_mmc.h</div><div class="notion-text notion-block-432138c53f5049fab73636599ab018a8">stm32f1xx_hal_nand.h</div><div class="notion-text notion-block-01d1dfac047d4eb48922dbd2c916b9d0">stm32f1xx_hal_nor.h</div><div class="notion-text notion-block-fce8a207e8da4bbebdff0ef3b0238707">stm32f1xx_hal_pccard.h</div><div class="notion-text notion-block-4b5d80cac2064327bee16a7a1fff2c75">stm32f1xx_hal_pcd.h</div><div class="notion-text notion-block-6f3906f309324c96968893a5490b7967">stm32f1xx_hal_pcd_ex.h</div><div class="notion-text notion-block-6e6f670542534402898d7954b3452c72">stm32f1xx_hal_pwr.h</div><div class="notion-text notion-block-d61c066cdc3c4aafb6980a81f619fe75">stm32f1xx_hal_rcc.h</div><div class="notion-text notion-block-1136cfca6d11458fbf71168f33d09966">stm32f1xx_hal_rcc_ex.h</div><div class="notion-text notion-block-c1d3b3f33ce64a169f7d76d5157c24c4">stm32f1xx_hal_rtc.h</div><div class="notion-text notion-block-ba4f4b6b45384c569d5eb67584d1b88f">stm32f1xx_hal_rtc_ex.h</div><div class="notion-text notion-block-0949f2330c7245b0991c638dde9fca43">stm32f1xx_hal_sd.h</div><div class="notion-text notion-block-52527e5a227241349feca50014a89b86">stm32f1xx_hal_smartcard.h</div><div class="notion-text notion-block-0a0c1d13c14343fba2bc1d957514c203">stm32f1xx_hal_spi.h</div><div class="notion-text notion-block-e1e1113a63154f378434d686bc812eea">stm32f1xx_hal_sram.h</div><div class="notion-text notion-block-1efb57725b0847e7abb20f4209d99027">stm32f1xx_hal_tim.h</div><div class="notion-text notion-block-f486b10a6c9d44ddb167169dd831331e">stm32f1xx_hal_tim_ex.h</div><div class="notion-text notion-block-5fc011bbd8b94cd4852b0b542d1522ae">stm32f1xx_hal_uart.h</div><div class="notion-text notion-block-d220b869ceb6446caf7f35336e436100">stm32f1xx_hal_usart.h</div><div class="notion-text notion-block-d13f3cb79def473cbe5d5eca2b706117">stm32f1xx_hal_wwdg.h</div><div class="notion-text notion-block-a883167578b240869ce85377b067b941">stm32f1xx_ll_adc.h</div><div class="notion-text notion-block-94b67d30bda74d86b151ceed3166f12f">stm32f1xx_ll_bus.h</div><div class="notion-text notion-block-10290fbd83e345b0aebd54207b5c7c2e">stm32f1xx_ll_cortex.h</div><div class="notion-text notion-block-22a15d8da71c459499a7e287c9f17b8c">stm32f1xx_ll_crc.h</div><div class="notion-text notion-block-1a69f989ecec44a59d702cbe9898d9ef">stm32f1xx_ll_dac.h</div><div class="notion-text notion-block-ed2fdf75054f43efb1d87c71f666d40a">stm32f1xx_ll_dma.h</div><div class="notion-text notion-block-414a123ab27649979d99f33189b36dde">stm32f1xx_ll_exti.h</div><div class="notion-text notion-block-f92ccca1e22b49e99a60e95565877a97">stm32f1xx_ll_fsmc.h</div><div class="notion-text notion-block-f671e84afddb433ea1c9eed37a66db8d">stm32f1xx_ll_gpio.h</div><div class="notion-text notion-block-e1a8a4ca15a7427393ac9733f2668c72">stm32f1xx_ll_i2c.h</div><div class="notion-text notion-block-657925a5aa4245199ad687aac4ae7333">stm32f1xx_ll_iwdg.h</div><div class="notion-text notion-block-223c7492f3fe47498e827305c7f510d1">stm32f1xx_ll_pwr.h</div><div class="notion-text notion-block-ba92fd591782490984a1d563e2c98749">stm32f1xx_ll_rcc.h</div><div class="notion-text notion-block-af91e40b6f604927b603394b7dca5927">stm32f1xx_ll_rtc.h</div><div class="notion-text notion-block-aa9fb020a046416e809c2da7d140ce94">stm32f1xx_ll_sdmmc.h</div><div class="notion-text notion-block-641e2c02b994471887e8ba78bb9422cd">stm32f1xx_ll_spi.h</div><div class="notion-text notion-block-8a24ff0523ff4b518dcb8c1511551130">stm32f1xx_ll_system.h</div><div class="notion-text notion-block-62f01a86eb2e4e52ba9a11f373a6c7e5">stm32f1xx_ll_tim.h</div><div class="notion-text notion-block-80141349de124503b56045908b7d020d">stm32f1xx_ll_usart.h</div><div class="notion-text notion-block-cbcf9c30eefa428db35420017dfbc61d">stm32f1xx_ll_usb.h</div><div class="notion-text notion-block-c904a36fbf3442c1839869794b3c7c4d">stm32f1xx_ll_utils.h</div><div class="notion-text notion-block-7e58dcff295a4e21b3984d04251a89cb">stm32f1xx_ll_wwdg.h</div><div class="notion-text notion-block-05327dc091ac4b108e526c9b2e076bd6">stm32_assert_template.h</div></div></div><div class="notion-text notion-block-a79ed471ee1140779707b517b800ff15">Source<div class="notion-text-children"><div class="notion-text notion-block-6d3877882dc04f0d8bc26437db99893b">Legacy<div class="notion-text-children"><div class="notion-text notion-block-4da566b9e6ea45c78fee02783086dc57">stm32f1xx_hal_can.c</div></div></div><div class="notion-text notion-block-86e81440e4d04b70bc107374c86a912b">stm32f1xx_hal.c</div><div class="notion-text notion-block-1ac86c66a566427b8d0c74a1e36fa555">stm32f1xx_hal_adc.c</div><div class="notion-text notion-block-b294c5bf63f840d2b2a83e9b3d38ff97">stm32f1xx_hal_adc_ex.c</div><div class="notion-text notion-block-69dcfd3f952c426c97072b5d8fae701d">stm32f1xx_hal_can.c</div><div class="notion-text notion-block-1d0299e78ac1431189d6d0e3e2aecc81">stm32f1xx_hal_cec.c</div><div class="notion-text notion-block-65045dd744c943a4bf13ed5f4f0ac344">stm32f1xx_hal_cortex.c</div><div class="notion-text notion-block-eeea1098bee34782b9c3e64430228315">stm32f1xx_hal_crc.c</div><div class="notion-text notion-block-e5d80c4879c948ef9794eb3a2467746c">stm32f1xx_hal_dac.c</div><div class="notion-text notion-block-c3cd44d5c62b40d0959d127ec3acc1a5">stm32f1xx_hal_dac_ex.c</div><div class="notion-text notion-block-2b82670ab7114241a86b75f7d3c53238">stm32f1xx_hal_dma.c</div><div class="notion-text notion-block-bc90276c5fe04ff799af8644e8eedb1d">stm32f1xx_hal_eth.c</div><div class="notion-text notion-block-80f9a12621984a1081923402ed54faa0">stm32f1xx_hal_exti.c</div><div class="notion-text notion-block-2389cfe2a24d48e08f63f97316152d1f">stm32f1xx_hal_flash.c</div><div class="notion-text notion-block-66fc4aea97cb4d448db08f6d849f1dc6">stm32f1xx_hal_flash_ex.c</div><div class="notion-text notion-block-6250e7986c9b4d2bb721d6555ac0d5d6">stm32f1xx_hal_gpio.c</div><div class="notion-text notion-block-34d132efec87417db035d6049fab5961">stm32f1xx_hal_gpio_ex.c</div><div class="notion-text notion-block-5d736c2035ec463aa09926ac026aa637">stm32f1xx_hal_hcd.c</div><div class="notion-text notion-block-f7c07e5ed8024b41a6f7a5a76e920cf7">stm32f1xx_hal_i2c.c</div><div class="notion-text notion-block-d6031d16e53341dab86a79af3ccbeb54">stm32f1xx_hal_i2s.c</div><div class="notion-text notion-block-3847265511934694b7375f54dffd59c5">stm32f1xx_hal_irda.c</div><div class="notion-text notion-block-91852d4930e84993af305c2480ca9f67">stm32f1xx_hal_iwdg.c</div><div class="notion-text notion-block-7307996013ee47548118375d23833f6c">stm32f1xx_hal_mmc.c</div><div class="notion-text notion-block-9bd1fecbe85f4af2a4f6003108f1e9bd">stm32f1xx_hal_msp_template.c</div><div class="notion-text notion-block-e1f41d4fd1614664acab82f9319145d0">stm32f1xx_hal_nand.c</div><div class="notion-text notion-block-b221602d0a2f4ab18f7d260fb555b814">stm32f1xx_hal_nor.c</div><div class="notion-text notion-block-a79ef158c669473b97533bab47d6ba1b">stm32f1xx_hal_pccard.c</div><div class="notion-text notion-block-6c0eeebfad2f413488560b35ecd0f8d2">stm32f1xx_hal_pcd.c</div><div class="notion-text notion-block-6aa763a7aa704e209b90e896a334562e">stm32f1xx_hal_pcd_ex.c</div><div class="notion-text notion-block-8628d3f8a95e4e6c8d99affa0ab3556a">stm32f1xx_hal_pwr.c</div><div class="notion-text notion-block-15b56de848d2417d8a4934d96ac74285">stm32f1xx_hal_rcc.c</div><div class="notion-text notion-block-fe3feee0257e4ef0a39996ce93f1420d">stm32f1xx_hal_rcc_ex.c</div><div class="notion-text notion-block-ee9b66ea8bc140d2ae57ee50de20945c">stm32f1xx_hal_rtc.c</div><div class="notion-text notion-block-505df8ee9ae2446a901731196838909c">stm32f1xx_hal_rtc_ex.c</div><div class="notion-text notion-block-7585a1f5a7214e32b79a342381e17112">stm32f1xx_hal_sd.c</div><div class="notion-text notion-block-dab0a35063e34f1ca039d8b536f39772">stm32f1xx_hal_smartcard.c</div><div class="notion-text notion-block-3a50951220ea4002b243d50ef83334bf">stm32f1xx_hal_spi.c</div><div class="notion-text notion-block-68b79cc8398b48b1af80ec141599682d">stm32f1xx_hal_sram.c</div><div class="notion-text notion-block-f2460d07498a4e5e9179ac77456817fb">stm32f1xx_hal_tim.c</div><div class="notion-text notion-block-1bab997c6a0f42c6a0dd9970712a44a2">stm32f1xx_hal_timebase_rtc_alarm_template.c</div><div class="notion-text notion-block-90d8e0839450441aa36c2bdfde396b0a">stm32f1xx_hal_timebase_tim_template.c</div><div class="notion-text notion-block-f51839a0f7344fc899e9e0ae20f8a453">stm32f1xx_hal_tim_ex.c</div><div class="notion-text notion-block-caf11b0cdffc4557a50b876d7e43f575">stm32f1xx_hal_uart.c</div><div class="notion-text notion-block-5ff90d33e6734f48b270a46403ddb061">stm32f1xx_hal_usart.c</div><div class="notion-text notion-block-1fa62680eea448c683269914e596b179">stm32f1xx_hal_wwdg.c</div><div class="notion-text notion-block-7c17da69fc854d148b68fe4260eec660">stm32f1xx_ll_adc.c</div><div class="notion-text notion-block-6bae576546a44f53ac3bbd65494a090e">stm32f1xx_ll_crc.c</div><div class="notion-text notion-block-13ea7bd50f7d4ed3a9f67540b35bd83e">stm32f1xx_ll_dac.c</div><div class="notion-text notion-block-becc48b351cf4fa286ed2040594ecdf9">stm32f1xx_ll_dma.c</div><div class="notion-text notion-block-05c99e8682cf4663a2a848071b49717f">stm32f1xx_ll_exti.c</div><div class="notion-text notion-block-2ab0ca65797d4ea99e4ad3bf98e97c4a">stm32f1xx_ll_fsmc.c</div><div class="notion-text notion-block-3087046b28d740f2a4a3d64bf16ce466">stm32f1xx_ll_gpio.c</div><div class="notion-text notion-block-6d5596ff04c64148b416f2bb7053b292">stm32f1xx_ll_i2c.c</div><div class="notion-text notion-block-acc95e72a943417e8db6f325c51a8031">stm32f1xx_ll_pwr.c</div><div class="notion-text notion-block-a00e9ee9e1cc4be0a911dcdefe494fd7">stm32f1xx_ll_rcc.c</div><div class="notion-text notion-block-9eb228f8a3d14aceb570259ea9f3f6fd">stm32f1xx_ll_rtc.c</div><div class="notion-text notion-block-693c94377ac743f8b67998057e995930">stm32f1xx_ll_sdmmc.c</div><div class="notion-text notion-block-66996bea31944f9eaf0236390c1bee8c">stm32f1xx_ll_spi.c</div><div class="notion-text notion-block-5472da92c2b847dca44e30ca536c00d3">stm32f1xx_ll_tim.c</div><div class="notion-text notion-block-2b0b97076bbe420898b8632b8cbf745e">stm32f1xx_ll_usart.c</div><div class="notion-text notion-block-bac8bc127b4c4f8d82e8184c01420a67">stm32f1xx_ll_usb.c</div><div class="notion-text notion-block-86a825c3a93443dfa798d087a73966a0">stm32f1xx_ll_utils.c</div></div></div></div></div><div class="notion-text notion-block-d3ba9bcf93534884b6d2184ad12d7a02">Listings<div class="notion-text-children"><div class="notion-text notion-block-bdbf09612fa94546bb5cfd6bac8d9452"><a class="notion-link" href="http://Project.map" target="_blank" rel="noopener noreferrer">Project.map</a></div></div></div><div class="notion-text notion-block-2a42c13153cd4287b56aef03cd76d551">Objects<div class="notion-text-children"><div class="notion-text notion-block-c69a55453ee945209056be5a5bab8062">main.d</div><div class="notion-text notion-block-bb92aab376564aa580b8108a655887dc">main.o</div><div class="notion-text notion-block-aef3c71bba35451eb1aa80210a1c40b4">Project.axf</div><div class="notion-text notion-block-eb9c62493f584d4ba4aeac7652a01d1c"><a class="notion-link" href="http://Project.build" target="_blank" rel="noopener noreferrer">Project.build</a>_log.htm</div><div class="notion-text notion-block-4fd0442082bc4bf2989ae25373b74ad2">Project.htm</div><div class="notion-text notion-block-1fe1c63e5c684f36b39362302671f4b9">Project.lnp</div><div class="notion-text notion-block-5b215d4c4da24552ad61eced65b47fed">Project.sct</div><div class="notion-text notion-block-a6041cb63aa64cef814ad7010d7b5a28">Project_Project.dep</div><div class="notion-text notion-block-9f9baa99494c4f9ca63ecf3a0e638a36">startup_stm32f101xb.o</div><div class="notion-text notion-block-c399a9b9f34947319dca2df71da7c5f4">stm32f1xx_hal.d</div><div class="notion-text notion-block-95aec92363f7464d9c18e700a73068fe">stm32f1xx_hal.o</div><div class="notion-text notion-block-7c0a7dcc7e8149cbaa7fbda7bc472f86">stm32f1xx_hal_cortex.d</div><div class="notion-text notion-block-8740efa08cfd474bb0cb13468ea17906">stm32f1xx_hal_cortex.o</div><div class="notion-text notion-block-885e74a55a7c4be197c7352de87d550b">stm32f1xx_hal_gpio.d</div><div class="notion-text notion-block-efdb1e1f09014162a7fc229402f808a9">stm32f1xx_hal_gpio.o</div><div class="notion-text notion-block-7371ff263e6146d88116ec610c32224b">stm32f1xx_hal_gpio_ex.d</div><div class="notion-text notion-block-8dbebb175364432fba807a50d463a001">stm32f1xx_hal_gpio_ex.o</div><div class="notion-text notion-block-cefa4c13186d41788bb9e503908c482c">stm32f1xx_hal_rcc.d</div><div class="notion-text notion-block-bc3a71078e674de4857fe78101471560">stm32f1xx_hal_rcc.o</div><div class="notion-text notion-block-85967a241c784e7a9e78163a0b367baf">stm32f1xx_hal_rcc_ex.d</div><div class="notion-text notion-block-66364312418d4a9580e89989b69efc51">stm32f1xx_hal_rcc_ex.o</div><div class="notion-text notion-block-be97d6ce09ae470e95251a4fbc3df94e">system_stm32f1xx.d</div><div class="notion-text notion-block-f43742f2f7dc42d3aa811979d4921042">system_stm32f1xx.o</div></div></div><div class="notion-text notion-block-d0e747c226704d4ebbb5578775c996bc">User<div class="notion-text-children"><div class="notion-text notion-block-ba4c77f9bb674cdc836b490328abbfbb">main.c</div><div class="notion-text notion-block-93f78f60e893419cb93050eb9fd6f763">HAL_Init();//初始化HAL库</div><div class="notion-text notion-block-4674641a82d54db3b2ab1035598f022c">HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_SYSCLK,RCC_MCODIV_1);//PA8引脚输出、系统时钟、不分频</div></div></div><div class="notion-text notion-block-fb0a50271b084bee826e735abf725bca">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-15befc68cfc74a00bf4c972d62cbb1a1">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-caebbd3ff971407fb210355b8715de15">/*函 数 名：hal库rcc输出内部8Mhz方波<div class="notion-text-children"><div class="notion-text notion-block-2e335ea55e104413a55af124199031b5">*参    数：</div><div class="notion-text notion-block-cb8bd4fb4bd84208831f5feb88c0c934">*返 回 值：</div><div class="notion-text notion-block-1e683d0eb170400c9f493914efc07a73">*注意事项：</div><div class="notion-text notion-block-2d1b1655471541e6b1273fab5fd742d4">*/</div></div></div><div class="notion-text notion-block-f8fefd9890d7442ba38c084978c8e01a">uint32_t HCLKFreq  = 0;//显示时钟树三处频率</div><div class="notion-text notion-block-3e4d3012eefc44948eb6001c0fe0e65d">uint32_t PCLK1Freq = 0;</div><div class="notion-text notion-block-ddf5ea87625f4c22be7868ad1c9ddc5b">uint32_t PCLK2Freq = 0;</div><div class="notion-text notion-block-c357ada3b32b4722b40a4712efa5a3d5">int main (void)</div><div class="notion-text notion-block-e45dca40a41d4902a0bcd2d689b1a45d">{<div class="notion-text-children"><div class="notion-text notion-block-34731df37ab04403bb0c1fa84d0e5e75">HAL_Init();//初始化HAL库</div><div class="notion-text notion-block-f82c86bcf6b54ec5b775b2c0b92e9766">RCC_ClockInit();//配置时钟树初始化</div><div class="notion-text notion-block-0ea99f810beb48f48e29e4d72c0ba320">HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_SYSCLK,RCC_MCODIV_1);//PA8引脚输出、系统时钟、不分频</div><div class="notion-text notion-block-ab6285b072664ace8022e7e641274562">HCLKFreq  = HAL_RCC_GetHCLKFreq();</div><div class="notion-text notion-block-35b0b1e79ca241d7b511fa2b1777450e">PCLK1Freq = HAL_RCC_GetPCLK1Freq();</div><div class="notion-text notion-block-eabaf397838646bcbfab73f5e9395ecf">PCLK2Freq = HAL_RCC_GetPCLK2Freq();</div><div class="notion-text notion-block-a81b6b1f5eaa465181cfa91f1c938d79">while(1)</div><div class="notion-text notion-block-806ac948dcdf456f9407e6f58fba2bbf">{</div><div class="notion-text notion-block-b2662d368bb14c93855f02295a3ee83c">}</div></div></div><div class="notion-text notion-block-0f97991792374d30953d6a477ffee2f8">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-b30e4c9e03e74226b4e9700ad80f3a97">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-b4a81663ddc342c8abd1b704c0e5d105">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-2f1d9c8c658e4e9caa8e32ecbc7e4243">void RCC_ClockInit()</div><div class="notion-text notion-block-32900831fb0645eaae9e545437e7f86c">{<div class="notion-text-children"><div class="notion-text notion-block-dea48eade0794f76b17d85606310fdae">RCC_OscInitTypeDef RCC_OsInitStructure; //设置内外部时钟源配置结构体</div><div class="notion-text notion-block-7c19468b42ad4c4ea84ca994123e8426">RCC_ClkInitTypeDef RCC_ClkInitStructure;//设置总线时钟结构体</div><div class="notion-text notion-block-43a69f34d9604e6fa1a27ebcd1e384ba">RCC_OsInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI;    //选择震荡电路为内部高速</div><div class="notion-text notion-block-ef2d98eca7b74a3697b0f67fd2121ae2">RCC_OsInitStructure.HSIState = RCC_HSI_ON;  //打开时钟</div><div class="notion-text notion-block-1fe83c6f5e7540e5b3a923d4fd7fd43d">RCC_OsInitStructure.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;   //设置微调值 默认</div><div class="notion-text notion-block-3017738a2b0640f48404d400408f7132">RCC_OsInitStructure.PLL.PLLState = RCC_PLL_ON;  //设置PLL为打开</div><div class="notion-text notion-block-587252f95ee144b08e026ddb4f1f0624">RCC_OsInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; //选择PLL输入为内部高速时钟</div><div class="notion-text notion-block-f7cbaa1c6bb74825bb8b359496e67bfe">RCC_OsInitStructure.PLL.PLLMUL = RCC_PLL_MUL16;          //设置16倍频</div><div class="notion-text notion-block-cfda218bf7e44d5eb6b98ff4cd576eca">HAL_RCC_OscConfig(&amp;RCC_OsInitStructure);    //传给话务员..</div><div class="notion-text notion-block-46b7395a29c14b4193f192ac6e068ab7">RCC_ClkInitStructure.ClockType = RCC_CLOCKTYPE_HCLK  | RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_SYSCLK;//需要配置的时钟</div><div class="notion-text notion-block-f032d52abd9b4a039be2a214710f04df">RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //SYSCLK系统时钟输入源 PLL作为系统时钟</div><div class="notion-text notion-block-5337f0f5c97a48d18fb040f30b16e59c">RCC_ClkInitStructure.AHBCLKDivider = RCC_SYSCLK_DIV1;   //AHB预分频 1分频</div><div class="notion-text notion-block-86985ac3483746ffa11d5cb3d31e750d">RCC_ClkInitStructure.APB1CLKDivider = RCC_HCLK_DIV2;    //APB1预分频 2分频</div><div class="notion-text notion-block-24bca8555a354f5285cd3a2518b3574d">RCC_ClkInitStructure.APB2CLKDivider = RCC_HCLK_DIV1;    //APB2预分频 1分频</div><div class="notion-text notion-block-808f1725aca442dd885c1141ec8286c1">HAL_RCC_ClockConfig(&amp;RCC_ClkInitStructure,FLASH_LATENCY_2);//传给话务员，并且根据频率设置FLASH等待周期为2</div><div class="notion-text notion-block-60a9aa8786db4154aac074cf580b2afd">//话务员相关配置可以在API函数中找到。结构体相关配置在结构体和成员中可找到</div></div></div><div class="notion-text notion-block-e993caa816084dc6a86913b296d8ad83">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-118dc703b823444fb28626f4ade3202b">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-f68dba2ee7b140caaaff4e65e90c8b0d">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-0e50c7bf772e437dbd0c49223178d59b">void RCC_ClockInit()</div><div class="notion-text notion-block-b09fe1f4096540d0a0b2f0b98d78121b">{<div class="notion-text-children"><div class="notion-text notion-block-3c846ba77cc34d0281f64f1648d15478">RCC_OscInitTypeDef RCC_OsInitStructure; //设置内外部时钟源配置结构体</div><div class="notion-text notion-block-809a52a72d1f45f4a8cea59e16b8d39c">RCC_ClkInitTypeDef RCC_ClkInitStructure;//设置总线时钟结构体</div><div class="notion-text notion-block-ee5852faf55a4112bdd2ed7a92a3a8a2">RCC_OsInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSE;    //选择震荡电路为外部高速</div><div class="notion-text notion-block-31cc0983ab794ed6a9669625b99fa87f">RCC_OsInitStructure.HSEState = RCC_HSE_ON;  //打开HSE时钟</div><div class="notion-text notion-block-bddf3d106ee54e7bbe9f96c315bcb884">RCC_OsInitStructure.HSEPredivValue = RCC_HSE_PREDIV_DIV1;   //不分频</div><div class="notion-text notion-block-0b1e32387ee54bde896fc1c59d89af51">RCC_OsInitStructure.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;   //设置微调值 默认</div><div class="notion-text notion-block-378ef8353f064fc0a50254fc0363a195">RCC_OsInitStructure.PLL.PLLState = RCC_PLL_ON;  //设置PLL为打开</div><div class="notion-text notion-block-1b7d60b9e82c4aae9af5ce0217468707">RCC_OsInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSE; //选择PLL输入为外部高速时钟</div><div class="notion-text notion-block-53df2c4a62ba40d0b13a20d8d85c35cf">RCC_OsInitStructure.PLL.PLLMUL = RCC_PLL_MUL9;          //设置9倍频</div><div class="notion-text notion-block-55392c2cfd31466aa9802466267c4a90">HAL_RCC_OscConfig(&amp;RCC_OsInitStructure);    //传给话务员..</div><div class="notion-text notion-block-cc7e585dbe9d479eb6762bb64cd1aea5">RCC_ClkInitStructure.ClockType = RCC_CLOCKTYPE_HCLK  | RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_SYSCLK;//需要配置的时钟</div><div class="notion-text notion-block-1da2ba5eb6d64aa3a271789896c41344">RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //SYSCLK系统时钟输入源 PLL作为系统时钟</div><div class="notion-text notion-block-49951b33a70d4794bcbf207f91a9d856">RCC_ClkInitStructure.AHBCLKDivider = RCC_SYSCLK_DIV1;   //AHB预分频 1分频</div><div class="notion-text notion-block-acc4cbe8f88f44a68bdbfb80a74d6e17">RCC_ClkInitStructure.APB1CLKDivider = RCC_HCLK_DIV2;    //APB1预分频 2分频</div><div class="notion-text notion-block-855d687c9c82488fa34a103ca3f13f34">RCC_ClkInitStructure.APB2CLKDivider = RCC_HCLK_DIV1;    //APB2预分频 1分频</div><div class="notion-text notion-block-052ec8c701c04669a1c6bb3d88c556ac">HAL_RCC_ClockConfig(&amp;RCC_ClkInitStructure,FLASH_LATENCY_2);//传给话务员，并且根据频率设置FLASH等待周期为2</div><div class="notion-text notion-block-4d36777a52ed494a9ccd891b6b16bcfa">//话务员相关配置可以在API函数中找到。结构体相关配置在结构体和成员中可找到</div></div></div><div class="notion-text notion-block-9c358f1d143e4617a8b005df0a57a744">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-1fcd01ac03c242f180a68dfcf989cca1">//stm启动文件中已经定义的中断服务函数</div><div class="notion-text notion-block-7b0e3f14cea54131832fe38edc776d33">void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-f050580d94c244de856bb51c02e284b1">{<div class="notion-text-children"><div class="notion-text notion-block-654c844a504b4d3480d0804bdcc5d825">if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)//帮我们判断标志位</div><div class="notion-text notion-block-207bb453f2fd4ce3ba0ea9d12714cc62">{<div class="notion-text-children"><div class="notion-text notion-block-7a8a55adebed4a4ca6cc1fd01c9c6c35">__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//帮我们清除标志位</div><div class="notion-text notion-block-0d73645b64274a7e82876eb4359bf75d">HAL_GPIO_EXTI_Callback(GPIO_Pin);//执行回调函数</div></div></div><div class="notion-text notion-block-4fceb3c1126b41e098f72360ff9d1d32">}</div></div></div><div class="notion-text notion-block-ea20089467d34d6cb4035cbb88edf310">}</div><div class="notion-text notion-block-d44e62825bcf40509fd406e48d34b758">// 弱声明 的回调函数  只是为了防止报错用</div><div class="notion-text notion-block-b535c914d12d46f48f20522a62e76d05">__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-36c8d7e71c31440a88a635d639a823e4">{<div class="notion-text-children"><div class="notion-text notion-block-8494491b83354756a5f067f48361ac3b">UNUSED(GPIO_Pin);//什么都不执行，只是为了防止编译时报错：没有使用xxx</div></div></div><div class="notion-text notion-block-710202bc19b544daa6fa46543f7f838a">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-662f6a8fa582418c86ea8625e13fce3b">void EXTI15_10_IRQHandler (void) //如果发生了这个中断</div><div class="notion-text notion-block-86d684b321a4420288028bc14d748fbf">{<div class="notion-text-children"><div class="notion-text notion-block-48ac9ad7baf74ac3a0579a9e7a563d6b">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);//跳转到HAL库的中断处理</div><div class="notion-text notion-block-fd63e3c0acc442f0977f0a8c5d90d7d0">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);//跳转到HAL库的中断处理</div></div></div><div class="notion-text notion-block-999a516ee71041a1a902b0f9d108236d">} <div class="notion-text-children"></div></div><div class="notion-text notion-block-6f80f16358c64e65a2732ecbf103cb1f">/<em> 注册回调函数 </em>/</div><div class="notion-text notion-block-8a6948c9d49c404c90fcc0b1b8a2e50f">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-7773bb7c16c1435e81cd6880a64cbd6f">{<div class="notion-text-children"><div class="notion-text notion-block-95aa2cac175d4b7b8b7d7cee5584a1b6">if (GPIO_Pin == GPIO_PIN_13) // 判断是不是13线</div><div class="notion-text notion-block-44385b6cf8ee4248a932fd2825a43ab5">{<div class="notion-text-children"><div class="notion-text notion-block-94f8aeb90be548e089b7bee8a496b7dd">// 执行13线程序</div><div class="notion-text notion-block-ad1a3b0545ea42fe89f35be121dbcb68">// ...</div></div></div><div class="notion-text notion-block-f3cdf0c2d802434e93e93ff644aea03c">}</div><div class="notion-text notion-block-799dd2cfc4e34e30a58cc2d3d2ae4408">else if (GPIO_Pin == GPIO_PIN_12) // 判断是不是12线</div><div class="notion-text notion-block-75a43cd8bd5b4706bc0ddfd4d76396d3">{<div class="notion-text-children"><div class="notion-text notion-block-47ee0560973942f2ae0978c522f72488">// 执行12线程序</div><div class="notion-text notion-block-c59b051ee3314f108daf78b053c662b2">// ...</div></div></div><div class="notion-text notion-block-dda707d6fda44b38b3bcc670c31e720d">}</div></div></div><div class="notion-text notion-block-975836dce5d945e5bb2f0df87be0be16">}<div class="notion-text-children"></div></div><details class="notion-toggle notion-block-091ca2887b444bf59570dc2e6b663d83"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-091ca2887b444bf59570dc2e6b663d83" data-id="091ca2887b444bf59570dc2e6b663d83"><span><div id="091ca2887b444bf59570dc2e6b663d83" class="notion-header-anchor"></div><span class="notion-h-title">串口篇</span></span></h2></summary><div><div class="notion-text notion-block-9560cb153bf3440c8716e76924f5a96a"><span class="notion-blue">这篇文章介绍了HAL库大多的使用方法，并配有详细的思路和注释。</span></div><details class="notion-toggle notion-block-b608780795584eafa96be6fc484a252e"><summary><h3 class="notion-h notion-h2 notion-block-b608780795584eafa96be6fc484a252e" data-id="b608780795584eafa96be6fc484a252e"><span><div id="b608780795584eafa96be6fc484a252e" class="notion-header-anchor"></div><span class="notion-h-title">一、介绍</span></span></h3></summary><div><div class="notion-text notion-block-81fde9f37a86421e914442f057d7e16e"><b>HAL库在 异步通信UART 串口部分提供了三种方式：</b></div><ul class="notion-list notion-list-disc notion-block-6c8ec32559ef4f7183f15c7474d8d44e"><li>轮询阻塞</li></ul><ul class="notion-list notion-list-disc notion-block-4e2de6bd0e5242739877733ba02b298f"><li>非阻塞中断 或者 DMA</li></ul><ul class="notion-list notion-list-disc notion-block-12b8fac322cb429ca4b4cf0a3aa7ef0f"><li>所以在使用串口时，也要添加DMA.c到库</li></ul><div class="notion-text notion-block-c684189fe5bc4ae386d8fed04db55efe"><b>以STM32C8T6为例，有三个串口资源：</b></div><ul class="notion-list notion-list-disc notion-block-7f6043b94d2b4a2eb59085c154765b2f"><li><b>USART1</b>：</li><ul class="notion-list notion-list-disc notion-block-7f6043b94d2b4a2eb59085c154765b2f"><li><b>TX</b>：PA9    可重映射为 PB 6</li><li><b>RX</b>：PA10  可重映射为 PB 7</li></ul></ul><ul class="notion-list notion-list-disc notion-block-edad2edd0f1a49a1bf0d6d4b41347ff3"><li><b>USART2</b>：</li><ul class="notion-list notion-list-disc notion-block-edad2edd0f1a49a1bf0d6d4b41347ff3"><li><b>TX</b>：PA2</li><li><b>RX</b>：PA3</li></ul></ul><ul class="notion-list notion-list-disc notion-block-c52ee69b92e34167b827480989fdd88e"><li><b>USART3</b>：</li><ul class="notion-list notion-list-disc notion-block-c52ee69b92e34167b827480989fdd88e"><li><b>TX</b>：PB10</li><li><b>RX</b>：PB11</li></ul></ul></div></details><details class="notion-toggle notion-block-ecf58f6f52b34d6794d7b4f162ae5305"><summary><h3 class="notion-h notion-h2 notion-block-ecf58f6f52b34d6794d7b4f162ae5305" data-id="ecf58f6f52b34d6794d7b4f162ae5305"><span><div id="ecf58f6f52b34d6794d7b4f162ae5305" class="notion-header-anchor"></div><span class="notion-h-title">二、HAL库：阻塞轮询方式 实现USART1 串口 异步收发</span></span></h3></summary><div><details class="notion-toggle notion-block-a92eeb62772a4de094f569bbfeb51214"><summary><h4 class="notion-h notion-h3 notion-block-a92eeb62772a4de094f569bbfeb51214" data-id="a92eeb62772a4de094f569bbfeb51214"><span><div id="a92eeb62772a4de094f569bbfeb51214" class="notion-header-anchor"></div><span class="notion-h-title">1. 引脚定义</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-05a0eb30671e47e98071ab18b7de382c"><li><b>USART1</b>：</li><ul class="notion-list notion-list-disc notion-block-05a0eb30671e47e98071ab18b7de382c"><li><b>TX</b>：PA9</li><li><b>RX</b>：PA10</li></ul></ul></div></details><details class="notion-toggle notion-block-492081e58b0b42a992c4a79d1cfc606a"><summary><h4 class="notion-h notion-h3 notion-block-492081e58b0b42a992c4a79d1cfc606a" data-id="492081e58b0b42a992c4a79d1cfc606a"><span><div id="492081e58b0b42a992c4a79d1cfc606a" class="notion-header-anchor"></div><span class="notion-h-title">2. 补充：为什么在while循环接收时，没必要对HAL_ERROR、HAL_BUSY进行处理</span></span></h4></summary><div><div class="notion-text notion-block-2da84faee1be4cd39788c53243f01590">HAL_ERROR：</div><ul class="notion-list notion-list-disc notion-block-f64d82011a3549eeb733a6b5411c0311"><li>用于判断buff为空指针或者数据长度为0的情况</li></ul><div class="notion-text notion-block-7705c989e76246579feadc81d636b637">HAL_BUSY：</div><ul class="notion-list notion-list-disc notion-block-71f903c8ea89408791bf4f4af89c97bd"><li>用于判断Busy状态</li></ul><div class="notion-text notion-block-d6841c9aa1b049f0babaf70509a0ad03">所以我们只需要判断他的另外两种状态，HAL_OK(在规定时间内接收到n个数据)、和HAL_TIMEOUT(未在规定时间接收到n个数据，导致超时退出接收)</div></div></details><details class="notion-toggle notion-block-6259b310b25940aab09b9c304f84c913"><summary><h4 class="notion-h notion-h3 notion-block-6259b310b25940aab09b9c304f84c913" data-id="6259b310b25940aab09b9c304f84c913"><span><div id="6259b310b25940aab09b9c304f84c913" class="notion-header-anchor"></div><span class="notion-h-title">3. 注意事项：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-a22f87e529494b31b1d0de0dc0a474ef"><li>HAL库的串口初始化， 硬件部分的时钟以及GPIO口的配置，需要我们自己来配置</li><ul class="notion-list notion-list-disc notion-block-a22f87e529494b31b1d0de0dc0a474ef"><div class="notion-text notion-block-18516b88f0f5472a80ec999aa8f86678">在<code class="notion-inline-code">HAL_UART_Init(&amp;Uart1); </code>函数被调用时。
会调用一个weak弱声明的<code class="notion-inline-code">void HAL_UART_MspInit(UART_HandleTypeDef *huart)</code> 函数。
这个函数就是留给我们强声明 配置硬件用的。我们需要在里边打开 串口1 和 GPIO的 时钟。 </div></ul></ul><ul class="notion-list notion-list-disc notion-block-2b8d315a0fd4427981f08ef145ca80fd"><li>需要注意的是USART1与定时器的引脚有冲突。 如果发生冲突
可以重映射 串口到别的引脚。</li></ul><ul class="notion-list notion-list-disc notion-block-af262b79007d4fc0a1bfb458b5ac4a62"><li>RxXferSiZe是用来记录接收总量的</li></ul><ul class="notion-list notion-list-disc notion-block-89892745497b466297584a3ac24138a5"><li>RxXferCount是用来记录剩余需要接收数量的</li><ul class="notion-list notion-list-disc notion-block-89892745497b466297584a3ac24138a5"><div class="notion-text notion-block-a7b5ecffb96c4e31b89a2b36f0b64f84">注意，这里的RxXferCount 进到while中就先减1 了。<b>这个知识点后面会用到</b>
</div></ul></ul></div></details><details class="notion-toggle notion-block-2b63f700570e43cd9144d845c7e2030f"><summary><h4 class="notion-h notion-h3 notion-block-2b63f700570e43cd9144d845c7e2030f" data-id="2b63f700570e43cd9144d845c7e2030f"><span><div id="2b63f700570e43cd9144d845c7e2030f" class="notion-header-anchor"></div><span class="notion-h-title">4. 串口1初始化部分：</span></span></h4></summary><div></div></details><details class="notion-toggle notion-block-ae18bf0b2ac341dc80ae4adf69a5ca65"><summary><h4 class="notion-h notion-h3 notion-block-ae18bf0b2ac341dc80ae4adf69a5ca65" data-id="ae18bf0b2ac341dc80ae4adf69a5ca65"><span><div id="ae18bf0b2ac341dc80ae4adf69a5ca65" class="notion-header-anchor"></div><span class="notion-h-title">5. 串口1配置硬件部分</span></span></h4></summary><div></div></details><details class="notion-toggle notion-block-f55b553cad3a4662af5c4bac40e008f1"><summary><h4 class="notion-h notion-h3 notion-block-f55b553cad3a4662af5c4bac40e008f1" data-id="f55b553cad3a4662af5c4bac40e008f1"><span><div id="f55b553cad3a4662af5c4bac40e008f1" class="notion-header-anchor"></div><span class="notion-h-title">6. 主函数部分</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-bd20b0fd39d344759799f780680c17c1"><li>主函数中。需要使用接收串口的函数：<code class="notion-inline-code">HAL_UART_Receive(&amp;Uart1,Buff,Rx_Size,200)</code></li><ul class="notion-list notion-list-disc notion-block-bd20b0fd39d344759799f780680c17c1"><div class="notion-text notion-block-9a0bb29bd5fe4037ae739dee6c6cb614">他的参数分别为：串口配置结构体地址、接收缓冲区（我们自己定义的数组）、预计接收的字节个数（我们自己定义）、超时时间（单位为ms）</div><div class="notion-text notion-block-5bd260919c4d41798b2029f9df2cdd99">这里的 <code class="notion-inline-code">Rx_Size</code> 为 200</div><div class="notion-text notion-block-3bdb48b64f874fd5bf758c40ab42ae96">因此我们需要在UART.h  头文件中添加结构体对外声明<code class="notion-inline-code">extern UART_HandleTypeDef Uart1;</code></div></ul></ul><ul class="notion-list notion-list-disc notion-block-f3d619a0c0ba40bda74ba5a7b8788500"><li>接收串口的函数会有 四个返回值：</li><ul class="notion-list notion-list-disc notion-block-f3d619a0c0ba40bda74ba5a7b8788500"><li>HAL_OK、  代表此次在200ms内接受到了 200 字节。 （也就是与预计相等） </li><li>HAL_ERROR 、代表传参错误、 比如超时时间为0、或者数据缓冲区地址为空</li><li>HAL_TIMEOUT 、代表未能在规定时间内接收到 200 个字节</li><ul class="notion-list notion-list-disc notion-block-b88dcb6795ca45e891ac20eaf9064d22"><li>往往分为两种情况： 1、接收了但没接收完、2、一点没接收</li></ul><li>HAL_BUSY、代表已经在接受了。你别来烦我</li></ul></ul><div class="notion-text notion-block-7149ffa090ae4066b21332f0fff19ae2">下面可以看代码来分析</div></div></details></div></details><details class="notion-toggle notion-block-1fb2550b07bf4d19a25b966383cc7abe"><summary><h3 class="notion-h notion-h2 notion-block-1fb2550b07bf4d19a25b966383cc7abe" data-id="1fb2550b07bf4d19a25b966383cc7abe"><span><div id="1fb2550b07bf4d19a25b966383cc7abe" class="notion-header-anchor"></div><span class="notion-h-title">三、HAL库：阻塞轮询方式 实现串口2、3 和串口1重映射</span></span></h3></summary><div><details class="notion-toggle notion-block-ed08692df502477cbaedad76968ee41a"><summary><h4 class="notion-h notion-h3 notion-block-ed08692df502477cbaedad76968ee41a" data-id="ed08692df502477cbaedad76968ee41a"><span><div id="ed08692df502477cbaedad76968ee41a" class="notion-header-anchor"></div><span class="notion-h-title">1. 引脚定义</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-7ebcb4f5f81f4d0081aa9228783e7a5c"><li><b>USART1</b>：</li><ul class="notion-list notion-list-disc notion-block-7ebcb4f5f81f4d0081aa9228783e7a5c"><li><b>TX</b>：PA9    可重映射为 PB 6</li><li><b>RX</b>：PA10  可重映射为 PB 7</li></ul></ul><ul class="notion-list notion-list-disc notion-block-e486c43ec959419c8913cb7ae884c53f"><li><b>USART2</b>：</li><ul class="notion-list notion-list-disc notion-block-e486c43ec959419c8913cb7ae884c53f"><li><b>TX</b>：PA2</li><li><b>RX</b>：PA3</li></ul></ul><ul class="notion-list notion-list-disc notion-block-5b66c287ed54481d9fd423433d04cc93"><li><b>USART3</b>：</li><ul class="notion-list notion-list-disc notion-block-5b66c287ed54481d9fd423433d04cc93"><li><b>TX</b>：PB10</li><li><b>RX</b>：PB11</li></ul></ul></div></details><details class="notion-toggle notion-block-7d01d4f7d8d84617a6abda9f87749ed1"><summary><h4 class="notion-h notion-h3 notion-block-7d01d4f7d8d84617a6abda9f87749ed1" data-id="7d01d4f7d8d84617a6abda9f87749ed1"><span><div id="7d01d4f7d8d84617a6abda9f87749ed1" class="notion-header-anchor"></div><span class="notion-h-title">2. 关键代码：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-163c66fdf864417bb49b42732d841241"><li>如果需要重映射，则还需要打开AFIO的时钟和 使用重映射 API：</li><ul class="notion-list notion-list-disc notion-block-163c66fdf864417bb49b42732d841241"></ul></ul></div></details><details class="notion-toggle notion-block-847cbbce6b544e2f8ddbdbc4aba8a5ff"><summary><h4 class="notion-h notion-h3 notion-block-847cbbce6b544e2f8ddbdbc4aba8a5ff" data-id="847cbbce6b544e2f8ddbdbc4aba8a5ff"><span><div id="847cbbce6b544e2f8ddbdbc4aba8a5ff" class="notion-header-anchor"></div><span class="notion-h-title">3. 串口1、2、3、初始化部分：</span></span></h4></summary><div><div class="notion-text notion-block-eb7aa957696f4fe39f4b9c9bbbc88661">与之前的无异，只是添加拷贝了三次</div></div></details><details class="notion-toggle notion-block-7396c9a21bff4638950cbcb34ca93731"><summary><h4 class="notion-h notion-h3 notion-block-7396c9a21bff4638950cbcb34ca93731" data-id="7396c9a21bff4638950cbcb34ca93731"><span><div id="7396c9a21bff4638950cbcb34ca93731" class="notion-header-anchor"></div><span class="notion-h-title">4. 主函数部分</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-65a1fa69a2984087b1c43f713f5ab299"><li>与之前的一样，想使用什么修改下”UartX“参数就行，</li></ul></div></details></div></details><details class="notion-toggle notion-block-8458ffb31e8b4b7c80236306d55eb6b9"><summary><h3 class="notion-h notion-h2 notion-block-8458ffb31e8b4b7c80236306d55eb6b9" data-id="8458ffb31e8b4b7c80236306d55eb6b9"><span><div id="8458ffb31e8b4b7c80236306d55eb6b9" class="notion-header-anchor"></div><span class="notion-h-title">四、HAL库：中断方式 实现串口1 定长数组异步收发</span></span></h3></summary><div><div class="notion-text notion-block-3a4240fa890c45798bb9e7afb3ba8b52"><b>我们就使用上一小节所讲的多指针定位+循环收发缓冲区方案设计，来实现这次的中断接收~</b></div><details class="notion-toggle notion-block-90a9cca94981493db84ff0a88e34e953"><summary><h4 class="notion-h notion-h3 notion-block-90a9cca94981493db84ff0a88e34e953" data-id="90a9cca94981493db84ff0a88e34e953"><span><div id="90a9cca94981493db84ff0a88e34e953" class="notion-header-anchor"></div><span class="notion-h-title">1. 注意事项</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-566d8baad81f4599aadb038d30326538" style="list-style-type:decimal"><li>HAL库为 串口中断提供了很多回调函数。 比如 错误回调、半完成回调、Rx、Tx完成回调。你需要用什么回调，就声明什么回调~</li><ol class="notion-list notion-list-numbered notion-block-566d8baad81f4599aadb038d30326538" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-f2a250e82cf84debb39d108a8770706e"><li>这里只用了接收完成回调函数：<code class="notion-inline-code">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</code></li><ul class="notion-list notion-list-disc notion-block-f2a250e82cf84debb39d108a8770706e"><div class="notion-text notion-block-e1c66de61d7248e3b05cc1a6c694ca97">其中“RxCpltCallback” 可以分解为以下部分：</div><li>“Rx” 通常代表 “Receive”，即接收。</li><li>“Cplt” 通常代表 “Complete”，即完成。</li><li>“Callback” 即回调，指的是当某个特定事件发生时被调用的函数。</li></ul></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-6355cd728399451b91471730c078b591" style="list-style-type:decimal"><li><b>我们在回调函数中。</b>
我们将接收缓冲区的数据memcpy到 发送缓冲区。
并置 接收完成标志位。 
在主函数中，只需要循环检测 标志位 后 并发送发送缓冲区中的数据就可以完成接收并发送数据了。
<b>中断接收在接收到数据之后  需要在回调函数中要重新打开。 因为中断接收一次会自动关闭</b></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-5f762beec71b491da3019ce883b8374c" style="list-style-type:decimal"><li>在使用UART 的IT 接收时。要配置NVIC   ：USART 线的 优先级和  使能USART线</li><ol class="notion-list notion-list-numbered notion-block-5f762beec71b491da3019ce883b8374c" style="list-style-type:lower-alpha"></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-7a2b738377a246899a12e6aae037bbf3" style="list-style-type:decimal"><li>这里的定长，是因为中断只有接收到20个字节之后，才会进入回调函数</li></ol></div></details><details class="notion-toggle notion-block-86f3fdf476cf4e6ca4b069688a381d3a"><summary><h4 class="notion-h notion-h3 notion-block-86f3fdf476cf4e6ca4b069688a381d3a" data-id="86f3fdf476cf4e6ca4b069688a381d3a"><span><div id="86f3fdf476cf4e6ca4b069688a381d3a" class="notion-header-anchor"></div><span class="notion-h-title">2. 初始化UART1部分</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-e6706331066e4e8ab4201883746267f7"><li>主要关注中断 完成接收回调函数部分。
主要完成了数据cpy 和置位接收状态以及 重新启动接收数据。</li></ul><ul class="notion-list notion-list-disc notion-block-9ade1289c3da420caf34caf1b677ca65"><li>以及关注定义的接收、发送缓冲区和Rx_Date接收状态标志位</li></ul></div></details><details class="notion-toggle notion-block-ca0ba83fd38b499da48fc779f4d94c07"><summary><h4 class="notion-h notion-h3 notion-block-ca0ba83fd38b499da48fc779f4d94c07" data-id="ca0ba83fd38b499da48fc779f4d94c07"><span><div id="ca0ba83fd38b499da48fc779f4d94c07" class="notion-header-anchor"></div><span class="notion-h-title">3. UART硬件初始化回调</span></span></h4></summary><div></div></details><details class="notion-toggle notion-block-d2151e7088894e228d9d29509ddb826e"><summary><h4 class="notion-h notion-h3 notion-block-d2151e7088894e228d9d29509ddb826e" data-id="d2151e7088894e228d9d29509ddb826e"><span><div id="d2151e7088894e228d9d29509ddb826e" class="notion-header-anchor"></div><span class="notion-h-title">3. 回调函数部分</span></span></h4></summary><div></div></details></div></details></div></details><div class="notion-text notion-block-3720227470b34feebf0e383ae5d4fd86">/<em> 强声明的错误回调函数 </em>/</div><div class="notion-text notion-block-374b6c166ddf46859f7ad36561a146bd">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-17e6baec58214eb4bd7753be2b1308d8">{<div class="notion-text-children"><div class="notion-text notion-block-75ca4ac0da4a4b54a44c86e0636c1567">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-5560bd3767914fa58c295f432110183b">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-e18b6b24f8584f15898a10e74988741e">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-e8f77182a97c43bf8b6bf175a540c150">}</div></div></div></div></div><div class="notion-text notion-block-0c0add5541db4e618b29ed62bdec4744">}</div><div class="notion-text notion-block-840cf69946de40ed9982fcdd20661439">/<em> 强声明的发送完成回调函数 </em>/</div><div class="notion-text notion-block-c2df685b7a0a421da554a0b4a40015e4">void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-6246725349bf46ce81ab0b135df260d2">{<div class="notion-text-children"><div class="notion-text notion-block-746ae7b5864741aea540714a9de8afa5">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-b9a50ab999a34f139c00ccbdd911e240">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-dca8b0138f964e759afae6ce39605ae5">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-97d3a57d71c34ec0a1888e71d14a0bc0">}</div></div></div><div class="notion-text notion-block-60322a1f8a1c423d8a452ad9aedd2e3a">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-7a33761054014be2bd520cd18031aecb">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-daa3a576a2684f128ccdfaf1af702f1a">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-10a7506582ea4fdc8779ee0db9b117b8">#include &quot;led.h&quot;</div><div class="notion-text notion-block-2186b897c4ff49218d88dd324771181a">#include &quot;key.h&quot;</div><div class="notion-text notion-block-b7cd34a40f6449438d3bd117bd4b4892">#include &quot;Uart.h&quot;</div><div class="notion-text notion-block-60b8d87593bb4d07a161660a1fb20bf9">/<em>函 数 名：HAL库：中断方式。实现UART串口数据收发。 定长  20字节 </em>/</div><div class="notion-text notion-block-12dfb5f9b55141f0a3f30afb61f480cb">int main (void)</div><div class="notion-text notion-block-f1108e3dc1f346a981bd9a174d81dc82">{<div class="notion-text-children"><div class="notion-text notion-block-40396e1d643c4d8295c42f91f9ed5e30">HAL_Init();//初始化HAL库</div><div class="notion-text notion-block-68d40a93d6684bc3a6374605767b37e4">RccClock_Init();//配置时钟树72M</div><div class="notion-text notion-block-16eb9e24fec44e6f9a1d046f619fc5a3">LED_Init();</div><div class="notion-text notion-block-f7172e76625244059c1fcc6046f8797d">Uart1_Init(921600);//初始化串口1</div><div class="notion-text notion-block-143211d944cd4c54bd6f86849ad29dc6">while(1)</div><div class="notion-text notion-block-fcf1f5ff56bb4695b3d8ee4007ebe358">{<div class="notion-text-children"><div class="notion-text notion-block-97210e25bb354d89b89d4528203ae8ad">if(Rx_Date == 1) //如果接收标志位置1 </div><div class="notion-text notion-block-2d8e78d9b15847069bfe2dcaadb281ae">{<div class="notion-text-children"><div class="notion-text notion-block-86d300dd3f2f4e48b5265530cc649e16">Rx_Date = 0;</div><div class="notion-text notion-block-1035f197b8c444ebb302abe6f2643e22">HAL_UART_Transmit_IT(&amp;Uart1,Tx_Buff,20);//发送 发送缓冲区的20个字节</div></div></div><div class="notion-text notion-block-fc6377a657bb4c78913670d484e726c1">}</div></div></div><div class="notion-text notion-block-314b28c5093d4ad4938be2a9f87d3f3e">}</div></div></div><div class="notion-text notion-block-3006cf363b524e7cb1f61c1321ae16c1">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-1a98f36ebb494868a45fc0d8a0a50ae6">/<em> 缓冲区宏定义 </em>/</div><div class="notion-text notion-block-34f4115101a1484dbdbce07159a71b94">#define U1_RX_SIZE 2048</div><div class="notion-text notion-block-27fa6ac41fc24884b78d29d284c0cd7d">#define U1_TX_SIZE 2048</div><div class="notion-text notion-block-4eff47838ce945298537e9f5a5955ba5">#define U1_RX_MAX  256          //这里需要注意，我们是利用空闲中断对数据进行处理，不能单次发送256字节，否则进入完成中断<div class="notion-text-children"></div></div><div class="notion-text notion-block-b581de85b1724c3db470a87b8bedc6cd">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-814111258ae84436a00cfb660bec0054">uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-23099e3e24b0437eb9c564f918a8ea73">uint8_t U1_Tx_Buff[U1_TX_SIZE];<div class="notion-text-children"></div></div><div class="notion-text notion-block-d5224468a67b4777b57030202118b0d8">/<em> Location Ctrl Block </em>/</div><div class="notion-text notion-block-078e16f6a19f4473accf8939fc4adf94">/<em> （接收/发送）位置控制块 </em>/</div><div class="notion-text notion-block-fbb86f1b0c464fcea298fbea81e0a090">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-5b9060b8745644779e3e7d60993a253a">uint8_t* start;</div><div class="notion-text notion-block-53bdfa57b13f49aa8c5bad4e4b26ba08">uint8_t* end;</div></div></div><div class="notion-text notion-block-919b998359fa436da4891da20f9cc1ce">}LCB;<div class="notion-text-children"></div></div><div class="notion-text notion-block-529a835b40e24044a69f8701a3183c8b">/<em> Uart Ctrl Block </em>/</div><div class="notion-text notion-block-b9ad666b65784489a22976f42262b603">/<em> 串口控制块 </em>/</div><div class="notion-text notion-block-58a8ebb7790547309d0b40cc5540b78f">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-f1ddad974d9a4c8091a3d85bb6e27439">uint32_t    rxCount;            //记录接收缓冲区中当前已有的数据量</div><div class="notion-text notion-block-3038c2fc8d28422cbcdfcf3ad630c22d">uint32_t    txCount;            //记录发送缓冲区中当前已有的数据量</div><div class="notion-text notion-block-c2ec31fd13c94b2dbcbc907ecb840ccf">LCB         rxLocation[10];     //记录接收缓冲区每次接收的位置</div><div class="notion-text notion-block-c6a7c677bb7a404e80052ccf9699ea24">LCB         txLocation[10];     //记录发送缓冲区每次接收的位置</div><div class="notion-text notion-block-a1efb02a7c9d47dca71fb862be340734">LCB*        rxInPtr;            //指向下次接收缓冲区存放位置</div><div class="notion-text notion-block-26460314a49041e09bb436500f9d840f">LCB*        rxOutPtr;           //指向下次接收缓冲区读取位置</div><div class="notion-text notion-block-f78450cfa6e343ca8b18a90aa088deec">LCB*        rxEndPtr;           //指向接收缓冲区结束位置</div><div class="notion-text notion-block-d322e53750754a18885c3b0547335eff">LCB*        txInPtr;            //指向下次发送缓冲区存放位置</div><div class="notion-text notion-block-d1a7c99557d24eecb73bacc8c1a6ca79">LCB*        txOutPtr;           //指向下次发送缓冲区读取位置</div><div class="notion-text notion-block-fac3aa6263cc48038bd400f388cca529">LCB*        txEndPtr;           //指向发送缓冲区结束位置</div><div class="notion-text notion-block-17f56b00d2984da892cebd75b7c870a8">UART_HandleTypeDef  uart;       //串口总控结构体</div><div class="notion-text notion-block-9bae3463085b42cda48102affc949e24">uint8_t     TxState;            //发送忙碌标志位</div></div></div><div class="notion-text notion-block-1135a67c48744ce08047bce3a2e7aa33">}UCB;<div class="notion-text-children"></div></div><div class="notion-text notion-block-50da2876c37e4299801144c06ab37e76">/<em> 初始化 </em>/</div><div class="notion-text notion-block-b7cc4a7a9ab541f8bccd5f7ae05ac127">void U1_Init(uint32_t bandrate);</div><div class="notion-text notion-block-ea481b40babb43d1be316abd18ebef2b">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-e7e16346ce594c899dcfc605c48a7d77">void U1_PtrInit(void);</div><div class="notion-text notion-block-8329258053d745a5b680793d342b581d">/<em> 转移RxBuff数据到TxBuff </em>/</div><div class="notion-text notion-block-16472214ccfa47d196e2c1149da1c098">void U1_DataRxToTx(uint8_t* data, uint32_t data_len);</div><div class="notion-text notion-block-866dc2edeec44c0e9b863093c19aa30a">/<em> 总控结构体 </em>/</div><div class="notion-text notion-block-441e4728b1194c59a56670f559fc2aa0">extern UCB  uart1;</div><div class="notion-text notion-block-6dc77a9b1407491494185652161e4792">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-d6951195357e473d8ad25f249584eb15">extern uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-4a0476a2ad78417ea2b1fed10a7a9298">extern uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-59722d9f2c574ba7afedd7213f529481">/<em> 状态位 </em>/</div><div class="notion-text notion-block-f265dbafede2444bb10b39552afc97ef">extern uint8_t rxState;<div class="notion-text-children"></div></div><div class="notion-text notion-block-154daf40fecc4d1bb0a56de0e7430706">#ifndef __UART_H</div><div class="notion-text notion-block-ef67f6aeb2674aecaef2c440fc5cd0f7">#define __UART_H</div><div class="notion-text notion-block-fe3eebbfdea742a9b993a36f124d70aa">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-3c0059c2141d44c09ac090227e138de9">#include &quot;stdint.h&quot;</div><div class="notion-text notion-block-fd41ea72477e4e899fb150c7c0485d16">#include &quot;string.h&quot;</div><div class="notion-text notion-block-e7782893842648b2acb5a564cef10917">/<em> 缓冲区宏定义 </em>/</div><div class="notion-text notion-block-c607d5e441464ac1a6df5e56e79c8a6c">#define U1_RX_SIZE 2048</div><div class="notion-text notion-block-0120fc84df344aa5b1a9d71b20dd2005">#define U1_TX_SIZE 2048</div><div class="notion-text notion-block-77fe8fbe76d44f52a8f37fb4edca0adf">#define U1_RX_MAX  256          //这里需要注意，我们是利用空闲中断对数据进行处理，不能单次发送256字节，否则进入完成中断</div><div class="notion-text notion-block-55578f65d6f24a65b263938f524d3c88">/<em> Location Ctrl Block </em>/</div><div class="notion-text notion-block-f5916272e3494c40832c9d24463baaf7">/<em> （接收/发送）位置控制块 </em>/</div><div class="notion-text notion-block-282d0ca3053b4fc0b9706b5227ecc7bb">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-2c3299ee6e1242fab596040fd2e62fb9">uint8_t* start;</div><div class="notion-text notion-block-7c86143c408149558c183aace0df4cb6">uint8_t* end;</div></div></div><div class="notion-text notion-block-8b91e300d22c419c989bef9df52b1452">}LCB;</div><div class="notion-text notion-block-82bee5e74dc643639b8cda9d945f9334">/<em> Uart Ctrl Block </em>/</div><div class="notion-text notion-block-b39ad27959554cb98b076d3bff6ab02b">/<em> 串口控制块 </em>/</div><div class="notion-text notion-block-ee7d3861d41747fc803ebbd649aaddf8">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-675461910dc349e8bee55648f36339db">uint32_t    rxCount;            //记录接收缓冲区中当前已有的数据量</div><div class="notion-text notion-block-d0023e536cd748358377e7d9bf841963">uint32_t    txCount;            //记录发送缓冲区中当前已有的数据量</div><div class="notion-text notion-block-3ba74c647c0d452c8877640488ae2360">LCB         rxLocation[10];     //记录接收缓冲区每次接收的位置</div><div class="notion-text notion-block-c1fc1eb1c9e047e98e8834c0ce89d97c">LCB         txLocation[10];     //记录发送缓冲区每次接收的位置</div><div class="notion-text notion-block-7c442c6a7e8442d5acd07cc311f8f2a0">LCB*        rxInPtr;            //指向下次接收缓冲区存放位置</div><div class="notion-text notion-block-91131b8f6f9049169d50a6e668e6b4af">LCB*        rxOutPtr;           //指向下次接收缓冲区读取位置</div><div class="notion-text notion-block-f3d83d6d88564cde93f816a1ef1b0a4f">LCB*        rxEndPtr;           //指向接收缓冲区结束位置</div><div class="notion-text notion-block-5a126474019041708bc7d390751dc4d2">LCB*        txInPtr;            //指向下次发送缓冲区存放位置</div><div class="notion-text notion-block-6ba34a4ef6464852a8e3acfe20fbc185">LCB*        txOutPtr;           //指向下次发送缓冲区读取位置</div><div class="notion-text notion-block-d6995cf498aa44d7a6d4ee3091d8486a">LCB*        txEndPtr;           //指向发送缓冲区结束位置</div><div class="notion-text notion-block-71df8c98e7904a64aad67ff85c4a1b3e">UART_HandleTypeDef  uart;       //串口总控结构体</div><div class="notion-text notion-block-a9f3d093126542f49f9f6e1888082c2f">uint8_t     TxState;            //发送忙碌标志位</div></div></div><div class="notion-text notion-block-4ecf8d20d83e4502ab44c910ebb79b08">}UCB;</div><div class="notion-text notion-block-e83ec519c69e416e98d6a709ea0a0a62">/<em> 初始化 </em>/</div><div class="notion-text notion-block-43085de7a7d0473b90344ab8ae110e41">void U1_Init(uint32_t bandrate);</div><div class="notion-text notion-block-54360bbab337421aaefc9d2795909a50">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-792f333a6db748e8bb0638ff1e428d3f">void U1_PtrInit(void);</div><div class="notion-text notion-block-a9d4a6387e58436ba798d45062b72539">/<em> 转移RxBuff数据到TxBuff </em>/</div><div class="notion-text notion-block-7211dea592e54207bd64fea7b7da2ecf">void U1_DataRxToTx(uint8_t* data, uint32_t data_len);</div><div class="notion-text notion-block-638a961ecce04a6cb85a589925a6ed45">/<em> 总控结构体 </em>/</div><div class="notion-text notion-block-a6c76fb87d8245b0b1cf111c0f3ecc72">extern UCB  uart1;</div><div class="notion-text notion-block-a69f50746e954b24aef81a5035dd22e2">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-0a45bf7891164e8886107a2294c7a2a7">extern uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-5342a900ddb54273bcb493bcf5a6dc2a">extern uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-3e8f0553f84a47298b74a2af7bc26ccc">/<em> 状态位 </em>/</div><div class="notion-text notion-block-e06a54f5a0d14f31b34f514963da1af4">extern uint8_t rxState;</div><div class="notion-text notion-block-c0db407fc3bb4977bd5931a704e84ed4">#endif<div class="notion-text-children"></div></div><div class="notion-text notion-block-babc5f247ba644a7bc0b27bb8eb4d170">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-4919b42d7d424c40bb3fe461bd0d43ec">/<em> 创建串口总控结构体 </em>/</div><div class="notion-text notion-block-de6dec4fdce242b9b73ff514551f34b1">UCB uart1;</div><div class="notion-text notion-block-818d5209a536474e876ea034842b7b73">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-dd4a077272474dcda921799df09935a4">uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-dfa2540663de4c38b34bfc45e190bb5f">uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-34b2900d711a42acbd4265ae253cfa43">/<em> 初始化串口 </em>/</div><div class="notion-text notion-block-ee881a6763104075bc67a8c6fb493da3">void U1_Init(uint32_t bandrate){<div class="notion-text-children"><div class="notion-text notion-block-1569a5ed9b674d32a32a3b4f2504ccf2">uart1.uart.Instance = USART1;                    //使用那个串口</div><div class="notion-text notion-block-10c110a95f19438182c9802dbeac61a1">uart1.uart.Init.BaudRate = bandrate;             //波特率</div><div class="notion-text notion-block-3d53d0ba15fe4074940ba6e9020f7256">uart1.uart.Init.WordLength = UART_WORDLENGTH_8B; //数据位长度</div><div class="notion-text notion-block-e3f1a5bb0695494e83db5275fa517577">uart1.uart.Init.StopBits = UART_STOPBITS_1;      //停止位</div><div class="notion-text notion-block-ba033124d09b47c0b8781ef49737b7aa">uart1.uart.Init.Parity = UART_PARITY_NONE;       //校验模式</div><div class="notion-text notion-block-9c63177ef96b46aab72d02cc22d52040">uart1.uart.Init.Mode = UART_MODE_TX_RX;          //传输模式</div><div class="notion-text notion-block-c4ec23fdf68d499a9bb5ed3a9215edbd">uart1.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE; //流控</div><div class="notion-text notion-block-88ec2b4ebda240798a324a712b9dffcc">HAL_UART_Init(&amp;uart1.uart);</div><div class="notion-text notion-block-6651531cc33443389699370eda01eb11">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-f4f3fae95fd7420eae552aad19cd0fe4">U1_PtrInit();</div><div class="notion-text notion-block-309d0a2c018641f4a3994cfa3843ef83">/<em> 打开空闲中断 </em>/</div><div class="notion-text notion-block-fee526be864240efa2ed5f12cf1045eb">__HAL_UART_ENABLE_IT(&amp;uart1.uart,UART_IT_IDLE);</div><div class="notion-text notion-block-df8d9e63709942aea319b1421200d76d">/<em> 开始接收数据 </em>/</div><div class="notion-text notion-block-347b91465e894b9fae20f30481b66408">HAL_UART_Receive_IT(&amp;uart1.uart, uart1.rxInPtr-&gt;start, U1_RX_MAX);  //接收位置为当前LCB位置控制块的In指针所指向的缓冲区的位置</div></div></div><div class="notion-text notion-block-4bfbaeddfa3640ba9eba6180b037092b">}</div><div class="notion-text notion-block-57eb3744e23a4260a92db12207e3ef35">/<em> 初始化U1_UCB控制块指针 </em>/</div><div class="notion-text notion-block-f23e110584cc4509aa922a8118374540">void U1_PtrInit(void){<div class="notion-text-children"><div class="notion-text notion-block-1a9aa7359f3c464184ebc0848dc0cda1">uart1.rxCount  = 0;</div><div class="notion-text notion-block-c3bec637279c4240a0d17d7984a2ea79">uart1.rxInPtr  = &amp;uart1.rxLocation[0];</div><div class="notion-text notion-block-15263c7c537e4b4c805d2e8c790f3305">uart1.rxOutPtr = &amp;uart1.rxLocation[0];</div><div class="notion-text notion-block-3418e006ff6f4aceafea5dfbdaa98885">uart1.rxEndPtr = &amp;uart1.rxLocation[9];</div><div class="notion-text notion-block-a8d359c973564bb7a41c06f648bd680a">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[0];      //让当前接收位置控制块的start，指向下一次接收到的数据将要存放的位置</div><div class="notion-text notion-block-402e6c90c46d43b8ba0764f195dd5d4a">uart1.txCount  = 0;</div><div class="notion-text notion-block-c1febd4cd33b46bd9af12d90d46d0356">uart1.txInPtr  = &amp;uart1.txLocation[0];</div><div class="notion-text notion-block-89f51a3eaec645de9c0af2cc6120e2e9">uart1.txOutPtr = &amp;uart1.txLocation[0];</div><div class="notion-text notion-block-052fe94e9dd84479a3080378ef2b09a5">uart1.txEndPtr = &amp;uart1.txLocation[9];</div><div class="notion-text notion-block-cbc73fe8be7d4be88b229605ac8e9958">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[0];      //让当前发送位置控制块的start，指向下一次需要发送的数据的存放位置</div></div></div><div class="notion-text notion-block-60beca50a8094fcba72507a475e0bb44">}</div><div class="notion-text notion-block-eb00cf77a0214514bfb97d98f46a218d">/<em> 转移U1_Rx_Buff数据到 U1_Tx_Buff </em>/</div><div class="notion-text notion-block-fd01508098394d9fb29d7914f948f25b">void U1_DataRxToTx(uint8_t* data, uint32_t data_len){<div class="notion-text-children"><div class="notion-text notion-block-efc05daf11a3478a9e9dd9cf3911df54">/<em> 判断剩余空间是否足够，要不要回卷 </em>/</div><div class="notion-text notion-block-bc17a8b49c814ae28534671861b08610">if((U1_TX_SIZE - uart1.txCount) &gt; data_len){    <div class="notion-text-children"><div class="notion-text notion-block-eb71803c95c347cc9656500b8ccc001c">/<em> 如果够 </em>/</div><div class="notion-text notion-block-3305bf6783534fc9b5838da2137041b2">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[uart1.txCount];</div></div></div><div class="notion-text notion-block-2870748587b94b62b8a3d59d2800e769">}</div><div class="notion-text notion-block-412fb1deb7c648558ba919a50ed6e687">else{/<em> 如果剩余空间不够 </em>/<div class="notion-text-children"><div class="notion-text notion-block-c145d54349d842c7a9ab1c2bc3bcbce8">uart1.txCount = 0;</div><div class="notion-text notion-block-6d17b293dd65415d84a02e0a7845e5a4">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[0];</div></div></div><div class="notion-text notion-block-48fdf47491fe4019a49584eee5a67067">}</div><div class="notion-text notion-block-9ae00b7c9f324b6c8ef6b24ef6b32fbf">/<em> 复制data到U1_Tx_Buff缓冲区 </em>/</div><div class="notion-text notion-block-75ff8547214347f38374fb317ef7f993">memcpy(uart1.txInPtr-&gt;start, data, data_len);</div><div class="notion-text notion-block-b3dbd9bcd004458395781059053b67ce">/<em> 累加txCount </em>/</div><div class="notion-text notion-block-26ee4d2b5e63436eae6a46dc7122920e">uart1.txCount += data_len;</div><div class="notion-text notion-block-1cbe8605f2a644e799446def9161c010">/<em> 标记这次的发送数据的结束位置 </em>/</div><div class="notion-text notion-block-05713967067841b78508a173a6c7682a">uart1.txInPtr-&gt;end = &amp;U1_Tx_Buff[uart1.txCount - 1];</div><div class="notion-text notion-block-aee230d8b19d416d92e53c8ae53e31b1">/<em> 移动txIn </em>/</div><div class="notion-text notion-block-47185b7dbd1e4544ad67783009cc3395">uart1.txInPtr++;</div><div class="notion-text notion-block-e567d29756a64d17b00d776f20dd87b8">/<em> 判断txIn指针是否需要回卷 </em>/</div><div class="notion-text notion-block-49b33389b19649c6bbe11474a46b5309">if(uart1.txInPtr == uart1.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-01b33aa232a5406fbb41d3b70140efb4">uart1.txInPtr = &amp;uart1.txLocation[0];</div></div></div><div class="notion-text notion-block-2ea0b6cc2b6041d58f887f07df1edbf0">}</div></div></div><div class="notion-text notion-block-e0cfc7e55200429994320b11d5146ed9">}</div><div class="notion-text notion-block-092629f6a6c547abbe7db9f6fafa7cef">/<em> UART硬件初始化回调 </em>/</div><div class="notion-text notion-block-332fa9fc0bc943ddae13baa566431e31">void HAL_UART_MspInit(UART_HandleTypeDef *huart){<div class="notion-text-children"><div class="notion-text notion-block-96b3a22bcf0146c49fa59d36b48dd904">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-7265f94f5d3c4a1aaa7a1500132dac46">if(huart-&gt;Instance == USART1){          //判断那个串口在进行初始化<div class="notion-text-children"><div class="notion-text notion-block-f92981ccec7b407ca40f464ae85e3993">__HAL_RCC_USART1_CLK_ENABLE();</div><div class="notion-text notion-block-ebe6f044bd914ce9b8300ff5a9fc11fa">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-7e64489aac6d4f96b6ab244261d3a2d0">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_9;</div><div class="notion-text notion-block-6285624d487a4452ab758dd2e5cabc06">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-343d47a5cab342f88fb1483dbecc3d6b">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-ad4ee7ac93b745759042c50b49ccf573">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-f72a6ed8f5a34d8180fea6179e6fec24">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-31089de4175141faa2dfb4cf61bc2896">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-a07a38c9e44a48eb873b8fe926d5b7f2">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-a8d177d8011a440f9606c4daafee9037">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-f96bb24ea7514b42bca9dd24c02a7df5">//打开了串口1的总中断</div><div class="notion-text notion-block-c9680ca831f14ca7b8e7da6dd74d79ac">HAL_NVIC_SetPriority(USART1_IRQn,3,0);</div><div class="notion-text notion-block-f6ea785ec62d441c981ccc871c68386d">HAL_NVIC_EnableIRQ(USART1_IRQn);</div></div></div><div class="notion-text notion-block-a23151f9c6dd46e9a49508aab93b91d2">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-7dbf3307f0dc4962a705957bbb960b18">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-e3b26d07d47f45418c634ecce7195f42">__HAL_RCC_USART2_CLK_ENABLE();</div><div class="notion-text notion-block-b18163c3830b465dbb2af339cc8cb5aa">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-ed68170969f245878d23fa262d9eacef">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-597c6c01a5e542e09ebaa6c415731a1b">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-392cfe86a2644c5e86891e53a23b1201">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-d85ed2a5a39645c99bc2e7cfcf315fe9">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-8a397442b29a4c77a9ded3c80d31d539">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-edc9f6a362a44126a1d83a757db62d54">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-56632a8b9b7d492db876e7c5c89a3c4b">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-b3203ab7e3a94e13b635b6e8f3932159">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-41446fcc0fb94ca79bb145bd5065206d">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-d5cb558b98c3442abe2fd09177e3dacf">__HAL_RCC_USART3_CLK_ENABLE();</div><div class="notion-text notion-block-f258a1db7d1049a2bf2c0ec8acf273bc">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-a5b046eb6af141ee97181f1d75b1cff7">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-91a83c08619647a5811ee295b3f90bcb">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-dc5c686dd49e4095969aeaa28f1a7cde">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-ef027d155efb46c5b684931db0a4dc9d">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_11;</div><div class="notion-text notion-block-eb971c7988de40b1adf25e0366045eeb">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-4746490e2579444f86d600278e067e0b">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-784c6b678ef845658c785d8a74f1f79e">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-bd01f40f3d5d4bcda4961eba04cf9fdd">}</div></div></div><div class="notion-text notion-block-faf48478731f45deaf517d8e70eec74d">}</div><div class="notion-text notion-block-eb749a65ab774f18a77671bb7bef5149">/<em> 强声明的接收完成回调函数 </em>/</div><div class="notion-text notion-block-14d730975a0e4cc897c6d0a68fc57123">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-c50cfd2d631b4a8ea61c285a0d267da3">{<div class="notion-text-children"><div class="notion-text notion-block-7beb0534887646258227d59380202a2e">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-732d6bf49bf8489b962b1892018d6f55">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-3d06f55f27cb435a844c450fd40e9789">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-24ae7402ece546bbb947200a64d0b6bb">}</div></div></div><div class="notion-text notion-block-66394af4db4d4af59b20432a0a8c4f81">}</div><div class="notion-text notion-block-1a16784c34894d01a6d6711eb048387e">/<em> 强声明的错误回调函数 </em>/</div><div class="notion-text notion-block-c39cb8da27e74090b8a7b360cb239483">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-2e45ea3d33834b70b62829fd0c64d761">{<div class="notion-text-children"><div class="notion-text notion-block-e694e6f87c814e778052eb57a822d236">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-4d4fa1e627aa49e79a0afda154200017">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-03eee0e7b0d54154b4e08d8f2eeb30e7">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-5ef3fbb654e24d158bcabb83c1a31571">}</div></div></div></div></div><div class="notion-text notion-block-7483a0a68c91430f9e1b6f057e97a72a">}</div><div class="notion-text notion-block-1bf285632cad4a718184ddb45d929a82">/<em> 强声明的发送完成回调函数 </em>/</div><div class="notion-text notion-block-36ae18d99fc44f15937691ecddf20d82">void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-8d8925c2ab6d4fd998ad325008ccb2f3">{<div class="notion-text-children"><div class="notion-text notion-block-e183b2108c6f4b448f7a820016c34725">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-9966b083cd27405292d9c14c9d0bdb27">/<em> 发送完成，标志位清零 </em>/</div><div class="notion-text notion-block-93b569653aa544d1a18965f3259f5e43">uart1.TxState = 0;</div></div></div><div class="notion-text notion-block-fc7270df8d5b41449955712fba404cee">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-1115568f41824a1e92ae0568e654d4e6">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-fd1c5d8840884c7ca953725c98a6fddf">}</div></div></div><div class="notion-text notion-block-be3f2871f8b145e69dceceaeab63891f">}</div><div class="notion-text notion-block-fd222090f59b4ba5a2c82a61e014010a">/<em> 强声明的接收终止回调函数 </em>/</div><div class="notion-text notion-block-d84d1347392d48869374ab5abf1d38f3">void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-6c21a9e51a754c2ba17a742875f09e88">{<div class="notion-text-children"><div class="notion-text notion-block-79673c74666a41b0a2455a8c8457074d">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-d469df3d30194980a1bd66727e9f1981">/<em> 标记结束位置 </em>/</div><div class="notion-text notion-block-187546aaa6f04cbfbdb5f46c735f5e81">uart1.rxInPtr-&gt;end = &amp;U1_Rx_Buff[uart1.rxCount - 1];</div><div class="notion-text notion-block-4fc8ce12b6794f33b0ec4317a776c865">/<em> 挪动rxIn指针 </em>/</div><div class="notion-text notion-block-cd6af5f61fd64c839f462c8c452f8050">uart1.rxInPtr++;</div><div class="notion-text notion-block-86ecd1bffa00478bb225ffe3cd779d3b">/<em> 判断rxIn指针是否需要回卷 </em>/</div><div class="notion-text notion-block-bbb69a54934947b7a2d638320eca3424">if(uart1.rxInPtr == uart1.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-2dce47936897460db226b71ba5190def">uart1.rxInPtr = &amp;uart1.rxLocation[0];</div></div></div><div class="notion-text notion-block-4d221ee1010e4a22a70aeb77a4efd386">}</div><div class="notion-text notion-block-c65ef94555a34dc7a33cb3e7b27d3556">/<em> 判断接收缓冲区是否需要回卷 </em>/</div><div class="notion-text notion-block-5a36a12b830245789bccd94af12787d5">if((U1_RX_SIZE - uart1.rxCount) &lt; U1_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-e6ad4d1eacce4fdb8976187803bfdaf5">uart1.rxCount = 0;</div><div class="notion-text notion-block-09638fd0d9db472f84e8bc8556298974">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[0];</div></div></div><div class="notion-text notion-block-676a86113458474a81575a95b13a945e">}else{<div class="notion-text-children"><div class="notion-text notion-block-9b8a6a6657d248f89071eddd09b8b59e">/<em> 剩余位置够 </em>/</div><div class="notion-text notion-block-f511493dd8394652a46bac6913ef324d">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[uart1.rxCount];</div></div></div><div class="notion-text notion-block-026a6e6d3b1e409391c6afb8b217031c">}</div><div class="notion-text notion-block-dd5c7e1827ba48d992994814e99dc365">/<em> 重新开启中断接收 </em>/</div><div class="notion-text notion-block-308418a9b4404052a5600bc21a13df5b">HAL_UART_Receive_IT(&amp;uart1.uart, uart1.rxInPtr-&gt;start, U1_RX_MAX);</div></div></div><div class="notion-text notion-block-11161b32911c4710a6ede28d4a21eb79">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-035eb68e813644c0bdb162269fcf2ebd">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-ec05ae309d5146b690434534d562307e">}</div></div></div><div class="notion-text notion-block-1bb2f0e14a564b45b25635245f44b8f6">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-c2139b78e2f749ed9a42f698f1caa0b7">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-395d49ea1d0b405081dc681819e67d04">/<em>                                                 </em>/</div><div class="notion-text notion-block-da4aa5586bfa423f9482860545472e52">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-c535f6dedcb443c49154e8e22c09dcc0">/<em>                                                 </em>/</div><div class="notion-text notion-block-73252db5d054483091ef5879c368e2dd">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7a3b08bb51c7418e980922d140ddfd3e">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-075e8b1f27874d83bb5eb54e4205dc21">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-ccdd06a6505f479588d0004e2b6ffd58">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-75b965557ff44fada2a15fbd6b23dfaf">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-ba68f2fe81b142e4bb1b6231f2c2fc2c">{<div class="notion-text-children"><div class="notion-text notion-block-fdd014308ccf46b49162527a155b79fb">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);</div></div></div><div class="notion-text notion-block-45b892474eef41bdb1713b5df5b23ffa">}</div><div class="notion-text notion-block-78ad01958aa34cb1b24a4cba182d73a1">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-e59957a440ec4bba95b3bc9402da9f8d">{<div class="notion-text-children"><div class="notion-text notion-block-1a2cd1cc26b2419e816ea4a192365faa">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-f9c87c8d50e94a318118a7b577f1c45c">}</div><div class="notion-text notion-block-947c7fe13872403f820b8035385176ce">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-18448126ed574c059eef8365da4f9a30">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-f544a2ef8cea4c0785c2bb0780b77593">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-80b9bba6959f4b63a4e5f76fd01e321e">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-5f5326ef21e049b5b9cc698d0812bd2e">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-e94a973f1e774a25a9b631e32a71232e">void NMI_Handler(void)</div><div class="notion-text notion-block-2e81a9df902c4a1a8b99cb8bd05536bc">{</div><div class="notion-text notion-block-7454b7c4aae5489e9e974e7f8110e59e">}</div><div class="notion-text notion-block-6f72a90057e14edc8c0c65311dc50ad6">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-b159e58ea33947b7a20561aba3c42784">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-a6401ea606ac48d19a1512ea6548d64f">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-2d5c60cbb4174218a2fd68e3dcd9eea0">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-453da7bbb7114647aba4d94aa53e7a0d">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7a03416997b9475aaa7785bc6be98496">void HardFault_Handler(void)</div><div class="notion-text notion-block-3e3afbf6acfd4eb98d5c244708738d26">{</div><div class="notion-text notion-block-f639eb1d3742489dbde578bfd76c6e67">}</div><div class="notion-text notion-block-76ae1e7973d6427fb314f9f2dba6b315">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7a6bb87e054645baad72bd6a3fcdedd9">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-c4f98543ae1f4cadbe9bfedef6a1e454">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-ab8929f091b543ba9ca18b23ba025041">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-ed5a55b9cc1747959cc2b9aba91b9e2e">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-ef4f6457cf2c4d8ab742ac82ff2d79b5">void SVC_Handler(void)</div><div class="notion-text notion-block-dbd578e956424c1bacff27e049f5c7d0">{</div><div class="notion-text notion-block-ff36d3e89018446b84deeee50d38146b">}</div><div class="notion-text notion-block-63b3d1e77e4f42e1a0f2c148f29bcc56">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-1488e4d39efb47f3a0e8147ef4503511">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-cdaf5720a12349d0b5b677227887a243">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-519f37dd291044eca92c6f0a70494c38">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-02c3d204a80f462299c59a8f7617dbef">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d3c26e71e463413d9968845eb487f25f">void PendSV_Handler(void)</div><div class="notion-text notion-block-c80a239a1b3e498b8f04d80e479d295d">{</div><div class="notion-text notion-block-6bdf3e59d271466b9a636db078c57816">}</div><div class="notion-text notion-block-86f8798e6a054470b30eaa878411bbd2">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-e2420333c940429c9cd2c3d03d25991f">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-9e54ceb99f784b17b54102b41444df4f">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-1918fff464b54cb29fa5b244765fd8ac">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-b2204cb9bafb4fb5a40a66a87ccc7831">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7c0b8a6ab9bc4ff4be36a99ba0426efd">void SysTick_Handler(void)</div><div class="notion-text notion-block-2808922744c449959137041366930be2">{  <div class="notion-text-children"><div class="notion-text notion-block-e1b724d91d804a648fd211dad616f8cf">HAL_IncTick();</div></div></div><div class="notion-text notion-block-af7edc1b31204dcfac9813d85a80a075">}</div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[【Cursor 开发】Cursor配置 + WSL2 + 地区限制解决 + AI Coding 技巧]]></title>
            <link>https://www.mcoi.top/article/Post-cursor-wsl2-region-ai-coding</link>
            <guid>https://www.mcoi.top/article/Post-cursor-wsl2-region-ai-coding</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Cursor 编辑器配置、与 WSL2 结合使用、地区/网络限制的应对方式，以及 AI 辅助编码的实用技巧。]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-31ce940c69bb81768485cfd658fffa80"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><blockquote class="notion-quote notion-block-31ce940c69bb81f982c8e699a8f874fd"><div>这部分的实现方法实际上与 在WSL中打开trae、vscode窗口类似。都是找到它们的「启动脚本」即xx/bin/xx</div><div class="notion-text notion-block-31ce940c69bb8198b543f687e70c89e4">在之前的环境搭建也有提到<b><a class="notion-link" href="/31ce940c69bb8190a0b7dfc1323ecf40">【ESP-IDF环境】在Windows子系统WSL下搭建Ubuntu24.04的ESP32+vscode开发环境</a></b></div><div class="notion-text notion-block-31ce940c69bb8174a1e2d2eddd2db5df"><b>前提是在Cursor中安装了WSL插件</b>， 在类Vscode的软件中<b>安装插件快捷键为Ctrl+Shift+X</b></div><div class="notion-text notion-block-31ce940c69bb811ab60bc3c6a997c402">在 Windows 下使用 <b>Cursor</b> 打开并编辑 WSL2 内的项目，可以让你直接在 AI 辅助编辑器中进行 Linux 环境的开发。以下是配置与操作步骤。</div></blockquote><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-8eede07d12b74aa1844fbed3ad8a9309"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-cursor-wsl2-region-ai-coding/138532da-0063-218f-ed7c-49a47f4360c8.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=8eede07d-12b7-4aa1-844f-bed3ad8a9309" alt="notion image" loading="lazy" decoding="async"/></div></figure><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-31ce940c69bb814dba75d1c0227c566e" data-id="31ce940c69bb814dba75d1c0227c566e"><span><div id="31ce940c69bb814dba75d1c0227c566e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb814dba75d1c0227c566e" title="零、基础配置"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">零、基础配置</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb8178a77ee75ded2289d2" data-id="31ce940c69bb8178a77ee75ded2289d2"><span><div id="31ce940c69bb8178a77ee75ded2289d2" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb8178a77ee75ded2289d2" title="1. 【必选】设置隐私模式"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. <b>【必选】设置隐私模式</b></span></span></h3><div class="notion-text notion-block-31ce940c69bb8160a6efcd28df5b71c7">（主要保证项目内文件不被Cursor上传用于训练）</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-a165ddc80e3e4ac5bea39672940225db"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/misc/4a702508-7fe6-4727-b56e-427077fb45f0-4a702508-7fe6-4727-b56e-427077fb45f0.png?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=a165ddc8-0e3e-4ac5-bea3-9672940225db" alt="notion image" loading="lazy" decoding="async"/></div></figure><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81f9bcbafdadbb204395" data-id="31ce940c69bb81f9bcbafdadbb204395"><span><div id="31ce940c69bb81f9bcbafdadbb204395" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81f9bcbafdadbb204395" title="2. 【必看】可选但建议：添加【默认规则提示词】避免AI输出无用功"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 【必看】可选但建议：添加【默认规则提示词】避免AI输出无用功</span></span></h3><div class="notion-text notion-block-31ce940c69bb81e29438c868b136b02b">我这里自己改了一份提示词，可以用来参考：</div><div class="notion-text notion-block-31ce940c69bb811da32fdad58453c0c5">你可以把他配置到cursor的 Rules中。不用每次写在提示词里。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-087646df27a94925992d22f0087c3af5"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/misc/fc5462a5-fc5f-4999-8e8a-61fb17dfeb57-fc5462a5-fc5f-4999-8e8a-61fb17dfeb57.png?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=087646df-27a9-4925-992d-22f0087c3af5" alt="notion image" loading="lazy" decoding="async"/></div></figure><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81e88a80c4f2a8fcb334" data-id="31ce940c69bb81e88a80c4f2a8fcb334"><span><div id="31ce940c69bb81e88a80c4f2a8fcb334" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81e88a80c4f2a8fcb334" title="3. 【必看】：提问提示词"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">3. 【必看】：提问提示词</span></span></h3><div class="notion-text notion-block-31ce940c69bb817eb3d1e358e6aca481">我这里简单提供一个提问提示词模板，可以用来参考：</div><div class="notion-text notion-block-31ce940c69bb81d39c60f328a4dea8b1">这里我引入一个旨在为中文开发者和AI爱好者提供各种流行AI编程工具的系统提示词和模型设计文档的Github仓库：https://github.com/CreatorEdition/system-prompts-and-models-of-ai-tools-chinese</div><div class="notion-text notion-block-31ce940c69bb81fe9e60d76cbc530b81"><b>一个好的AI Coding，光打磨提示词都要占去大半的时间。</b></div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb8178ab25ef03a5cf2b5c" data-id="31ce940c69bb8178ab25ef03a5cf2b5c"><span><div id="31ce940c69bb8178ab25ef03a5cf2b5c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb8178ab25ef03a5cf2b5c" title="4. 可选：添加Chinese插件"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">4. 可选：添加Chinese插件</span></span></h3><div class="notion-text notion-block-31ce940c69bb814d8280d32a07f860e1">可以<b>按Ctrl+Shift+X打开插件市场…</b>下载后根据其README配置即可。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb812faaa3d795bfc46131" data-id="31ce940c69bb812faaa3d795bfc46131"><span><div id="31ce940c69bb812faaa3d795bfc46131" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb812faaa3d795bfc46131" title="5. 问题修复：针对大陆和香港地区不可用问题"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">5. <b>问题修复：针对大陆和香港地区不可用</b>问题</span></span></h3><div class="notion-text notion-block-31ce940c69bb81a0918aff71907e2ac7">Cursor对中国地区进行了限制，下面列出三种解决办法</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-31ce940c69bb81d59eb6d29aff21ae23" data-id="31ce940c69bb81d59eb6d29aff21ae23"><span><div id="31ce940c69bb81d59eb6d29aff21ae23" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81d59eb6d29aff21ae23" title="1. 推荐解决方案：Proxifier代理，稍复杂但速度快（Http 2.0）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. <b>推荐解决方案：Proxifier代理，稍复杂但速度快（Http 2.0）</b></span></span></h4><blockquote class="notion-quote notion-block-31ce940c69bb81228c43fb4a20c37e9b"><div>写在前面：<b>一定要先在WSL里Cursor . 连接好WSL 或 SSH连接上设备后再 打开Proxifier， 否则Cursor会连接不上 cursor-server。</b>（应该是Proxifier代理导致的，应该能细致写入一些规则避免，但我不会。。）</div><div class="notion-text notion-block-31ce940c69bb81d1b3fce9f33d1266c5">（ Proxifier 有一个免费的替代，github名为： proxifyre ，我没搞太清楚，听说这个比较好用。你们可以尝试一下）</div></blockquote><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81c7977fed377aed2ab5"><li>去官网下载<b><a class="notion-link" href="https://www.proxifier.com/download/" target="_blank" rel="noopener noreferrer">Proxifier安装包版</a></b></li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81c9b624f7e1be445dd0"><li>输入激活码：</li><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81c9b624f7e1be445dd0"><div class="notion-text notion-block-31ce940c69bb81e889d2c88e046a80a3">L6Z8A-XY2J4-BTZ3P-ZZ7DF-A2Q9C（Portable Edition）#免安装版本</div><div class="notion-text notion-block-31ce940c69bb81728e7fefb14adae2d0">5EZ8G-C3WL5-B56YG-SCXM9-6QZAP（Standard Edition）#安装版本</div><div class="notion-text notion-block-31ce940c69bb81ff9809df3047909a3d">P427L-9Y552-5433E-8DSR3-58Z68（MAC） #mac版本</div></ul></ul><hr class="notion-hr notion-block-31ce940c69bb81bfa4a1f1ef0bb67f3f"/><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81c6b791e1f76f6e3b90"><li><s><b>首先下载ProxifierPE</b></s></li><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81c6b791e1f76f6e3b90"><li><s>下载地址（汉化版）：</s><s><a class="notion-link" href="https://github.com/1564307973/Proxifier-CN/blob/main/ProxifierPE%20V4.14%20Chs.rar" target="_blank" rel="noopener noreferrer">https://github.com/1564307973/Proxifier-CN/blob/main/ProxifierPE%20V4.14%20Chs.rar</a></s></li><div class="notion-text notion-block-31ce940c69bb81d58872fa922b871422"><s>解压后将 Chs 文件夹里的 exe 覆盖程序文件夹的 exe 即可打开。</s></div><li><s>官方原版下载：</s><s><a class="notion-link" href="https://www.proxifier.com/download/ProxifierPE.zip" target="_blank" rel="noopener noreferrer">https://www.proxifier.com/download/ProxifierPE.zip</a></s></li></ul></ul><hr class="notion-hr notion-block-31ce940c69bb811b8a3ad85f736f5f7a"/><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81988213db26374669ff"><li><b>配置代理服务器</b></li><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81988213db26374669ff"><div class="notion-text notion-block-31ce940c69bb813b89bee5b31b83b6cb">然后打开Proxifier，根据图示进行（实际端口根据你自己的梯子端口修改）配置</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-afc6a62cd22143b9990d7f153a80fb21"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/misc/70326768-c745-48ae-b0d8-fff10ef3e5d7-70326768-c745-48ae-b0d8-fff10ef3e5d7.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=afc6a62c-d221-43b9-990d-7f153a80fb21" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81e9b6fdd98e77954ac0"><li><b>将规则加入配置服务器</b></li><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81e9b6fdd98e77954ac0"><li>参照图示顺序和内容添加规则即可</li><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-13802c4b13004e3fbf0da8d97f343ec5"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/misc/8f5bfedf-c04a-4591-b451-9cf083a58c68-8f5bfedf-c04a-4591-b451-9cf083a58c68.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=13802c4b-1300-4e3f-bf0d-a8d97f343ec5" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81939312ed7998d1f634"><li><b>最后打开梯子的全局代理模式，就能在HTTP Compatibility Mode 为 2.0 的情况下，愉快的使用AI编程了</b></li></ul><blockquote class="notion-quote notion-block-31ce940c69bb818cbc5ce649c133d5f7"><div><b>PE（便携）版本会有飞书、edge浏览器崩溃的状况（崩溃后无法打开），已经被我</b><s><b>划掉</b></s><b>了，留作备用吧。</b></div></blockquote><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-31ce940c69bb8192924eeb1584463790" data-id="31ce940c69bb8192924eeb1584463790"><span><div id="31ce940c69bb8192924eeb1584463790" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb8192924eeb1584463790" title="5.2 简单但速度稍慢的解决办法：在开启全局梯子之后，将HTTP Compatibility Mode 从2.0设置为 1.1 （如果1.1不行就设置1.0）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">5.2 简单但速度稍慢的解决办法：在开启全局梯子之后，将HTTP Compatibility Mode 从2.0设置为 1.1 （如果1.1不行就设置1.0）</span></span></h4><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-c2a5b37cce08430aa4b5032275d2d1d1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/misc/6be641b2-5ef0-4d5c-a335-1987a9d7d67d-6be641b2-5ef0-4d5c-a335-1987a9d7d67d.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=c2a5b37c-ce08-430a-a4b5-032275d2d1d1" alt="notion image" loading="lazy" decoding="async"/></div></figure><blockquote class="notion-quote notion-block-31ce940c69bb811db948e2a873badf97"><div>缺点：AI吐字有时速度很慢，有可能会吐一半就开始重连 或掉线</div></blockquote><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-31ce940c69bb8167a2d7e0ee86eed875" data-id="31ce940c69bb8167a2d7e0ee86eed875"><span><div id="31ce940c69bb8167a2d7e0ee86eed875" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb8167a2d7e0ee86eed875" title="5.3 简单但不一定有效的方法：虚拟网卡（TUN)+全局模式"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">5.3 简单但不一定有效的方法：虚拟网卡（TUN)+全局模式</span></span></h4><div class="notion-text notion-block-31ce940c69bb81b1822bd07d584eb91a">开启 梯子软件的 <b>虚拟网卡（TUN)+全局模式</b>，此时可以将HTTP Compatibility Mode设置为2.0此时可以将HTTP Compatibility Mode设置为2.0。 然后尝试使用。但不一定能成功。</div><blockquote class="notion-quote notion-block-31ce940c69bb81ce9ae4d20ddd9c01c4"><div>缺点：大部分人，例如我 就仍然没办法在HTTP 2.0 模式下 使用 TUN的方式使用Cursor，仍然提示地区不可用的问题</div></blockquote><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-31ce940c69bb8103ba90f4e4818fe3f8" data-id="31ce940c69bb8103ba90f4e4818fe3f8"><span><div id="31ce940c69bb8103ba90f4e4818fe3f8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb8103ba90f4e4818fe3f8" title="一、以Cursor启动并编辑 Linux 项目（别名方式）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">一、以Cursor启动并编辑 Linux 项目（别名方式）</span></span></h2><ol start="1" class="notion-list notion-list-numbered notion-block-31ce940c69bb8174a91cdffb71ad1b4c" style="list-style-type:decimal"><li><b>安装并配置 WSL2 环境</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb8174a91cdffb71ad1b4c" style="list-style-type:lower-alpha"><blockquote class="notion-quote notion-block-31ce940c69bb8192b3facecc8b9456fe"><div>不造轮子了，具体看这部分<a class="notion-link" href="https://acn3b01gv5s7.feishu.cn/docx/GUMsduRUtozDPLxMBDgcbQgJncf" target="_blank" rel="noopener noreferrer">【WSL环境】在Windows11环境下配置WSL Ubuntu24.04子系统</a></div><div class="notion-text notion-block-31ce940c69bb8196a68af889e8fd8841"><b>可选2部分不要做，替换为下面的部分</b></div></blockquote></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-31ce940c69bb819d822ae9a93f32aede" style="list-style-type:decimal"><li><b>安装 Cursor 并配置 PATH</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb819d822ae9a93f32aede" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81bd8dbac67591546437"><li>从 Cursor 官网下载安装 Windows 版本，并完成登录。</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81b3ba85f76708402c8c"><li>在 WSL 中编辑 <em><code class="notion-inline-code">~/.bashrc</code></em>，添加以下内容：</li><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81b3ba85f76708402c8c"><blockquote class="notion-quote notion-block-31ce940c69bb8135a401d87306401083"><div>需要根据实际安装的Cursor目录来替换中间的的<code class="notion-inline-code">d/LZJ_Software</code></div></blockquote></ul></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb819ea41be4ccb96dcab2"><li>保存后执行：</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-31ce940c69bb81e5bbfeeea04a80fcc6" style="list-style-type:decimal"><li><b>在 WSL2 中启动 Cursor 打开项目</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81e5bbfeeea04a80fcc6" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81838032ca384b49eca1"><li>切换到你的项目目录，例如：</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb815eb2a1ca00318bc5e6"><li>执行：</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81eca079c44418d3faa2"><li>Cursor 会在 Windows 中启动，并直接打开该 WSL 路径下的项目。</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-31ce940c69bb81628387d44c2b49848f" style="list-style-type:decimal"><li><b>可选：</b>Cursor区域限制解决方法， Cursor 提示：“Model not available“的原因</li></ol><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-31ce940c69bb81939f90e60ba80162f6" data-id="31ce940c69bb81939f90e60ba80162f6"><span><div id="31ce940c69bb81939f90e60ba80162f6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81939f90e60ba80162f6" title="二、SSH连接不上设备的解决办法（WSL同理）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">二、SSH连接不上设备的解决办法（WSL同理）</span></span></h2><ol start="1" class="notion-list notion-list-numbered notion-block-31ce940c69bb810abd08c79f3e7094c3" style="list-style-type:decimal"><li><b>手动获取 Cursor Server 压缩包</b></li></ol><div class="notion-text notion-block-31ce940c69bb81dc914ad4f4864083f4">从 Cursor 日志中提取 ARM64 版本的 Cursor Server 下载链接，在 Windows 本地下载对应的<code class="notion-inline-code">cursor-reh-linux-arm64.tar.gz</code>压缩包。</div><ul class="notion-list notion-list-disc notion-block-31ce940c69bb8160bd95d7f634adb0cb"><li><b>建立基础 SSH 连接并传输文件</b></li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81838a4fd52ff3585801"><li>在 Windows CMD 中先通过<code class="notion-inline-code">ssh lzj@192.168.137.187</code>建立与 OrangePi 的 SSH 连接（验证基础连通性）；</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81d49599f44bfb33db8d"><li>用<code class="notion-inline-code">scp</code>命令将本地下载的压缩包传输到 OrangePi 的<code class="notion-inline-code">~/.cursor-server/</code>目录：</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81d6b05dcab31eac10b8"><li><b>在 OrangePi 上解压并部署文件到指定路径</b></li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb8100a717e3630e10a507"><li>解压压缩包到<code class="notion-inline-code">~/.cursor-server/bin/linux-arm64/</code>目录；</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb8187a487d1f8e209819e"><li>创建 Cursor 日志中指定的哈希目录（要匹配 Cursor 的固定查找路径）：</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb819fa99ece86c1d1a99a"><li>将解压后的<code class="notion-inline-code">node</code>及所有文件移动到该哈希目录：</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81cb908ce4e2178a5fa2"><li>验证文件路径（确保<code class="notion-inline-code">node</code>文件存在）：</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb810bb83ac7cc1fa65dbe"><li><b>完成连接</b></li></ul><div class="notion-text notion-block-31ce940c69bb815784e2fc4fdde292a4">重新在 Cursor 中选择<code class="notion-inline-code">orangepi5Plus_computer_wifi</code>建立 SSH 连接，此时 Cursor 能识别到已部署的 Server，无需自动下载，直接连接成功。</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-31ce940c69bb8171a499c044ee1c4f68" data-id="31ce940c69bb8171a499c044ee1c4f68"><span><div id="31ce940c69bb8171a499c044ee1c4f68" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb8171a499c044ee1c4f68" title="三、【必看】AI使用/技巧"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">三、【必看】AI使用/技巧</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb812da5f3de333db53b13" data-id="31ce940c69bb812da5f3de333db53b13"><span><div id="31ce940c69bb812da5f3de333db53b13" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb812da5f3de333db53b13" title="成本与 Token 优化"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">成本与 Token 优化</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-31ce940c69bb81a2a47ef71e336a49cd" style="list-style-type:decimal"><li><b>上下文与任务拆分</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81a2a47ef71e336a49cd" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81938489d34a2c765eb8"><li>将复杂任务拆分为独立小单元，每个会话窗口仅执行单一小任务，<b><span class="notion-inline-underscore">避免在长上下文会话中持续追问</span></b>，减少不必要的 token 消耗。<b><span class="notion-inline-underscore">一般上下文到120K左右，就可以新建窗口刷新上下文了。</span></b></li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81eeb531f5fcc3fbdc53"><li>注意部分模型在上下文长度超过 20K 后会收取双倍费用，合理控制会话上下文长度，<b><span class="notion-inline-underscore">避免无意义的长会话</span></b></li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-31ce940c69bb813ba108efd38c8805e0" style="list-style-type:decimal"><li><b>模型选择策略</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb813ba108efd38c8805e0" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb816f8e6be8faa1c0c29f"><li>根据任务复杂度匹配对应模型：简单查询、文本格式化等轻量任务选择轻量模型，复杂代码编写、架构设计等任务选择大模型，平衡效果与使用成本。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-31ce940c69bb8144a7e4df720a879c84" style="list-style-type:decimal"><li><b>查询token用量</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb8144a7e4df720a879c84" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb815c89e5ffca4fe16cac"><li>对于Cursor ，可以在https://cursor.com/cn/dashboard?tab=spending 中查看已使用付费模型额度的百分比（下方的API）。</li></ul></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb813eb9b2db083092224e" data-id="31ce940c69bb813eb9b2db083092224e"><span><div id="31ce940c69bb813eb9b2db083092224e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb813eb9b2db083092224e" title="提示词与交互效率"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">提示词与交互效率</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-31ce940c69bb8108b5b8eab62723e911" style="list-style-type:decimal"><li><b>一次性明确完整需求</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb8108b5b8eab62723e911" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb8134a20cee4a688e57fa"><li>输入提示词前，提前梳理所有需求，明确说明技术栈、代码风格、特殊约束、输出格式等所有要求，<b><span class="notion-inline-underscore">避免多次补充要求来回修改</span></b>，节省额度与沟通时间</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-31ce940c69bb815d912dece202d4cc60" style="list-style-type:decimal"><li><b>精准引导 AI 输出</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb815d912dece202d4cc60" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb811a82d0dd070fd90972"><li>当 AI 输出不符合预期时，明确指出具体问题所在，提供参考示例或修改方向，而非使用模糊的 “不对”“重新来” 等表述</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-31ce940c69bb81a593d6fd1297ff2367" style="list-style-type:decimal"><li><b>善用 AI 解释功能</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81a593d6fd1297ff2367" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb816da256fe8a7dd7701c"><li>让 AI 解释生成内容的设计思路与逻辑，帮助自己理解的同时，验证 AI 的输出逻辑是否合理</li></ul></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb8163ade9e3ad9ffb046f" data-id="31ce940c69bb8163ade9e3ad9ffb046f"><span><div id="31ce940c69bb8163ade9e3ad9ffb046f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb8163ade9e3ad9ffb046f" title="项目与上下文管理"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">项目与上下文管理</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-31ce940c69bb814b9017da84c79ae447" style="list-style-type:decimal"><li><b>项目框架沉淀复用</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb814b9017da84c79ae447" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb8130a801e268e85e4b59"><li>先让 AI 对项目框架进行总结，后续交互直接基于该框架进行阅读或补充，避免 AI 重复解析整个项目内容，提升处理效率</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-31ce940c69bb8113b67cf0d0106ad92e" style="list-style-type:decimal"><li><b>最小化工作空间</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb8113b67cf0d0106ad92e" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81e0a3fdd252fa639d4a"><li><b><span class="notion-inline-underscore">按项目模块分别打开工作空间</span></b>（如前端、后端分开用 Cursor 打开），避免一次性加载整个项目，让 AI 的关注点更集中</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-31ce940c69bb81c2b4caf9cf7f48eba4" style="list-style-type:decimal"><li><b>文件引用与内容排除</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81c2b4caf9cf7f48eba4" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81a39e3feb566560f471"><li><b><span class="notion-inline-underscore">明确需要修改的代码时，通过拖文件或 “@” 方式精确引用</span></b>；不确定修改内容时，配置<code class="notion-inline-code">.cursorignore</code>文件，<b><span class="notion-inline-underscore">排除编译目录（build、target 等）、敏感信息文件、无关资源文件，减少 AI 处理的无关内容</span></b></li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-31ce940c69bb81f8845de0e013e2fd60" style="list-style-type:decimal"><li><b>避免上传完整项目</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81f8845de0e013e2fd60" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81f99b21e8353a2dc592"><li>不要将整个项目文件直接拖入 AI 对话框，若必须上传，确保排除编译、缓存等无关目录，避免冗余内容干扰 AI 判断</li></ul></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81fcb258ff7354773523" data-id="31ce940c69bb81fcb258ff7354773523"><span><div id="31ce940c69bb81fcb258ff7354773523" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81fcb258ff7354773523" title="开发流程规范"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">开发流程规范</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-31ce940c69bb8196b86ec2df81184a24" style="list-style-type:decimal"><li><b>先方案后执行</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb8196b86ec2df81184a24" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81d3b9ebca3016d68278"><li><b><span class="notion-inline-underscore">让 AI 先输出方案或执行计划，经人工仔细审阅后再执行；</span></b>也可新开窗口让其他 AI 评估该方案，确保方案合理性</li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb810f8eabc8ac9eed75f3"><li>执行plan时，建议<b><span class="notion-inline-underscore">新开一个窗口执行</span></b>，并把“执行所需的最小上下文包”带过去。因为在输出plan后的上下文接近很多模型/平台的有效上限或“注意力衰减区”，后续执行时更容易出现：</li><ul class="notion-list notion-list-disc notion-block-31ce940c69bb810f8eabc8ac9eed75f3"><li>早期约束（命名规则、不要兼容、多 Fabric 设计边界）被忽略</li><li>对文档/日志细节记忆混乱、前后不一致</li><li>生成 patch 时遗漏关键文件或偏离 plan</li></ul></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-31ce940c69bb81869dd5cffa27c2823b" style="list-style-type:decimal"><li><b>改动前设计评估</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81869dd5cffa27c2823b" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb8132b751e60b1db8fb73"><li><b><span class="notion-inline-underscore">在每次改动前，要求 AI 回答 “这是否符合 best practice？为什么？有哪些替代方案与权衡？”，迫使其显式化设计判断，避免不合理设计</span></b></li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-31ce940c69bb81798e89ea930086771a" style="list-style-type:decimal"><li><b>代码 Review 重点</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81798e89ea930086771a" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81bba443c2207cf83918"><li><b><span class="notion-inline-underscore">AI 生成代码后必须进行 Review，重点关注是否破坏整体架构、是否存在 “走捷径” 的不合理实现，而非逐行检查代码细节，并且Review也有利于自己吸收经验学习框架。</span></b></li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-31ce940c69bb81438033e0cb46bc8549" style="list-style-type:decimal"><li><b>自动化脚本生成</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81438033e0cb46bc8549" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81e9a987e1efbb776cd8"><li>让 AI 生成重复性任务的自动化脚本（如代码格式化、文件批量处理等），让AI自己创建skill。提升长期开发效率</li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-76890d61c3d24cff90e1aaa675e9f000"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/misc/5339060b-ac3c-4470-bd41-2d1f71c2b097-5339060b-ac3c-4470-bd41-2d1f71c2b097.png?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=76890d61-c3d2-4cff-90e1-aaa675e9f000" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-31ce940c69bb81aeabc1e56ed379da41" data-id="31ce940c69bb81aeabc1e56ed379da41"><span><div id="31ce940c69bb81aeabc1e56ed379da41" class="notion-header-anchor"></div><a class="notion-hash-link" href="#31ce940c69bb81aeabc1e56ed379da41" title="结构与知识管理"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">结构与知识管理</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-31ce940c69bb811e99b3e7dbcfea9ca6" style="list-style-type:decimal"><li><b>强化文档与结构化知识</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb811e99b3e7dbcfea9ca6" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb8111a1f1eb79bd0991d6"><li><b><span class="notion-inline-underscore">完善项目文档与结构化知识，AI 会放大 “好结构” 的优势，也会放大 “坏结构” 的问题，清晰的结构能让 AI 输出更符合预期</span></b></li></ul><ul class="notion-list notion-list-disc notion-block-31ce940c69bb81b3bae8e3a95fcc28cb"><li><b>每次让AI写一些新的功能或者内容。都要让AI去维护或生成相关的“技术文档”，</b><b><span class="notion-inline-underscore">文档不能太冗长</span></b><b>。</b></li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-31ce940c69bb81269892db2dae0245b2" style="list-style-type:decimal"><li><b>沉淀可复用内容</b></li><ol class="notion-list notion-list-numbered notion-block-31ce940c69bb81269892db2dae0245b2" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-31ce940c69bb811f87c0dc34872b4c94"><li><b><span class="notion-inline-underscore">将 AI 生成的优质代码、方案、提示词整理成模板，后续类似任务直接复用，提升效率</span></b></li></ul></ol></ol></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[配置ESP32开发环境]]></title>
            <link>https://www.mcoi.top/article/Post-ESP32-Development-environment-configuration</link>
            <guid>https://www.mcoi.top/article/Post-ESP32-Development-environment-configuration</guid>
            <pubDate>Sat, 16 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[包含了Ubuntu和Windows的ESP32开发环境搭建，其中Windows包含了CLion和vscode的搭建]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2a9e940c69bb801fb7aee2512d5c790e"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb81c5a1b8fc533fe94b60"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">一个简单的开头</div></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb80298e5ac4afead7a3ff" data-id="2a9e940c69bb80298e5ac4afead7a3ff"><span><div id="2a9e940c69bb80298e5ac4afead7a3ff" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80298e5ac4afead7a3ff" title="Ubuntu开发环境"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Ubuntu开发环境</span></span></h2><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80afb4a9c025093b656b" style="list-style-type:decimal"><li>虚拟机创建Ubuntu20.04.6 server</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80afb4a9c025093b656b" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8026b4a1f62e40e5c2ed"><li>注意在安装的时候勾选SSH server</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb805daac8dad6f12b5717" style="list-style-type:decimal"><li>安装网络工具 :</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb805daac8dad6f12b5717" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8053afb4f5f090296ff5"><li>sudo apt-get install net-tools</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8034bc72e32d48db9415"><li>输入ifconfig查看ip</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80efa1efe207c514fb5c"><li>使用MobaXterm登录</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f1a39acb6abd937f46" style="list-style-type:decimal"><li>修改pip源为阿里云源</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f1a39acb6abd937f46" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80fea756ea54f587760c"><li>在根目录创建mkdir .pip文件夹</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8019bb3ecc63cce0aa42"><li>创建vim pip.conf文件</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8083b65ae3a15160db9d"><li>新增如下内容</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e59d08c074e292c843" style="list-style-type:decimal"><li>修改清华源</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e59d08c074e292c843" style="list-style-type:lower-alpha"><div class="notion-text notion-block-2a9e940c69bb802d9dbbe855129a5683">使用国内源更稳定，还能加速下载。
官网如下：
<a class="notion-link" href="https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/" target="_blank" rel="noopener noreferrer">ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror</a>
（如果你是别的系统，可以输入<code class="notion-inline-code">lsb_release -a</code>来查看当前的系统，然后根据清华源的官网的提示来更换相应地文本）
我这里是<code class="notion-inline-code">Ubuntu 20.04 LTS (focal)</code></div><li>首先备份系统原有的更新源配置文件：
<code class="notion-inline-code">sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup</code></li><li>然后使用文本编辑器（如<code class="notion-inline-code">sudo vim /etc/apt/sources.list</code>）打开<code class="notion-inline-code">sources.list</code>文件，
将其内容替换为清华的源。以下是<b> Ubuntu 20.04（flcal）</b>的清华源示例：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b19d39e881b6892354" style="list-style-type:lower-roman"><div class="notion-text notion-block-2a9e940c69bb806c9157ed620f5d11a2">在vim文本编辑器下，清除所有文本需要进入命令模式（按 <code class="notion-inline-code">Esc</code> 键）。
按<code class="notion-inline-code">shift + ：</code>键开始输入命令。
输入 <code class="notion-inline-code">%d</code> 然后按回车键。表示全部删除。
输入然后输入<code class="notion-inline-code">i</code> 进入编辑模式，开始输入（Ctrl+Shift+V可以粘贴）。
输入完毕后按ESC键，再按<code class="notion-inline-code">shift + ：</code>输入<code class="notion-inline-code">set noreadonly</code>取消文件只读设置
然后<code class="notion-inline-code">shift + ：</code> 输入<code class="notion-inline-code">wq</code> 然后回车（w为保存，q为退出）</div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80bb84b8e8356c48cc7e"><li>直接使用 su 登录root 也很方便。</li></ul><blockquote class="notion-quote notion-block-2a9e940c69bb8079813dd4258cec030c"><div>恭喜啊！！到这一步，你就成功的将软件源配置为清华源了。
可以验证一下，输入<code class="notion-inline-code">sudo apt update</code> 系统将从清华源获取软件包信息并进行更新
并且不会出现错误提示。</div></blockquote></ol></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f7a4dcd0770699b35c" style="list-style-type:decimal"><li>安装各种必要的工具</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f7a4dcd0770699b35c" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80a9b5c6de71d673acf2"><li>sudo apt-get install git wget flex bison gperf python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 net-tools</li></ul></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80699718cdd86b6d4adf" style="list-style-type:decimal"><li>新建esp32目录</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80699718cdd86b6d4adf" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb809fab27d484902a2333"><li>mkdir esp32</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8082aadac2fa95fe3053"><li>cd esp32</li></ul></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80c1a33cf7b8d6a98333" style="list-style-type:decimal"><li>拉取gitee工具</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80c1a33cf7b8d6a98333" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8044aa15ca51e4fcbba3"><li>git clone <a class="notion-link" href="https://gitee.com/EspressifSystems/esp-gitee-tools.git" target="_blank" rel="noopener noreferrer">https://gitee.com/EspressifSystems/esp-gitee-tools.git</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80b9823cc0530dfc80e9"><li>执行gitee工具切换镜像脚本</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80b9823cc0530dfc80e9"><li>cd esp-gitee-tools</li><li>./jihu-mirror.sh set</li><li>上面这句命令，会将github的地址自动替换成jihulab上的镜像地址，这样就不用担心github的访问问题了</li><div class="notion-text notion-block-2a9e940c69bb80d79d6be43dc0b1d4cb">然后我们可以理直气壮的拉取github 源码了，先回到esp32目录，</div></ul></ul></ol></ol><ol start="8" class="notion-list notion-list-numbered notion-block-2a9e940c69bb808c9d22d809d8126591" style="list-style-type:decimal"><li>拉取esp-idf源码</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb808c9d22d809d8126591" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80149b88e04ccf994b0a"><li>回到ESP32目录   cd ..</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80c4b237f2fb89704c39"><li>克隆github仓库 git clone --recursive <a class="notion-link" href="https://github.com/espressif/esp-idf.git" target="_blank" rel="noopener noreferrer">https://github.com/espressif/esp-idf.git</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80969a5ce30bd94ba846"><li><code class="notion-inline-code">--recursive</code>：这个选项告诉 Git 在克隆仓库的同时，递归地克隆该仓库所包含的所有子模块。</li></ul></ol></ol><ol start="9" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80548097e338018f9244" style="list-style-type:decimal"><li>切换esp-idf版本分支到v5.2（大版本不兼容，小版本一般兼容）</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80548097e338018f9244" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80fb8266e225da3ca143"><li>cd esp-idf</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80639e1bca8caf5f1e97"><li>切换分支到5.2版本  git checkout v5.2</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8084bb99d02323426fec"><li>git branch 可以看一下到底切换成功了没</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8059a6c1ca38fd38fd7f"><li>把相应的子模块切换到对应的版本 git submodule update --init --recursive</li></ul></ol></ol><ol start="10" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d5811fc99312c0f364" style="list-style-type:decimal"><li>安装编译工具</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d5811fc99312c0f364" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb805eb723d9d0a39999bb"><li><b>../esp-gitee-tools/install.sh</b></li></ul></ol></ol><ol start="11" class="notion-list notion-list-numbered notion-block-2a9e940c69bb807f99b5e46602c7fcf4" style="list-style-type:decimal"><li>设置临时环境变量</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb807f99b5e46602c7fcf4" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8019803ae1b61fa6554f"><li>source export.sh</li></ul></ol></ol><ol start="12" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8006b910cedaeccea7c7" style="list-style-type:decimal"><li>添加全局环境变量</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8006b910cedaeccea7c7" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb808eb79efa0c8cbd5ff3"><li>vim ~/.profile</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804babaafd8a125d25a4"><li>添加一行：source esp32/esp-idf/export.sh  </li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80399121ecf4da011102"><li>也就是登录这个用户自动运行 这样就能不会退出而不能编译了</li></ul></ol></ol><ol start="13" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80488798f2b1bba4b905" style="list-style-type:decimal"><li>下载课程配套源码</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80488798f2b1bba4b905" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80c59926d8cee3e3adfd"><li>cd ~/esp32</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80a7be0fc6aa7c9c6af6"><li>git clone --recursive https://gitee.com/vi-iot/esp32-board.git</li></ul></ol></ol><ol start="14" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8028af98d73e344c5623" style="list-style-type:decimal"><li>编译</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8028af98d73e344c5623" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb803b9d4cf3ded471ba68"><li>cd esp32-board/helloworld</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb806da7b8ff058ea7dcd2"><li>idf.py build</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d287fed5246064ae1e"><li>如果没红色或黄色报错就成功了。</li></ul></ol></ol><ol start="15" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80a7a9c5ec8ebea33eb1" style="list-style-type:decimal"><li>vscode连接</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80a7a9c5ec8ebea33eb1" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80ccaae4da1cc025d2d2"><li>下载ssh插件</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8052ba51c61972f97ed4"><li>配置ssh插件登录格式</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8052ba51c61972f97ed4"></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80aba9bdc5dde9cdfa3a"><li>右键在当前界面登录就OK 了。</li></ul></ol></ol><ol start="16" class="notion-list notion-list-numbered notion-block-2a9e940c69bb807f931de50c6f1132f7" style="list-style-type:decimal"><li>通过本地vscode在Ubuntu vscode-server下载  C/C++ 、乐鑫ESP-IDF插件</li></ol><ol start="17" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b0ba73dead697c3068" style="list-style-type:decimal"><li>装好后，最好重启一下VSCode，重复上述步骤登录ubuntu和打开helloworld文件夹，然后我们回到我们的helloworld工程</li></ol><ol start="18" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80578ac2d6f737d7e758" style="list-style-type:decimal"><li>按下ctrl+shift+p，弹出搜索框，搜索ESP-IDF:Add vscode Configuration Folder，在下拉列表出现后，点击一下就可以了，这步的目的是为了把esp-idf里面的源码路径也加到我们的工程中，<b>现在我们可以通过按着ctrl键点击函数或变量进行跳转看代码了 </b></li></ol><ol start="19" class="notion-list notion-list-numbered notion-block-2a9e940c69bb801cad8bf036905a90ba" style="list-style-type:decimal"><li>设置远程插件的C/C++扩展设置。搜索workspace  ，把CPU占用调整为medium 中等。否则会占用100% CPU。</li></ol><ol start="20" class="notion-list notion-list-numbered notion-block-2a9e940c69bb801ea738db814f181766" style="list-style-type:decimal"><li>设置USB串口权限</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb801ea738db814f181766" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80e88d73f271f89b4097"><li>sudo usermod -aG dialout xxx  xxx为用户名</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8070b0b9d9f8753c637e"><li>exit 退出，然后r重启一下</li></ul></ol></ol><ol start="21" class="notion-list notion-list-numbered notion-block-2a9e940c69bb803984a7ce7ee98226cf" style="list-style-type:decimal"><li>设置虚拟机USB为 USB3.1，防止烧录时提示一直正在使用</li></ol><ol start="22" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d890b9f87d394c00f8" style="list-style-type:decimal"><li>插入USB，在虚拟机设置连接USB到虚拟机。</li></ol><ol start="23" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8051828cc2020e7fa13b" style="list-style-type:decimal"><li>烧录  <a class="notion-link" href="http://idf.py" target="_blank" rel="noopener noreferrer">idf.py</a> flash</li></ol><ol start="24" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f48075c704127e62b3" style="list-style-type:decimal"><li>sudo chmod 777 /dev/ttyUSB0    提升权限</li></ol><ol start="25" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b9a9efd7e0c6b915fc" style="list-style-type:decimal"><li>idf.py monitor 调试</li></ol><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80878277e55fceeae9ee"><li>Ctrl+]退出调试</li></ul><blockquote class="notion-quote notion-block-2a9e940c69bb809fae75eb4ecf05ab55"><div>注意，esp-idf的版本记得选择v5.2   要一样的~，这个如果是Ubuntu server版本，可以用vscode连接之后 设置，
如果是Ubuntu desktop版本，可以直接在桌面  插件设置~</div></blockquote><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb8027996df6fae2fb2a38" data-id="2a9e940c69bb8027996df6fae2fb2a38"><span><div id="2a9e940c69bb8027996df6fae2fb2a38" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb8027996df6fae2fb2a38" title="WIndows开发环境"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">WIndows开发环境</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb8039a899c84244e72d67" data-id="2a9e940c69bb8039a899c84244e72d67"><span><div id="2a9e940c69bb8039a899c84244e72d67" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb8039a899c84244e72d67" title="vscode+ESP-IDF"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">vscode+ESP-IDF</span></span></h3><div class="notion-text notion-block-2a9e940c69bb80f48db1f56c282f81dd">不重复造轮子了，挺多的</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb8065b827e5df964f40d9" data-id="2a9e940c69bb8065b827e5df964f40d9"><span><div id="2a9e940c69bb8065b827e5df964f40d9" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb8065b827e5df964f40d9" title="CLion+ESP-IDF"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">CLion+ESP-IDF</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8085b606f54ced7072df" style="list-style-type:decimal"><li>下载安装离线安装包</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8047a078e0a50d793543" style="list-style-type:decimal"><li>基础指令</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8047a078e0a50d793543" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb803d8137cb2fcef721d1"><li><code class="notion-inline-code">idf.py create-project 路径</code>指令可以创建一个基础的ESP模板</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80de8ac2ec3487f1c367"><li><code class="notion-inline-code">idf.py build dome1</code> 可以编译这个dome</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80cb8698d4fe04d1a84d"><li><code class="notion-inline-code">idf.py monitor</code> 是调试 监视</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb804c9d30e822cc8c2399" style="list-style-type:decimal"><li>使用<code class="notion-inline-code">idf.py create-project 路径</code>创建一个demo</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb803c9160fe23d2e21001" style="list-style-type:decimal"><li>在CLion 软件添加一个新的环境，编辑环境变量(ESP32-S2)</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb803c9160fe23d2e21001" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb808f81f6cd1976a2988a"><li>IDF_PATH=D:\Espressif\frameworks\esp-idf-v5.3.1;ESPPORT=COM15;IDF_TARGET=esp32</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80138131eb0bd911cc77"><li>在PATH添加下面这段环境目录</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80138131eb0bd911cc77"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-096f7bd724eb418a876898b94d807c29"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP32-Development-environment-configuration/cdb4485e-db36-404c-b886-9e543d2bd010-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=096f7bd7-24eb-418a-8768-98b94d807c29" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80c59839f576e3142b07" style="list-style-type:decimal"><li>编辑工具链为 D:\Espressif\espidf_source.bat</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80c59839f576e3142b07" style="list-style-type:lower-alpha"></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-2a9e940c69bb807da63fc6c6ac9f3670" style="list-style-type:decimal"><li>重新加载CMake项目</li></ol><ol start="7" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b99ab4d02188c46633" style="list-style-type:decimal"><li>构建app</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8098b9ecfded1a7aa2f6" style="list-style-type:decimal"><li>切换flash烧录</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8098b9ecfded1a7aa2f6" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1ba7d105435f4d3da4009a504d057ca9"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP32-Development-environment-configuration/283949ed-65b3-425e-863a-82cb5eff2c89-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=1ba7d105-435f-4d3d-a400-9a504d057ca9" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="9" class="notion-list notion-list-numbered notion-block-2a9e940c69bb808b9dfcf07757121894" style="list-style-type:decimal"><li>针对部分monitor不能用（提示 Monitor requires standard input to be attached to TTY. Try using a different terminal.错误），经查：可以使用外部模拟~</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb808b9dfcf07757121894" style="list-style-type:lower-alpha"><div class="notion-text notion-block-2a9e940c69bb80ed8fa2cffb4f8dc526">参考：<a class="notion-link" href="https://youtrack.jetbrains.com/issue/CPP-34647/ESP-IDF-Monitor-error-Monitor-requires-standard-input-to-be-attached-to-TTY" target="_blank" rel="noopener noreferrer">ESP-IDF Monitor error: Monitor requires standard input to be attached to TTY : CPP-34647</a></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-b698626389a04b3a939c1401b27e912e"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP32-Development-environment-configuration/c1751ec7-84fe-45d9-a67d-774237f58bc6-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=b6986263-89a0-4b3a-939c-1401b27e912e" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="10" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b7bfb0e744eb3bddc7" style="list-style-type:decimal"><li>使用CLion 打开我们创建的demo，然后进行编译、烧录、调试。测试一下。</li></ol><blockquote class="notion-quote notion-block-2a9e940c69bb8079bd9ee60ceab7522c"><div>小技巧：第一次编译（app）之后，后续可以直接选择flash，否则会重新编译，又得等老久了。</div></blockquote><div class="notion-text notion-block-2a9e940c69bb8012a438f4a732f47a2d">配置开发环境挺麻烦的，其实可以直接使用<code class="notion-inline-code">ESP-IDF 5.3 PowerShell</code>\<code class="notion-inline-code">ESP-IDF 5.3 CMD</code> 这些终端进行编译、烧录和调试等等</div><blockquote class="notion-quote notion-block-2a9e940c69bb8009bc46efe46b11cb14"><div><b>后续都是根据VsCode.进行的ESP32开发。</b></div></blockquote><div class="notion-blank notion-block-2a9e940c69bb80878d1ad4bae8d224de"> </div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb814eb662d95dd43c1399"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text">有关LVGL其他问题，欢迎您在底部评论区留言，一起交流~</div></div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Csharp学习笔记]]></title>
            <link>https://www.mcoi.top/article/Post-Csharp</link>
            <guid>https://www.mcoi.top/article/Post-Csharp</guid>
            <pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[记录C#的学习笔记]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-214e940c69bb8084885ec5e73857c743"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-214e940c69bb80c48517e9ca44af8f13"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">此笔记是C#学习笔记，个人认为对<b>入门面向对象思</b>想 和 <b>了解函数栈帧</b>有很大的帮助
视频并没有看完，只是简单的做了个课设（串口助手）
以后有机会再往后看吧~</div></div><details class="notion-toggle notion-block-214e940c69bb802f802bcd5424da48cf"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-214e940c69bb802f802bcd5424da48cf" data-id="214e940c69bb802f802bcd5424da48cf"><span><div id="214e940c69bb802f802bcd5424da48cf" class="notion-header-anchor"></div><span class="notion-h-title">一、类与名称空间</span></span></h2></summary><div><details class="notion-toggle notion-block-214e940c69bb8057ba04d866ffd83144"><summary><h3 class="notion-h notion-h2 notion-block-214e940c69bb8057ba04d866ffd83144" data-id="214e940c69bb8057ba04d866ffd83144"><span><div id="214e940c69bb8057ba04d866ffd83144" class="notion-header-anchor"></div><span class="notion-h-title">1. 简介</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-214e940c69bb80389cd5ed196be7ebf3"><li><b>类（class）</b>构成程序的主题</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80df96f6ecc51a1a8ade"><li><b>空间名称（namespace）</b>以树型结构组织类（和其他类型）</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80df96f6ecc51a1a8ade"><li>例如Button 和 Path  类。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb8076a850fcc20d068415"><li><b>using </b> 类似于 C语言的引用头文件，在C#中是名称空间。</li></ul><div class="notion-blank notion-block-214e940c69bb808d96ceea509923fd1f"> </div><div class="notion-text notion-block-214e940c69bb80aa9053c1dcdcce49a3">使用名称空间，可以避免类的冲突。 比如Windows名称空间 与 IO 名称空间中都有Path 类。他们的作用不同但名称相同。这时候如果要使用就需要用 <b>全限命名 xxx.xx.path</b></div><div class="notion-text notion-block-214e940c69bb80b5ac8cc85db32e2d9b">所以在以后使用时，就要对类进行精确命名，并且应该把他精确的放到 名称空间中去</div></div></details><details class="notion-toggle notion-block-214e940c69bb8092b3efe219267edc80"><summary><h3 class="notion-h notion-h2 notion-block-214e940c69bb8092b3efe219267edc80" data-id="214e940c69bb8092b3efe219267edc80"><span><div id="214e940c69bb8092b3efe219267edc80" class="notion-header-anchor"></div><span class="notion-h-title">2. 类库的引用</span></span></h3></summary><div><details class="notion-toggle notion-block-214e940c69bb8098b404ed03deaf0ab6"><summary><h4 class="notion-h notion-h3 notion-block-214e940c69bb8098b404ed03deaf0ab6" data-id="214e940c69bb8098b404ed03deaf0ab6"><span><div id="214e940c69bb8098b404ed03deaf0ab6" class="notion-header-anchor"></div><span class="notion-h-title"><b>类库</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-214e940c69bb80bead53c1dad8e33699"><li>是以.dll为结尾的文件。 dll为（dynamic link Library） 动态 链接 库。在项目树的references可查看</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb8004a569e697c06c6490"><li>在引用类库的时候，<b>要尤其注意依赖关系</b>，最好用依赖关系比较弱的包。在类库有问题时，可以暂时用别的类库先替代。</li></ul></div></details><details class="notion-toggle notion-block-214e940c69bb80cebc2edda910943d59"><summary><h4 class="notion-h notion-h3 notion-block-214e940c69bb80cebc2edda910943d59" data-id="214e940c69bb80cebc2edda910943d59"><span><div id="214e940c69bb80cebc2edda910943d59" class="notion-header-anchor"></div><span class="notion-h-title"><b>类库的引用</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-214e940c69bb80b3aa08c8b39dd2b93c"><li>类库可以有黑盒引用，也可以有白盒引用</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80b3aa08c8b39dd2b93c"><ol start="1" class="notion-list notion-list-numbered notion-block-214e940c69bb80ec9249fcab570cdb62" style="list-style-type:decimal"><li>黑盒引用是对编译好的dll文件直接引用</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-214e940c69bb8003a2f4fff85702c678" style="list-style-type:decimal"><li>白盒引用是把源代码放到项目中直接引语 </li></ol></ul></ul><div class="notion-text notion-block-214e940c69bb8054a002e11fbc59d722">在生成项目的时候，系统会自动引用一些必要的或者常用的库。可以再次选择系统自带的库，也可以去引用别人或是自己曾经写的库</div></div></details><details class="notion-toggle notion-block-214e940c69bb802fbe1cf48d0e110f2c"><summary><h4 class="notion-h notion-h3 notion-block-214e940c69bb802fbe1cf48d0e110f2c" data-id="214e940c69bb802fbe1cf48d0e110f2c"><span><div id="214e940c69bb802fbe1cf48d0e110f2c" class="notion-header-anchor"></div><span class="notion-h-title"><b>管理NuGet包</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-214e940c69bb8005b92eceaa9b5d6279"><li>在使用类库时，往往还需要更底层的类库。如果手动添加会比较麻烦。我们可以安装Entity Framework   ，安装后，我们就不需要担心类库的依赖了。NuGet会自动管理依赖库。</li></ul></div></details><details class="notion-toggle notion-block-214e940c69bb80dabdf3ec66ad5b9064"><summary><h4 class="notion-h notion-h3 notion-block-214e940c69bb80dabdf3ec66ad5b9064" data-id="214e940c69bb80dabdf3ec66ad5b9064"><span><div id="214e940c69bb80dabdf3ec66ad5b9064" class="notion-header-anchor"></div><span class="notion-h-title"><b>白盒引用</b></span></span></h4></summary><div><div class="notion-text notion-block-214e940c69bb80d880a3e30e31938a9c">朋友发给你他的项目，你可以把他的项目添加到你的解决方案（Solution）中。</div><div class="notion-text notion-block-214e940c69bb80fc8fb6fb20a17c06be">添加后就可以直接使用这个项目中的名称空间中的类</div><div class="notion-text notion-block-214e940c69bb80bcaf13e26bd4d0f4c4"><b>在解决方案中添加现有项目。然后在主项目中引用添加的项目</b></div></div></details><details class="notion-toggle notion-block-214e940c69bb8094b573c60e8b90940d"><summary><h4 class="notion-h notion-h3 notion-block-214e940c69bb8094b573c60e8b90940d" data-id="214e940c69bb8094b573c60e8b90940d"><span><div id="214e940c69bb8094b573c60e8b90940d" class="notion-header-anchor"></div><span class="notion-h-title"><b>编译dll</b></span></span></h4></summary><div><div class="notion-text notion-block-214e940c69bb80ab9473f7d1f5d60fe8">我们要发给别人dll时，需要创建醒目为Class Library。同样也可以在自己的项目中引用</div></div></details></div></details><details class="notion-toggle notion-block-214e940c69bb8084a8d7ea22d77dc332"><summary><h3 class="notion-h notion-h2 notion-block-214e940c69bb8084a8d7ea22d77dc332" data-id="214e940c69bb8084a8d7ea22d77dc332"><span><div id="214e940c69bb8084a8d7ea22d77dc332" class="notion-header-anchor"></div><span class="notion-h-title">3. 依赖关系</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-214e940c69bb8092b35dd1a015dee3cc"><li>类（或对象）之间的耦合关系</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb8048b9d7f6ef35de968c"><li>好的程序追求“高内聚，低耦合”</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb8048b9d7f6ef35de968c"><li>高内聚指的是 类和名称空间精准的分类放置</li><li>依赖关系，也被称为耦合关系，低耦合指的就是依赖关系低</li></ul></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80899a6bd999d7704c2e"><li>UML（通用建模语言）类图</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80899a6bd999d7704c2e"><li>类图用来展现类和类之间的关系。</li></ul></ul></div></details></div></details><details class="notion-toggle notion-block-214e940c69bb80fea85df0f8654f92c7"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-214e940c69bb80fea85df0f8654f92c7" data-id="214e940c69bb80fea85df0f8654f92c7"><span><div id="214e940c69bb80fea85df0f8654f92c7" class="notion-header-anchor"></div><span class="notion-h-title">二、类、对象、类成员、实例成员</span></span></h2></summary><div><details class="notion-toggle notion-block-214e940c69bb80c7b539cd39c6a9b4e0"><summary><h3 class="notion-h notion-h2 notion-block-214e940c69bb80c7b539cd39c6a9b4e0" data-id="214e940c69bb80c7b539cd39c6a9b4e0"><span><div id="214e940c69bb80c7b539cd39c6a9b4e0" class="notion-header-anchor"></div><span class="notion-h-title">类（class）</span></span></h3></summary><div><div class="notion-text notion-block-214e940c69bb80c08674dccd4038b298">类（class）是现实世界对实物的模型</div><ul class="notion-list notion-list-disc notion-block-214e940c69bb80388860d0b28b9ab65b"><li>类是对现实世界事物进行抽象所得到的结果</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80388860d0b28b9ab65b"><li>事物包括“物质&quot;( 实体 )与“运动&quot;( 逻辑)</li><li>建模是一个去伪存真、由表及里的过程</li><div class="notion-text notion-block-214e940c69bb8084880cd8a5ef30a762">（去伪存真的意思是，在程序中去除用不到的功能）（表是我们最终达到的效果。里则是程序内封装的逻辑）</div></ul></ul></div></details><details class="notion-toggle notion-block-214e940c69bb809ea651e95c3a27476e"><summary><h3 class="notion-h notion-h2 notion-block-214e940c69bb809ea651e95c3a27476e" data-id="214e940c69bb809ea651e95c3a27476e"><span><div id="214e940c69bb809ea651e95c3a27476e" class="notion-header-anchor"></div><span class="notion-h-title">类（class）与对象<b>（instance）</b>的关系</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-214e940c69bb803b85dadfb7bc6e1bc0"><li><b>对象也叫实例（instance）</b>，是类经过“实例化”后得到的内存中的实体</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb803b85dadfb7bc6e1bc0"><li>Formally&quot;instance&quot;is synonymous with“object”——对象和实例是一回事</li><li>“飞机&quot;与”一架飞机&quot;有何区别？天上有(一架)飞机——必需是实例飞，概念是不能飞的</li><li>有些类是不能实例化的，比如“数学&quot;( Math class)，我们不能说”一个数学</li></ul></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80a08d5ec061364d13e4"><li>依照<b>类（class）</b>，我们可以创建对象，这就是“实例化“</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80a08d5ec061364d13e4"><li>现实世界中常称“对象&quot;, 程序世界中常称“实例”</li><li>二者并无太大区别，常常混用，初学者不必迷惑</li></ul></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80a2b496e8bf73a5e20f"><li><b>使用new操作符创建类的实例</b></li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb8098b423f67a12f64343"><li>引用变量与实例的关系</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb8098b423f67a12f64343"><li>孩子与气球</li><li>气球不一定有孩子牵着</li><li>多个孩子可以使用各自的绳子牵着同一个气球，也可以都通过一根绳子牵着气球</li></ul></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb8060ba30cddb9d1004d7"><li>在现实世界中一般称作对象、在程序世界中一般称作实例</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80f48f1ec52f927fe183"><li>以Form来举例</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80f48f1ec52f927fe183"><li>使用new来创建实例。</li><li>使用Form MyForm1；来创建引用变量（可以理解为C语言指针）</li><li>使用MyForm1 = new Form()；来将引用变量绑定到实例上（可以理解为指针指向实例）</li><li>不同于C，需要解引用。 我们后续对MyForm1的操作，实际上是对new Form() 这个创建的实例在操作</li></ul></ul></div></details><details class="notion-toggle notion-block-214e940c69bb80da9fc1dd1d939867ed"><summary><h3 class="notion-h notion-h2 notion-block-214e940c69bb80da9fc1dd1d939867ed" data-id="214e940c69bb80da9fc1dd1d939867ed"><span><div id="214e940c69bb80da9fc1dd1d939867ed" class="notion-header-anchor"></div><span class="notion-h-title">类的三大成员</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-214e940c69bb80048080d6b4dd3408e8"><li>属性（Property）</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80048080d6b4dd3408e8"><li>存储数据”，组合起来表示类或对象当前的状态</li></ul></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80dd9a8cd581e2320f17"><li>方法（Method）</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80dd9a8cd581e2320f17"><li>由C语言中的函数(function)进化而来，表示类或对象”能做什么’</li><li>工作中90%的时间是在与方法打交道，因为它是“真正做事”、”构成逻辑”的成员</li></ul></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80bfac38e15554117628"><li>事件（Event )</li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80bfac38e15554117628"><li>类或对象通知其它类或对象的机制，为C#所特有（Java通过其它办法实现这个机制）</li><li>善用事件机制非常重要</li></ul></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb8033b28fc6c7f925b9e9"><li>使用MSDN文档</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80d29112cefea2a4e85f"><li>某些特殊类或对象在成员方面侧重点不同</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80c5b101f1c8a8488175"><li>模型类或对象重在属性，如Entity Framework</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80749ff4d779db46e73d"><li>工具类或对象重在方法，如Math,Console</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb8001b3ccd5f757b6b71b"><li>通知类或对象重在事件，如各种Timer</li></ul></div></details><details class="notion-toggle notion-block-214e940c69bb80279925cdd34c0374f5"><summary><h3 class="notion-h notion-h2 notion-block-214e940c69bb80279925cdd34c0374f5" data-id="214e940c69bb80279925cdd34c0374f5"><span><div id="214e940c69bb80279925cdd34c0374f5" class="notion-header-anchor"></div><span class="notion-h-title">静态成员与实例成员*</span></span></h3></summary><div><div class="notion-text notion-block-214e940c69bb80cb81d7ec175b61d68a"><b>静态成员属于类本身而不是类的特定实例。在创建时可以用static 来前缀</b></div><details class="notion-toggle notion-block-214e940c69bb80d786b4d61b05aabb93"><summary><h4 class="notion-h notion-h3 notion-block-214e940c69bb80d786b4d61b05aabb93" data-id="214e940c69bb80d786b4d61b05aabb93"><span><div id="214e940c69bb80d786b4d61b05aabb93" class="notion-header-anchor"></div><span class="notion-h-title"><b>一、语义及特点</b></span></span></h4></summary><div><div class="notion-text notion-block-214e940c69bb801ea97ec9253ff17403"><b>静态成员</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-214e940c69bb80bab125dbeadc74147f" style="list-style-type:decimal"><li>静态成员在语义上表示它是 “类的成员”，可想象成班级里的公共用品如时钟，也像人类的总数、平均身高体重等概念。它是与生俱来的，只要类被抽象出来，静态成员就存在。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-214e940c69bb80bc8113f13cc546efcc" style="list-style-type:decimal"><li>静态成员隶属于类本身，在内存中只有一个副本。例如 <code class="notion-inline-code">Console.WriteLine</code> 中的 <code class="notion-inline-code">WriteLine</code> 是静态方法，通过类名 <code class="notion-inline-code">Console</code> 直接访问，无需特定对象。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-214e940c69bb80cbbc63f5ee5274a55f" style="list-style-type:decimal"><li>静态成员可以被所有的对象访问，而不需要通过特定的对象去访问。
同时，静态成员只能访问其他静态成员，不能访问类的实例成员。</li></ol><div class="notion-text notion-block-214e940c69bb80ec9adde6a3f18ec465"><b>实例成员</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-214e940c69bb80d5bd7efb7d7ada7e07" style="list-style-type:decimal"><li>实例成员在语义上表示它是 “对象的成员”，如同学生自己的书包，每个学生（对象）都有自己独立的书包，不同学生书包里的东西可能不一样。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-214e940c69bb80f7b6afe5691f29ba05" style="list-style-type:decimal"><li>实例成员属于特定对象的实例，每个对象都有自己的实例成员副本。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-214e940c69bb804e9af6d978fa10f927" style="list-style-type:decimal"><li>实例成员需要通过实例化对象来访问，
并且实例成员可以访问类的其他实例和静态成员。</li></ol></div></details><details class="notion-toggle notion-block-214e940c69bb8094b6bddb01668e7c10"><summary><h4 class="notion-h notion-h3 notion-block-214e940c69bb8094b6bddb01668e7c10" data-id="214e940c69bb8094b6bddb01668e7c10"><span><div id="214e940c69bb8094b6bddb01668e7c10" class="notion-header-anchor"></div><span class="notion-h-title"><b>二、访问方式</b></span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-214e940c69bb80bf811ace1d05c5efaf" style="list-style-type:decimal"><li><b>静态成员访问</b></li></ol><div class="notion-text notion-block-214e940c69bb805b8eb6eaf4fd6b294c">静态成员可以通过类名直接访问，如 <code class="notion-inline-code">Console.WriteLine</code> 。</div><ol start="1" class="notion-list notion-list-numbered notion-block-214e940c69bb8005a703e409b62003c6" style="list-style-type:decimal"><li><b>实例成员访问</b></li></ol><div class="notion-text notion-block-214e940c69bb80a39970e05c46d357bc">实例成员需要通过实例化对象来访问，如<code class="notion-inline-code">From from = new From();</code>。
这里的意思就是用From这个类。实例化了一个From对象。<div class="notion-text-children"><div class="notion-text notion-block-214e940c69bb8045b202ec769c547a0b"><b>当使用类名</b><code class="notion-inline-code"><b>From</b></code><b>来引出方法和工具时，通常是调用静态方法或访问静态成员。</b></div><ul class="notion-list notion-list-disc notion-block-214e940c69bb80179909e44dc7347a19"><li>静态方法和成员属于类本身，在内存中只有一份，不依赖于特定的对象实例。</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb80acbe0bf636aca10dd9"><li>可以直接通过类名来访问，无需创建对象实例。例如<code class="notion-inline-code">From.StaticMethod();</code>。</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb807c9593fab09624ec3e"><li>静态成员不能直接访问类的实例成员，因为它们与特定的对象实例无关。</li></ul><div class="notion-text notion-block-214e940c69bb8094baa8f8a2ec3b9b46"><b>使用实例名来引出方法和工具时，是调用实例方法或访问实例成员。</b></div><ul class="notion-list notion-list-disc notion-block-214e940c69bb80dab2d0d0e9ff1a530b"><li>实例方法和成员属于特定的对象实例，每个对象实例都有自己独立的副本。</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb8054af4cd16791840e0d"><li>必须先创建类的实例，然后通过实例名来访问。例如<code class="notion-inline-code">from.InstanceMethod();</code>。</li></ul><ul class="notion-list notion-list-disc notion-block-214e940c69bb807db28afb7e19e3be2b"><li>实例成员可以访问类的其他实例成员和静态成员，因为它们在对象的上下文中运行。</li></ul></div></div><div class="notion-text notion-block-214e940c69bb80e39b66c288f7f41541">总的来说，主要区别在于静态成员和实例成员的本质特性以及访问方式不同。静态成员适用于与类相关的通用操作，不依赖于特定的对象状态；而实例成员则与特定的对象实例相关联，反映对象的具体状态和行为。</div></div></details></div></details></div></details><details class="notion-toggle notion-block-214e940c69bb800b99c7d59ddf0d07b8"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-214e940c69bb800b99c7d59ddf0d07b8" data-id="214e940c69bb800b99c7d59ddf0d07b8"><span><div id="214e940c69bb800b99c7d59ddf0d07b8" class="notion-header-anchor"></div><span class="notion-h-title">三、基本元素、初识类型、变量与方法、算法简介</span></span></h2></summary><div><details class="notion-toggle notion-block-214e940c69bb8059bd4dc9046e58a4c6"><summary><h3 class="notion-h notion-h2 notion-block-214e940c69bb8059bd4dc9046e58a4c6" data-id="214e940c69bb8059bd4dc9046e58a4c6"><span><div id="214e940c69bb8059bd4dc9046e58a4c6" class="notion-header-anchor"></div><span class="notion-h-title">1. 章节介绍</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-214e940c69bb80669877fad78951bc06"><li>构<b>成C#语言的基本元素</b></li><ul class="notion-list notion-list-disc notion-block-214e940c69bb80669877fad78951bc06"><li><b>标记( Token ) 标记 是对于编译器有意义的记号</b></li><ul class="notion-list notion-list-disc notion-block-214e940c69bb8020b91cfc0f59015e17"><li>关键字(Keyword)</li><li>操作符(Operator)</li><li>标识符(ldentifier)</li><li>标点符号</li><li>文本</li></ul><li>注释与空白</li></ul></ul><ul class="notion-list notion-list-disc notion-block-eea5964778464155acbb852835e9ddb2"><li>简要介绍类型、变量与方法算法简介</li></ul></div></details><details class="notion-toggle notion-block-262f387b45804ab7a62e0dcceda1c8c0"><summary><h3 class="notion-h notion-h2 notion-block-262f387b45804ab7a62e0dcceda1c8c0" data-id="262f387b45804ab7a62e0dcceda1c8c0"><span><div id="262f387b45804ab7a62e0dcceda1c8c0" class="notion-header-anchor"></div><span class="notion-h-title">2. 构成C#语言的基本结构</span></span></h3></summary><div><div class="notion-text notion-block-410ba55b72f948d29a01bda4d824d1ad"><b>一、标记（token）概述</b></div><div class="notion-text notion-block-5f5b935fff974485917d463a776760f3">在 C# 中，标记是对编译器有意义的记号，主要分为以下几类：</div><ol start="1" class="notion-list notion-list-numbered notion-block-6592e65a946f453692c8fc717dc07583" style="list-style-type:decimal"><li><b>关键字</b>：具有特定含义的保留词汇，如<code class="notion-inline-code">for</code>循环中的 “for” 就是关键字。它们在语言中被赋予了特定的功能和用途，用于构建程序的逻辑结构和表达特定的操作。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1a3edfb4c9c740b392729f53688bd5c3" style="list-style-type:decimal"><li><b>操作符</b>：用于执行各种运算，如算术运算（+、-、*、/ 等）、比较运算（==、!=、&gt;、&lt; 等）、逻辑运算（&amp;&amp;、||、! 等）。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-b5a4a13bd2144d0388f5a85a92f96099" style="list-style-type:decimal"><li><b>标识符</b>：</li><ol class="notion-list notion-list-numbered notion-block-b5a4a13bd2144d0388f5a85a92f96099" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-bde8b83c7d1247a0a0b6c53603238325"><li>“什么是合法的标识符” 部分主要涉及到在 C# 中定义变量、方法、类等命名时需要遵循的规则。合法的标识符通常由字母、数字和下划线组成，但不能以数字开头。并且要不与C#的保留字</li></ul><ul class="notion-list notion-list-disc notion-block-ed765b14caec4e2a83b703398ca68333"><li>“大小写规范” 则涉及到 C# 中标识符的大小写敏感性。一般来说，C# 是区分大小写的语言。</li></ul><ul class="notion-list notion-list-disc notion-block-95477a0f9794494c907253fd5cf23fda"><li>“命名规范” 包括各种命名约定，如变量名通常使用小写字母开头的驼峰命名法（myVariable），类名使用大写字母开头的帕斯卡命名法（MyVarable）等。</li><ul class="notion-list notion-list-disc notion-block-95477a0f9794494c907253fd5cf23fda"><div class="notion-text notion-block-3a74e40020c844d1bd63b4d2da6043f0">（一般变量名，都是驼峰法。类、名称空间、等都是实用的帕斯卡法）</div></ul></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-f342093f01c546d0ae6f3a540cd447bf" style="list-style-type:decimal"><li><b>标点符号</b>：在 C# 中，标点符号用于分隔语句、表示语句的结束等，例如分号（;）用于结束一条语句，括号（()）用于方法调用和表达式分组等。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2839aa6b43fd4e35be34ef0dacd96690" style="list-style-type:decimal"><li><b>文本（字面值）</b>：</li><ol class="notion-list notion-list-numbered notion-block-2839aa6b43fd4e35be34ef0dacd96690" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-bc74b78955f14244b6c79a6c34356da4"><li>“整数” 可以有多种后缀，例如 “L” 表示 long 类型的整数，“U” 表示 unsigned 整数等2、2L。</li></ul><ul class="notion-list notion-list-disc notion-block-e8e0a31d94654871bc581a12cc187c41"><li>“实数” 也有多种后缀，用于表示不同精度的浮点数。F单精度，D双精度，默认双精度。</li></ul><ul class="notion-list notion-list-disc notion-block-5730211673c64503903c91600e84ae0b"><li>“字符字符串” 用于表示一串字符，用双引号括起来。</li></ul><ul class="notion-list notion-list-disc notion-block-bd8f45016dc0462f8c90230a94929dff"><li>“布尔” 类型只有两个值：true 和 false。</li></ul><ul class="notion-list notion-list-disc notion-block-1ef7bf3a4319427d87292c2b4a782555"><li>“空（null）” 表示一个对象没有值。</li></ul></ol></ol><div class="notion-text notion-block-83c50dd2fc2e4809b54f392211bf043d"><b>二、注释与空白</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-0fbb84a14a9241feb3ae8fb4b777b443" style="list-style-type:decimal"><li><b>单行注释</b>：使用 “//” 开头，用于在代码中添加单行注释，解释代码的功能或提供其他信息。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-978e1eaad5684f52aaa893b643cd6e43" style="list-style-type:decimal"><li><b>多行（块注释）</b>：使用 “/<em>” 和 “</em>/” 包围起来，可以包含多行注释内容。多行注释通常用于对一段代码或一个函数进行详细的解释。</li></ol></div></details><details class="notion-toggle notion-block-22d47e69c8684207af2af8893d42554d"><summary><h3 class="notion-h notion-h2 notion-block-22d47e69c8684207af2af8893d42554d" data-id="22d47e69c8684207af2af8893d42554d"><span><div id="22d47e69c8684207af2af8893d42554d" class="notion-header-anchor"></div><span class="notion-h-title">3. 初识类型、变量和方法</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-f21c6432a23c4af99e40c5cd5bef0477"><li>初识类型 (Type)</li><ul class="notion-list notion-list-disc notion-block-f21c6432a23c4af99e40c5cd5bef0477"><li>亦称数据类型 (Data Type)。不同的数据类型在内存中占据不同的空间大小，并且具有特定的操作和用途。例如，整数类型用于存储整数值，浮点类型用于存储带有小数部分的数值。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-7f79a984e0d04bc4b1b12f4b0f99893e"><li>变量是存放数据的地方，简称 “数据”</li><ul class="notion-list notion-list-disc notion-block-7f79a984e0d04bc4b1b12f4b0f99893e"><li>变量的声明：在 C# 中，变量的声明需要指定变量的类型和名称。例如，<code class="notion-inline-code">int num;</code>声明了一个名为<code class="notion-inline-code">num</code>的整数类型变量。</li><li>变量的使用：声明变量后，可以通过赋值语句为变量赋予具体的值。例如，<code class="notion-inline-code">num = 10;</code>将整数值 10 赋给变量<code class="notion-inline-code">num</code>。变量可以在表达式中使用，也可以作为方法的参数传递。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-bde03a1b6f38499394ea96df6eb834b3"><li>方法 (旧称函数) 是处理数据的逻辑，又称 “算法”</li><ul class="notion-list notion-list-disc notion-block-bde03a1b6f38499394ea96df6eb834b3"><li>方法的声明：方法的声明包括方法的返回类型、方法名、参数列表和方法体。例如，<code class="notion-inline-code">public int Add(int a, int b) { int result = a + b; return result; }</code>声明了一个名为<code class="notion-inline-code">Add</code>的方法，该方法接受两个整数参数<code class="notion-inline-code">a</code>和<code class="notion-inline-code">b</code>，并返回它们的和。其中public 是 为了让 类 外边 也能访问到这个方法。</li><li>方法的调用：可以通过方法名和参数列表来调用方法。但在此之前 要把类创建为实例。然后再使用<code class="notion-inline-code">int sum = c.Add(5, 3);</code>调用了<code class="notion-inline-code">Add</code>方法，并将返回值赋给变量<code class="notion-inline-code">sum</code>。（其中c为创建的实例名）</li><li>方法一般分为三类：有输入有输出，例如求和；没输入有输出，例如显示日期；无输入有输出。一般是在方法内直接输出或者做了某些事情。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-06aa878cacb54c448df80b7d92b79bc9"><li>程序 = 数据 + 算法</li><ul class="notion-list notion-list-disc notion-block-06aa878cacb54c448df80b7d92b79bc9"><li>有了变量和方法就可以写有意义的程序了。程序通过对数据的操作和处理来实现特定的功能。变量存储程序中的数据，方法提供对数据的处理逻辑。通过合理地组织变量和方法，可以构建出复杂的程序。一般有for 和 递归。</li></ul></ul><div class="notion-text notion-block-dae8440ae7d94225b6ed429419a25222">在 C# 中，正确地理解和使用数据类型、变量和方法是编写高效、可靠程序的基础。了解不同数据类型的特点和用途，合理地声明和使用变量，以及设计有效的方法，可以提高程序的可读性、可维护性和性能。</div></div></details></div></details><details class="notion-toggle notion-block-31828f6ebd6645b587e95c8994cee4d4"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-31828f6ebd6645b587e95c8994cee4d4" data-id="31828f6ebd6645b587e95c8994cee4d4"><span><div id="31828f6ebd6645b587e95c8994cee4d4" class="notion-header-anchor"></div><span class="notion-h-title">四、详解C#类型、变量与对象</span></span></h2></summary><div><details class="notion-toggle notion-block-bcc26a7f968e447996f93c09c648010c"><summary><h4 class="notion-h notion-h3 notion-block-bcc26a7f968e447996f93c09c648010c" data-id="bcc26a7f968e447996f93c09c648010c"><span><div id="bcc26a7f968e447996f93c09c648010c" class="notion-header-anchor"></div><span class="notion-h-title">什么是类型(Type)</span></span></h4></summary><div><div class="notion-text notion-block-00073c54a0f24f8197be29837c6a9777"><b>一、又名数据类型( Data Type )</b></div><ul class="notion-list notion-list-disc notion-block-98a2d1a8337646a08cd5f6acd2a91bd4"><li>A data type is a homogeneous collection of values, effectively presented, equipped with a set of operations which manipulate these values</li></ul><ul class="notion-list notion-list-disc notion-block-beb6f5074c7d4f129cb2623613428b81"><li>数据类型是值的同质集合，有效地呈现，配备了一组操作这些值的操作</li></ul><ul class="notion-list notion-list-disc notion-block-92b8a02897d446f78529c7dfc528c118"><li>是数据在内存中存储时的“型号（Type 又称型号）</li></ul><ul class="notion-list notion-list-disc notion-block-d1fa5cc3235343c6905c4bcff2b8b176"><li>若误小内存容纳大尺寸数据会丢失精确度、发生</li></ul><ul class="notion-list notion-list-disc notion-block-cfc72a140be8421c91a40061a201441f"><li>大内存容纳小尺寸数据会导致浪费</li></ul><ul class="notion-list notion-list-disc notion-block-3a5c2b24dc0c4276b29009d7d4c7a380"><li>编程语言的数据类型与数据的数据类型不完全相同</li></ul><div class="notion-text notion-block-50bd7a21aa114644b6262c2deff797d2"><b>二、强类型语言与弱类型语言的比较</b></div><div class="notion-text notion-block-837ccefd1504487c8de6d4dc70dc58ba">数据被数据类型约束，叫强类型语言。反之被约束的少，甚至不约束。叫弱类型</div><ul class="notion-list notion-list-disc notion-block-1ec4808c67094950a0962ad7b68a0d2d"><li>C语<b>言示例:if条件</b></li><ul class="notion-list notion-list-disc notion-block-1ec4808c67094950a0962ad7b68a0d2d"><div class="notion-text notion-block-53e3f01a13fc4a2aa8811f617be0a78d">例如在C语言中 if(x = 10)是可以被编译过去的。
而 C#语言则不允许， 因为C#语言中 括号内强制 要求为一个bool类型的值，也就是只能为true 和 false</div></ul></ul><ul class="notion-list notion-list-disc notion-block-494d049e34784acd8a5f64a1db50cc8f"><li><b>JavaScript示例:动态类型</b></li><ul class="notion-list notion-list-disc notion-block-494d049e34784acd8a5f64a1db50cc8f"><div class="notion-text notion-block-9f7190f4fb664a83bfec6ff615d91b51">var myVar = 100;
myVar = “hello”;
alert(myVar);
这段代码在这里是可以运行的</div></ul></ul><ul class="notion-list notion-list-disc notion-block-2b0fa4a53d8a41dea0f3a318fadd0ffb"><li><b>C#语言对弱类型/动态类型的模仿</b></li><ul class="notion-list notion-list-disc notion-block-2b0fa4a53d8a41dea0f3a318fadd0ffb"><div class="notion-text notion-block-8b1be4b0e2f7419d81ef675c545030ff">在C#语言中为了模仿弱类型，引用了一个新的关键字：<code class="notion-inline-code"><b>dynamic</b></code><b> 
</b>这个关键字可以实现上边的功能</div></ul></ul></div></details><details class="notion-toggle notion-block-d9ffe71ab12440ae9ceb80843dad8e40"><summary><h4 class="notion-h notion-h3 notion-block-d9ffe71ab12440ae9ceb80843dad8e40" data-id="d9ffe71ab12440ae9ceb80843dad8e40"><span><div id="d9ffe71ab12440ae9ceb80843dad8e40" class="notion-header-anchor"></div><span class="notion-h-title">在C#语言中的作用</span></span></h4></summary><div><div class="notion-text notion-block-65155df175a44b009ab66aaadea63afe"><b>一、程序的静态与动态时期</b></div><div class="notion-text notion-block-3f84988bd5c547fea4bb16a7a24dec61">程序在执行时为动态时期（运行时期），也称为运行或调试阶段。在这个阶段，程序被加载到内存中运行。可以说，动态的程序是在内存里的，此时方法调用使用栈（Stack），存储对象使用堆（Heap）。</div><div class="notion-text notion-block-b2d188e3d19c4bdea246f40de2061011">而在静态时期，即写代码或编译阶段，程序以代码文件的形式存储在硬盘里。</div><div class="notion-text notion-block-8f8b58c03f5146ddaae0362862fedac2"><b>二、栈（Stack）的特点</b></div><div class="notion-text notion-block-deeabd6450564d7aa64d37afef74fe48">栈的空间相对较小，一般为 1 - 2M，但其速度快。当方法被调用时，方法的参数和局部变量会在栈上分配内存。由于栈的内存空间有限，当不断进行方法调用或在方法中不断创建新的变量，导致栈满时，就会出现栈溢出（Stack overflow）的情况。例如，可以通过直接递归某个方法，在方法中不断创建新的变量来测试栈溢出；或者在方法前添加<code class="notion-inline-code">unsafe</code>前缀后，使用<code class="notion-inline-code">int* p = stackalloc int(9999999);</code>在栈中切除很大的一块内存，也可能引发栈溢出。</div><div class="notion-text notion-block-6be0c456758a4040874317825a093eb7"><b>三、堆（Heap）的特点</b></div><div class="notion-text notion-block-36a1220d973f4eb5a1e0b381d41858d9">堆的空间相对较大，能有几个 G。对象存储在堆上，在堆上分配内存相对较慢。同时，堆可能会出现内存泄漏的情况，即如果程序员忘记释放不再使用的内存，就会导致内存浪费。不过，C# 有垃圾收集器的机制，垃圾收集器会自动收集不再使用的对象所占用的内存空间，从而在一定程度上避免了内存泄漏的问题。</div><div class="notion-blank notion-block-a63ce646226148f4bc06f4cca38e8fc7"> </div><div class="notion-text notion-block-8783861c635f4d4e9611bf07dbe6379e"><b>在C#语言中的作用</b></div><ul class="notion-list notion-list-disc notion-block-051a943adeae45a6b4615250fba1c760"><li>一个C#类型中所包含的信息有：</li><ul class="notion-list notion-list-disc notion-block-051a943adeae45a6b4615250fba1c760"><li>存储此类型变量所需的内存空间大小</li><li>此类型的值可表示的最大、最小值范围</li><li>此类型所包含的成员(如方法、属性、事件等 )</li><li>此类型由何基类派生而来</li><li>程序运行的时候，此类型的变量在分配在内存的什么位置</li><ul class="notion-list notion-list-disc notion-block-06b114c9a84740b1921ffdd27ed029fd"><li>Stack简介</li><li>Stack overflow</li><li>Heap简介</li><li>使用Performance Monitor查看进程的堆内存使用量</li><li>关于内存泄漏</li></ul><li>此类型所允许的操作(运算)</li></ul></ul></div></details><details class="notion-toggle notion-block-fb9c771c079b46d381036566908c5b6d"><summary><h4 class="notion-h notion-h3 notion-block-fb9c771c079b46d381036566908c5b6d" data-id="fb9c771c079b46d381036566908c5b6d"><span><div id="fb9c771c079b46d381036566908c5b6d" class="notion-header-anchor"></div><span class="notion-h-title">C#语言的类型系统</span></span></h4></summary><div><div class="notion-text notion-block-a768037799324bbd87075e613f4fbb5b"><b>一、C#的五大数据类型：</b></div><ul class="notion-list notion-list-disc notion-block-918d8e79f1404dc19b2d64f270b6e7dc"><li><b>类(Classes)</b>:                   如Windows, Form, Console, String</li></ul><ul class="notion-list notion-list-disc notion-block-f6ad40632ae1470faa6bd0692fb6855e"><li><b>结构体(Structures)</b>:     如Int32, Int64, Single, Double</li></ul><ul class="notion-list notion-list-disc notion-block-5cb42a408b084bbd9b5e8c531a96c6b1"><li><b>枚举(Enumerations)</b>:   如HorizontalAlignment, Visibility</li></ul><ul class="notion-list notion-list-disc notion-block-d6bb1195a6b342fea29275fcbb83a717"><li><b>接口(Interfaces )</b></li></ul><ul class="notion-list notion-list-disc notion-block-6d71ec3ee486454d85a2160df86c73e1"><li><b>委托(Delegates )</b></li></ul><div class="notion-text notion-block-e0e69f54efd34effb07e4c13cb194971"><b>二、C#类型的派生谱系：</b></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-9edc185921fa44a3af6c9555cab78afd"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/90238bf2-e3ab-4af2-8908-4fcd4fdecdca.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=9edc1859-21fa-44a3-af6c-9555cab78afd" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-9cebbe8f0bc74eb88843f464b858167f">C shap中 的类型分为两种：引用类型和值类型。引用类型分为类、接口、委托；值类型有结构体和枚举。所有类型都以Object类型为自己的基类型。</div><div class="notion-text notion-block-1a7d08880bbf414c994b19163d6eb40e"><b>第一组（左边）</b></div><ul class="notion-list notion-list-disc notion-block-4e5ac7018a8f452bbb34614989a90156"><li>Object、string 为真正的数据类型（因为这两个太常用了。所以C#把他吸收为自己的关键字了。） <b>string 为 引用类型 存储在 堆</b></li></ul><ul class="notion-list notion-list-disc notion-block-27a677a32f734cc288cab65cbe1c1de3"><li>横线下边的三个数据类型 不是具体的数据类型，而是我们用他们三个关键字去定义自己的数据类型</li></ul><div class="notion-text notion-block-960cd617f8e24c7f86d2c53cdfa2b0f6"><b>第二组</b></div><ul class="notion-list notion-list-disc notion-block-4d9a7441ebf544e48a377575d5c8c23f"><li>同上</li></ul><div class="notion-text notion-block-145620a292c64c8b87e5e2bd22cfc9ee"><b>第三组</b></div><ul class="notion-list notion-list-disc notion-block-4bd968a4847f43ff86af799b9cf3547c"><li>上为bool类型的值</li></ul><ul class="notion-list notion-list-disc notion-block-17cd5923769e4c81aa9b12c539cd612d"><li>中为 无返回值 和  为空</li></ul><ul class="notion-list notion-list-disc notion-block-29ac29ea00a548b0be0fc8733a1b6544"><li>下为 声明变量</li></ul></div></details><details class="notion-toggle notion-block-535f8770aa5b4cde9a14f308bffc3e1e"><summary><h4 class="notion-h notion-h3 notion-block-535f8770aa5b4cde9a14f308bffc3e1e" data-id="535f8770aa5b4cde9a14f308bffc3e1e"><span><div id="535f8770aa5b4cde9a14f308bffc3e1e" class="notion-header-anchor"></div><span class="notion-h-title">变量、对象与内存</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-23690ac3316a43eebd252f4215970859"><li><b>什么是变量</b></li><ul class="notion-list notion-list-disc notion-block-23690ac3316a43eebd252f4215970859"><ol start="1" class="notion-list notion-list-numbered notion-block-2367d177954d4d2ca039c72d85e83446" style="list-style-type:decimal"><li>表面上来看，变量的用途是存储数据
</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-fc5048a9c74b43e1a1e4b049fd32f382" style="list-style-type:decimal"><li>实际上，<span class="notion-purple">变量表示了存储位置，并且每个变量都有一个类型，以决定什么样的值能够存入变量
</span><em><span class="notion-pink">（变量名（对应这）变量的值在内存中存储位置 并且决定了什么样的值能够存融入）</span></em></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-583fadd2efb645ab809bd30a018989ae" style="list-style-type:decimal"><li>变量一共有7种·</li><ol class="notion-list notion-list-numbered notion-block-583fadd2efb645ab809bd30a018989ae" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-1f34807f3cd3408481305194aad9ffd6"><li>静态变量（静态字段），实例变量(成员变量,字段),  数组元素,   值参数,   引用参数,   输出参数,   局部变量
ref 引用的 值参数 为引用变量。out  引用的 值参数 为输出参数
一般称的变量为：局部变量</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-3fdba3a2b4eb469c99359cf5c3942ee8" style="list-style-type:decimal"><li>狭义的变量指局部变量，因为其它种类的变量都有自己的约定名称</li><ol class="notion-list notion-list-numbered notion-block-3fdba3a2b4eb469c99359cf5c3942ee8" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-a6c1aa75b743409abde639e149f8e14d"><li>简单地讲，局部变量就是方法体(函数体)里声明的变量</li></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-49bccadf9bf14469be644049fc7cba57" style="list-style-type:decimal"><li>变量的声明</li><ol class="notion-list notion-list-numbered notion-block-49bccadf9bf14469be644049fc7cba57" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-7e30843a7ac74a8e9c44baafa4da687c"><li><span class="notion-purple">有效的修饰符组合opt - 类型 - 变量名 - 初始化器opt。
</span><em><span class="notion-pink">opt意思就是可有可无
比如</span></em><em><span class="notion-pink"><code class="notion-inline-code">public static int Age = 0:;</code></span></em><em><span class="notion-pink">
</span></em><em><span class="notion-pink"><code class="notion-inline-code">public static</code></span></em><em><span class="notion-pink"> 是有效的修饰符组合</span></em><em><span class="notion-pink"><code class="notion-inline-code"> int </code></span></em><em><span class="notion-pink">为类型</span></em><em><span class="notion-pink"><code class="notion-inline-code"> Age</code></span></em><em><span class="notion-pink"> 为变量名</span></em><em><span class="notion-pink"><code class="notion-inline-code"> =0 </code></span></em><em><span class="notion-pink">则为初始化器</span></em></li></ul><blockquote class="notion-quote notion-block-d23ea6c290f84c38b41e54a901dddea4"><div><b>总结：  </b>”变量 = 以变量名所对应的<span class="notion-blue">内存地址</span>为起点、以其数据类型所要求的存储空间为长度的一块内存区域“  （大小端 与硬件有关）
   值类型在栈上分配内存，不同的值类型占用的字节大小固定，如<code class="notion-inline-code">byte</code>占用 1 个字节，<code class="notion-inline-code">int</code>占用 4 个字节等。
   引用类型的对象在堆上分配内存，引用本身在 32 位系统上通常占用 4 个字节，在 64 位系统上通常占用 8 个字节，它只是指向堆上对象的内存地址。<b> 
</b><b><span class="notion-inline-underscore">栈内存的增长方向通常是由高地址向低地址</span></b></div></blockquote></ol></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-a260603db09f4b579b64c7d2b68b759c"><li><b>值类型的变量</b></li><ul class="notion-list notion-list-disc notion-block-a260603db09f4b579b64c7d2b68b759c"><ol start="1" class="notion-list notion-list-numbered notion-block-8b0e344f2a114590a7ec093bc176a43b" style="list-style-type:decimal"><li>以byte / sbtye / short / ushort为例</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-79badca6eead465bbbcfa0745a181244" style="list-style-type:decimal"><li>值类型没有实例，所谓的“实例”与变量合而为一
也就是说，int x;   相当于  int x = new int x();</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-7a96bebebf724ffc88a8798c74459292"><li><b>引用类型的变量与实例</b></li><ul class="notion-list notion-list-disc notion-block-7a96bebebf724ffc88a8798c74459292"><ol start="1" class="notion-list notion-list-numbered notion-block-3fecbd386dd843bf985c29e066246513" style="list-style-type:decimal"><li>引用类型变量与实例的关系:引用类型变量里存储的数据是对象的内存地址</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-3e0301ebde074b1880b8e21d3bd7aaf0"><li><b>变量的默认值</b></li></ul><ul class="notion-list notion-list-disc notion-block-ae07d21279264e029793792389a4ccdf"><li><b>常量(值不可改变的变量) const</b></li></ul><ul class="notion-list notion-list-disc notion-block-49f84bcfe93e45dca5aafff6ef599fa7"><li><b>装箱与拆箱(Boxing &amp; Unboxing)</b></li><ul class="notion-list notion-list-disc notion-block-49f84bcfe93e45dca5aafff6ef599fa7"><li>当把一个值类型转换为<code class="notion-inline-code">object</code>类型时，会发生<b>装箱操作。</b>
（object obj  ，obj 变量是在栈上的）
例如，将一个整数赋值给<code class="notion-inline-code">object</code>变量：</li><ul class="notion-list notion-list-disc notion-block-334746951c9845a7b2a0e60459f2bdcf"><div class="notion-text notion-block-a46a34eeb0034ec39ae8a265716b8d85">在这个过程中，会在堆上创建一个新的对象，并将值类型的值复制到这个对象中。同时，在栈上会存储对这个堆上对象的引用。</div></ul><li>当从<code class="notion-inline-code">object</code>类型转换回值类型时，会发生拆箱操作。例如：</li><ul class="notion-list notion-list-disc notion-block-0cd419c87f0941c184fc528235f5cb42"><div class="notion-text notion-block-8322a6722c7b4a53874716d497567503">在拆箱过程中，首先要检查堆上的对象是否为正确的类型，如果是，则将值从堆上的对象复制到栈上的值类型变量中。</div><div class="notion-text notion-block-b93eaa70e78e4d97949e18b10abe0e95">总的来说，装箱和拆箱操作涉及到堆和栈的交互。
装箱时，值类型的值被复制到堆上的对象中，栈上存储对堆上对象的引用；
拆箱时，从堆上的对象中复制值到栈上的值类型变量中。
<b>这些操作会带来一些性能开销</b></div></ul></ul></ul></div></details></div></details><details class="notion-toggle notion-block-6f6067b2bc6a49d8b80c11c55ed9c206"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-6f6067b2bc6a49d8b80c11c55ed9c206" data-id="6f6067b2bc6a49d8b80c11c55ed9c206"><span><div id="6f6067b2bc6a49d8b80c11c55ed9c206" class="notion-header-anchor"></div><span class="notion-h-title">五、方法的定义、调用和调试*</span></span></h2></summary><div><div class="notion-text notion-block-6f63914569e540ebb72f45897f5bfc7c">方法在创建时，被static 修饰 会变为 类的方法。 否则为 实例的方法。</div><div class="notion-text notion-block-e57b613e7a6247128e23e447db4c5d01">实例的方法只有在创建出实例后，用实例引出。</div><div class="notion-text notion-block-20253a3381a74d4a8f426fb9826b127c">静态的方法会一直占用内存， 实例 则可以被释放</div><div class="notion-blank notion-block-d47240ab52ce48fa9a8c109b67fbf3d7"> </div><div class="notion-text notion-block-d4c2c0701d9542f39bc8c9cdb43f89df">调用方法的()为 方法调用操作符</div><details class="notion-toggle notion-block-9dfba9dd18a24b21a58ae5178dbd453e"><summary><h3 class="notion-h notion-h2 notion-block-9dfba9dd18a24b21a58ae5178dbd453e" data-id="9dfba9dd18a24b21a58ae5178dbd453e"><span><div id="9dfba9dd18a24b21a58ae5178dbd453e" class="notion-header-anchor"></div><span class="notion-h-title">构造器(一种特殊的方法)</span></span></h3></summary><div><div class="notion-text notion-block-59bec14df18a4dcaadbbcbbc5b354fbf">构造器(constructor)是类型的成员之一</div><div class="notion-text notion-block-ab3739ad6cb049369815b82016a98321">狭义的构造器指的是“实例构造器&#x27;(instance constructor )</div><details class="notion-toggle notion-block-ec9f8140d8b345898bc192f8075fd5e3"><summary><h4 class="notion-h notion-h3 notion-block-ec9f8140d8b345898bc192f8075fd5e3" data-id="ec9f8140d8b345898bc192f8075fd5e3"><span><div id="ec9f8140d8b345898bc192f8075fd5e3" class="notion-header-anchor"></div><span class="notion-h-title">声明和调用构造器</span></span></h4></summary><div><div class="notion-text notion-block-ef33880d5c484a80bd562f4714831055">在 C# 中，当我们写好一个类之后，如果没有进行额外的操作，系统会自动提供一个默认的构造器。这个默认构造器会将类中没有赋值的参数初始化为默认值。例如：</div><div class="notion-text notion-block-545f85989eaa4817b5d9474f59463e64">此时若调用 <code class="notion-inline-code">Console.WriteLine(student.ID);</code> 和 <code class="notion-inline-code">Console.WriteLine(student.Name);</code>，那么输出就是 0 和空字符串。
我们也可以自己创建构造器。由于构造器没有输入与输出，所以可以像下面这样创建：</div><div class="notion-text notion-block-d05708eaed454d26abc2766255e71c55">这样，当创建一个 <code class="notion-inline-code">Student</code> 类的实例时，使用默认构造器初始化后的输出就是 1 和 &quot;No Name&quot;。
当然，我们还可以在创建实例时要求给变量初始值，这就是构造函数重载。例如：</div><div class="notion-text notion-block-77ad384c963f43b08b8c545b5381ff20">现在，当我们运行以下代码：</div><div class="notion-text notion-block-292a672c2ea940a08ec3114ff153279b">输出结果为：先是 1 和 &quot;No Name&quot;，接着是一个分隔符 &quot;==================&quot;，然后是 2 和 &quot;Hello&quot;。通过构造函数重载，我们可以根据不同的需求灵活地初始化类的实例。</div></div></details><details class="notion-toggle notion-block-082cdec509754cb491bd0c1198fae05e"><summary><h4 class="notion-h notion-h3 notion-block-082cdec509754cb491bd0c1198fae05e" data-id="082cdec509754cb491bd0c1198fae05e"><span><div id="082cdec509754cb491bd0c1198fae05e" class="notion-header-anchor"></div><span class="notion-h-title">构造器的内存原理</span></span></h4></summary><div><div class="notion-text notion-block-cd1cce8e59954a2a8750424fd83905cb">在 C# 中，对于类<code class="notion-inline-code">Student</code>含有<code class="notion-inline-code">int ID</code>和<code class="notion-inline-code">string Name</code>两个成员变量。</div><div class="notion-text notion-block-6fca8ac82fb24ffd88c1cb562cb40d19">当类中没有显式编写构造器时，即使用默认构造器。
此时创建实例<code class="notion-inline-code">Student stu = new Student();</code>，在内存中的操作如下：首先在栈区为变量<code class="notion-inline-code">stu</code>分配内存，该内存用于保存堆区中实例的地址。接着在堆区为<code class="notion-inline-code">int</code>类型的<code class="notion-inline-code">ID</code>和<code class="notion-inline-code">string</code>类型的<code class="notion-inline-code">Name</code>各分配四个字节的内存。其中，<code class="notion-inline-code">int</code>类型的四个字节会以小端的补码形式存入，而<code class="notion-inline-code">string</code>类型在默认情况下会被初始化为指向空字符。</div><div class="notion-text notion-block-fa73e173ca4840d9bd5480711df698d3">当类中自己创建了构造器，并且在构造器中将<code class="notion-inline-code">ID</code>赋值为 1，<code class="notion-inline-code">Name</code>赋值为 &quot;Hello&quot;。当创建实例<code class="notion-inline-code">Student stu = new Student();</code>时，内存操作过程与默认构造器类似，首先在栈区为<code class="notion-inline-code">stu</code>变量分配内存以保存堆区实例地址。然后在堆区为<code class="notion-inline-code">int</code>和<code class="notion-inline-code">string</code>各分配四个字节内存。对于<code class="notion-inline-code">int</code>类型依旧以小端的方式存入数字 1。对于<code class="notion-inline-code">string</code>类型，系统会在堆区另外开辟足够大的内存空间来存储 &quot;Hello&quot; 字符串，然后<code class="notion-inline-code">Name</code>会指向堆区这个存储 &quot;Hello&quot; 的地址，以小端的补码形式存储在内存中。</div><div class="notion-text notion-block-ad57cf19e5d54f43b4c416ffa063beda">总之，构造器的不同 会影响堆区中对象的初始化方式，进而影响内存的分配和数据的存储。</div></div></details></div></details><details class="notion-toggle notion-block-df4064eac5bd43299145cbe10c086d79"><summary><h3 class="notion-h notion-h2 notion-block-df4064eac5bd43299145cbe10c086d79" data-id="df4064eac5bd43299145cbe10c086d79"><span><div id="df4064eac5bd43299145cbe10c086d79" class="notion-header-anchor"></div><span class="notion-h-title">方法的重载(Overload )</span></span></h3></summary><div><div class="notion-text notion-block-b2aaf42fe64a4b6aa6c2f33a538d17f5"><b>声明带有重载的方法</b></div><div class="notion-text notion-block-8aad08efd53944239258e306d836182f"><b>方法签名</b>由方法的名称、类型形参的个数以及它的每一个形参（按从左到右的顺序）的类型和种类（值、引用或输出）组成。需注意，方法签名不包含返回类型。

同样，<b>实例构造器</b>签名由它的每一个形参（按从左到右的顺序）的类型和种类组成。
</div><div class="notion-text notion-block-95568d657a654ad6a90b360b0bc2bb5e">重载决策是在给定了参数列表和一组候选函数成员的情况下，选择一个最佳函数成员来实施调用。例如，在 C# 中常见的 <code class="notion-inline-code">Console.WriteLine</code> 方法就有多种重载形式，可以根据不同的参数类型输出不同的内容。</div><div class="notion-text notion-block-24416e22e57f426590b1a01805d91994">下面以一个简单的计算器类为例：</div><div class="notion-text notion-block-d33c5f0d07f74b24a6091aa51e2f6662">在这个例子中，<code class="notion-inline-code">Calculator</code>类中的<code class="notion-inline-code">Add</code>方法有多个重载版本。当调用这个方法时，编译器会根据传入的参数来确定具体调用哪个重载的方法。</div><blockquote class="notion-quote notion-block-42d0d58c9c414e069b7d3c3f0f8e9c38"><div>对于方法的重载，作为初学者要记住，方法的名字可以相同，但它的参数列表不能完全一样，即参数的个数、类型或种类不同，从而形成不同的方法签名。这样，在调用方法时，编译器可以根据传入的参数来确定具体调用哪个重载的方法。</div></blockquote></div></details><details class="notion-toggle notion-block-02341c909a8545c19838ef62ab4c31ed"><summary><h3 class="notion-h notion-h2 notion-block-02341c909a8545c19838ef62ab4c31ed" data-id="02341c909a8545c19838ef62ab4c31ed"><span><div id="02341c909a8545c19838ef62ab4c31ed" class="notion-header-anchor"></div><span class="notion-h-title">如何对方法进行debug</span></span></h3></summary><div><div class="notion-text notion-block-1e39e1ebe4be4b64bc8f5c8e935e2a5f">Call Stack  调用堆栈 ：可以看注意看栈的深度（函数之间的调用调用调用）</div><div class="notion-text notion-block-0ca3f99372f44be3b45b46726a189f21">还有看变量，这个很熟悉了不写了</div></div></details><details class="notion-toggle notion-block-3ece2721f10e43a7864b725ceee06862"><summary><h3 class="notion-h notion-h2 notion-block-3ece2721f10e43a7864b725ceee06862" data-id="3ece2721f10e43a7864b725ceee06862"><span><div id="3ece2721f10e43a7864b725ceee06862" class="notion-header-anchor"></div><span class="notion-h-title">方法的调用与栈*</span></span></h3></summary><div><div class="notion-text notion-block-cca59d12dba74d7b837929c67e79fc87">栈内存的增长方向是由高字节位向低字节位发展，当不断进行方法调用而栈内存使用达到其最大限度时（层级过深），就会出现 “Stack overflow（栈溢出）” 的情况。</div><div class="notion-text notion-block-d98868945b0642ae9b1625652fc6b79e">对栈帧（stack frame）进行分析可以更好地理解方法调用在栈中的布局。首先，程序从<code class="notion-inline-code">main</code>方法开始执行，<code class="notion-inline-code">main</code>方法会占用一部分栈空间。当<code class="notion-inline-code">main</code>方法调用其他方法时，<code class="notion-inline-code">main</code>方法成为主调者（caller），被调用的方法成为被调者（callee）。</div><div class="notion-text notion-block-7274a586a6cb4b77abf8be2fb2c6e0d2">在调用方法时，传入的参数如果是变量，这些变量会被压入栈中。在 C# 语言中，这些变量由主调者（这里即<code class="notion-inline-code">main</code>方法）管理，并且是从左往右依次压入栈的。所以，传入的变量都处于主调者的栈帧中。</div><div class="notion-text notion-block-97c4972fce314e8c9a46671e8174051c">接着进入被调用的方法，被调用者的局部变量由被调用方法管理。如果在这个方法中又调用了其他方法，同样遵循上述规则。</div><div class="notion-text notion-block-a960a2d49e2243ddbc02274200ae6070">当方法执行完毕准备退出时，会首先将返回值存入 CPU 寄存器（如果寄存器空间不够，可能会采用在栈中开辟空间。CPU寄存器根据型号不同个数不同。一般就几个）。然后，销毁被调用方法中的局部变量。接着，销毁上一个调用者（主调者）传过来的参数。最后，将返回值赋值给上一个调用者的某个局部变量，以便主调者继续执行后续代码。</div><div class="notion-text notion-block-8affe7289c2840ca9478475a7f15d15d">总的来说，栈按照压入的顺序进行操作，后进先出。每个方法的调用都会在栈上创建一个新的栈帧，包含方法的参数和局部变量等信息。当方法执行完毕，对应的栈帧被销毁，释放内存空间。这种栈的管理方式确保了方法调用的正确执行和内存的有效管理。</div></div></details></div></details><details class="notion-toggle notion-block-a4d70bad6dcf4f9db6ec92a9fce43c01"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-a4d70bad6dcf4f9db6ec92a9fce43c01" data-id="a4d70bad6dcf4f9db6ec92a9fce43c01"><span><div id="a4d70bad6dcf4f9db6ec92a9fce43c01" class="notion-header-anchor"></div><span class="notion-h-title">六、操作符详解</span></span></h2></summary><div><ul class="notion-list notion-list-disc notion-block-6e3e4a193f2145d898c6a7ca76c97c0c"><li>操作符也叫运算符（Operator）</li></ul><ul class="notion-list notion-list-disc notion-block-65f910c9488249a5aed06294c7ff839d"><li>操作符是用来操作数据的，被操作符操作的数据称为操作数（Operand）</li></ul><details class="notion-toggle notion-block-bfe94c90904649e29b58875362b80cc2"><summary><h3 class="notion-h notion-h2 notion-block-bfe94c90904649e29b58875362b80cc2" data-id="bfe94c90904649e29b58875362b80cc2"><span><div id="bfe94c90904649e29b58875362b80cc2" class="notion-header-anchor"></div><span class="notion-h-title">操作符概览</span></span></h3></summary><div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-cfbd5ce0a563424994d98f34654be6f7"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/156e7fce-ee21-4f8b-a97f-cf476a2bffd2.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=cfbd5ce0-a563-4249-94d9-8f34654be6f7" alt="notion image" loading="lazy" decoding="async"/></div></figure><ul class="notion-list notion-list-disc notion-block-f5e5e933f08d4d1295b92dac909afec1"><li>从上往下优先级依次降低</li></ul><ul class="notion-list notion-list-disc notion-block-e34ce95ea65645c3a97b6c32bece1b57"><li><b>只有赋值操作符是从右往左运算</b></li></ul></div></details><details class="notion-toggle notion-block-182b07ec196d434781f5b11104fdbb1b"><summary><h3 class="notion-h notion-h2 notion-block-182b07ec196d434781f5b11104fdbb1b" data-id="182b07ec196d434781f5b11104fdbb1b"><span><div id="182b07ec196d434781f5b11104fdbb1b" class="notion-header-anchor"></div><span class="notion-h-title">操作符的本质</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-88fcd97cf5cf4b7caa17fff5dde0ac17"><li>操作符的本质是函数(即算法)的“简记法”</li><ul class="notion-list notion-list-disc notion-block-88fcd97cf5cf4b7caa17fff5dde0ac17"><li>假如没有发明”+”、只有Add函数，算式3+4+5将可以写成Add(Add(3,4),5)</li><li>假如没有发明“x” 、只有Mul函数，那么算式3+4x5将只能写成Adǎ(3,Mul(4,5))</li></ul></ul><ul class="notion-list notion-list-disc notion-block-747117c9b9b14555a0d2a2bbcea6fb52"><li>操作符不能脱离与它<b>关联的数据类型</b></li><ul class="notion-list notion-list-disc notion-block-747117c9b9b14555a0d2a2bbcea6fb52"><li>可以说操作符就是与固定数据类型相关联的一套基本算法的简记法</li><li>比如 int a ，b      a/b   这里的/是与证书相关联的。 同理double也是一样</li></ul></ul><div class="notion-text notion-block-06ae944305a04d22bdffa972ef763ca1">举个栗子，我们来自己创建一个关联我们的函数的 数据类型
通过这个例子，我们可以清晰地知道。 C# 的操作符本质上 就是 方法  的简记法</div><details class="notion-toggle notion-block-3f3f801c87df45249797028dffbf3359"><summary><h4 class="notion-h notion-h3 notion-block-3f3f801c87df45249797028dffbf3359" data-id="3f3f801c87df45249797028dffbf3359"><span><div id="3f3f801c87df45249797028dffbf3359" class="notion-header-anchor"></div><span class="notion-h-title">一个栗子</span></span></h4></summary><div></div></details></div></details><details class="notion-toggle notion-block-e4f0a76cd36f4164a6f0461de4cc8ee5"><summary><h3 class="notion-h notion-h2 notion-block-e4f0a76cd36f4164a6f0461de4cc8ee5" data-id="e4f0a76cd36f4164a6f0461de4cc8ee5"><span><div id="e4f0a76cd36f4164a6f0461de4cc8ee5" class="notion-header-anchor"></div><span class="notion-h-title">操作符的优先级</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-41e5c131b8ba4f00aabdd84989c35ffd"><li>操作符的优先级</li><ul class="notion-list notion-list-disc notion-block-41e5c131b8ba4f00aabdd84989c35ffd"><li>可以使用圆括号提高被括起来表达式的优先级</li><li>圆括号可以嵌套</li><li>不像数学里有方括号和花括号，在C#语言里““[ ]&quot;与”{ }“有专门的用途</li></ul></ul><ul class="notion-list notion-list-disc notion-block-65049f34748f4adfbee0f46dd4d8dbaf"><li>同优先级操作符的运算顺序</li><ul class="notion-list notion-list-disc notion-block-65049f34748f4adfbee0f46dd4d8dbaf"><li>除了带有赋值功能的操作符，同优先级操作符都是<b>由左向右</b>进行运算</li><li>带有赋值功能的操作符的运算顺序是<b>由右向左</b></li><li>与数学运算不同，计算机语言的同优先级运算没有“结合率”</li><ul class="notion-list notion-list-disc notion-block-79df10b5efaa46fa9a919fae24fe4de6"><li>3+4+5只能理解为Add(Add(3,4),5)不能理解为Add(3,Add(4,5))</li></ul></ul></ul></div></details><details class="notion-toggle notion-block-30fefa9eee1d4916bf06fda9078e50d1"><summary><h3 class="notion-h notion-h2 notion-block-30fefa9eee1d4916bf06fda9078e50d1" data-id="30fefa9eee1d4916bf06fda9078e50d1"><span><div id="30fefa9eee1d4916bf06fda9078e50d1" class="notion-header-anchor"></div><span class="notion-h-title">各类操作符的示例</span></span></h3></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-5eee2a8aec914a559c7ef36acec4d5d3" style="list-style-type:decimal"><li>成员访问运算符“.”：用于访问类中的成员或者访问位于某个名空间中的类</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-b8001e53aa4e40a3900823c58dc7826d" style="list-style-type:decimal"><li>typeof操作符：可以用于获取一个类型的完整信息，包括完整的类型名称，该类型包含在哪个命名空间中，该类型包含哪些成员等等</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-143f99012eaf4e9ca7db45c9cdd5b266" style="list-style-type:decimal"><li>default：该运算符用于获取一个类型的默认值，比如：</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-6ed7c9f05a364ee38817f21cf3b9fdc9" style="list-style-type:decimal"><li>var操作符：var可以声明隐式变量，他没有数据类型。它会根据赋值到的变量实例自动推断自己的类型。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-ad0889c4d59a4a73bf697426c2725c6e" style="list-style-type:decimal"><li>new操作符：new有两种用法</li><ol class="notion-list notion-list-numbered notion-block-ad0889c4d59a4a73bf697426c2725c6e" style="list-style-type:lower-alpha"><li>作为<b>操作符</b>，用于创建内存实例，并且立刻调用这个实例的实例构造器。并且返回实例的地址。</li><ol class="notion-list notion-list-numbered notion-block-4b3c8008ce84442e96d05683b449a47e" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-8c691a6feb8143e2a706400a0eb47743"><li>并且可以在实例后加入花括号，为实例的属性设置它的值。比如Form myFrom = new Form() {text = “Hello”};</li></ul><ul class="notion-list notion-list-disc notion-block-f61ccfac34bc45958614cb4ec988abd4"><li>当然有时候也不用new ，比如string ， 这是一个类类型，是为了规范，所以让我们省去了new 操作符，来创建 string实例</li></ul><ul class="notion-list notion-list-disc notion-block-6096d271f1fa462fa7db3ebd46e0d95d"><li>以上都是非匿名类型的。 new 操作符的使用也不一定非得跟一个数据类型，
new后也可以不跟东西。比如 var person = new {Name = “Haha”, Num = 34}；    （编译器会自动推断变量的类型）  这个 就是一个<b>隐式变量</b>。 他的类型会根据约定好的方式进行命名<code class="notion-inline-code">&lt;&gt;f__AnonymousType0\</code>2<code class="notion-inline-code">（f__AnonymousTyp 为 约定前缀，0为，程序中第1个，\</code>2指这是一个泛型类，构成这个类型需要两个类型。）
所以我们可以直接使用这个 person 实例</li></ul><ul class="notion-list notion-list-disc notion-block-0d257099e94a483bb2e3a078f70720b0"><li>#使用new操作符要小心，因为在类的方法中创建实例后，这个类就会和这个实例对应的对象所处的类紧密耦合，当后者 出现问题，前者也不能正常运行。产生了依赖。（为了解决这个，有个技术叫设计模式，可以有依赖注入，可以把紧耦合变为相对松一点的。）</li></ul></ol><li>作为修饰符，作为关键字 在类成员前面    表示子类的方法 隐藏 父类方法</li><ol class="notion-list notion-list-numbered notion-block-9ad8e7ee5013461781c4d91c348ecefb" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-eb9df299ec2a4868957f7df091b79cdf"><li>派生（继承）：用法是子类方法名:父类方法名
子类 会继承 父类的所有方法。
子类可以在类中创建与父类 相同名称的方法，并在前缀加入new 修饰符。来覆盖（或隐藏）父类的方法。然后在子类中调用方法就是子类中创建的方法。父类调用则还是父类的方法。</li></ul></ol></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-a47192bc6d644ec1ae21ba7ea78b3cac" style="list-style-type:decimal"><li>checked、unchecked 用来判断一个值是否在内存中溢出。</li><ol class="notion-list notion-list-numbered notion-block-a47192bc6d644ec1ae21ba7ea78b3cac" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-6d65d3e8a3be4d7db04e8b50f08bf929"><li>对一个已经赋值为最大值的 x  = checked(x+1)  会弹出警告，程序无法运行</li></ul><ul class="notion-list notion-list-disc notion-block-2a45095b2d00457e97202ef71c92a60f"><li><b>可以使用try  catch 来抓住异常并处理异常</b></li></ul><ul class="notion-list notion-list-disc notion-block-c2ca3d32676b48bcba6087276c59a16f"><li>C#中默认为unchecked</li></ul><ul class="notion-list notion-list-disc notion-block-043054670837462ca095534177f0be03"><li>可以使用checked {   }    语句块中所有溢出都会被检测到</li></ul></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-d1335eaa7daa49a096629df5271b0f22" style="list-style-type:decimal"><li>sizeof  操作符使用 时，如果要求结构体，需要把它放到不安全的上下文中才可以（unsafe{ }）</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-7711cfd153384ab68b11b256c94f762a" style="list-style-type:decimal"><li>-&gt;操作符    </li><ol class="notion-list notion-list-numbered notion-block-7711cfd153384ab68b11b256c94f762a" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-ea6c7cf547a444fdb7a0614f8bf227cb"><li>C#中规定 指针操作、取地址操作、以及用指针访问成员额操作 只能操作结构体类型，不能操作引用类型。</li></ul><ul class="notion-list notion-list-disc notion-block-7979c6357ce74822b1ceb46a61113572"><li>同理，也要用unsafe 来放到不安全的上下文中</li></ul></ol></ol><div class="notion-blank notion-block-2afea8388809467780aaf6b4664ff3c5"> </div></div></details></div></details><details class="notion-toggle notion-block-b3556a664dee4daa8313634c68aff207"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-b3556a664dee4daa8313634c68aff207" data-id="b3556a664dee4daa8313634c68aff207"><span><div id="b3556a664dee4daa8313634c68aff207" class="notion-header-anchor"></div><span class="notion-h-title">七、表达式和语句</span></span></h2></summary><div><details class="notion-toggle notion-block-95147c93110f43e3893000c99d3ff022"><summary><h3 class="notion-h notion-h2 notion-block-95147c93110f43e3893000c99d3ff022" data-id="95147c93110f43e3893000c99d3ff022"><span><div id="95147c93110f43e3893000c99d3ff022" class="notion-header-anchor"></div><span class="notion-h-title">表达式</span></span></h3></summary><div><div class="notion-text notion-block-e70e39f9c71e4e8d9c76c21a457fc3cb"><b>表达式的定义：</b></div><ul class="notion-list notion-list-disc notion-block-1126df75c4bc4f609814a9b4652d9343"><li>表达式是任何一门编程语言的基本组件最重要的组成部分之一</li></ul><ul class="notion-list notion-list-disc notion-block-1c6eb95185444297b4adef30444e4811"><li>表达式是专门用来求值的一种语法实体</li></ul><div class="notion-text notion-block-e65e22c9be4e4091ba293ae98f25333d"><b>C#对表达式的定义</b><div class="notion-text-children"><ul class="notion-list notion-list-disc notion-block-2ff4b6a070194f45a47c77f9bfd81d04"><li>表达式是由一个或多个操作数和零个或多个操作符组成的序列，这些操作符可以求值为单个值、对象、方法或名称空间。</li></ul><ul class="notion-list notion-list-disc notion-block-b28db9f30ded468ea6e571e0e89ee95f"><li>得到值：x++，x = 100， --x等。他们的结果是一个值</li></ul><ul class="notion-list notion-list-disc notion-block-d0e917e93e7c4eb48cd6626601a4419a"><li>得到对象：new Form()  其中new为操作符， Form为操作数、（）为调用它的构造函数。他们的结果是一个对象</li></ul><ul class="notion-list notion-list-disc notion-block-f2f49b4cb8904f8dbcdae8d5c8a8eb52"><li>得到方法：Action myAction = new Action（Console.WriteLine）； </li><ul class="notion-list notion-list-disc notion-block-f2f49b4cb8904f8dbcdae8d5c8a8eb52"><li>其中.为成员访问表达式，操作数有两个，在这个函数中左边是类型，右边是类型的成员</li><li>这个表达式得到的结果，是一个方法。 方法也是一个语法实体。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-06a0018a4be641fcab95415fa9076d02"><li>得到名称空间：<a class="notion-link" href="http://System.Windows" target="_blank" rel="noopener noreferrer">System.Windows</a>.Forms.Form myForm = new Form()</li><ul class="notion-list notion-list-disc notion-block-06a0018a4be641fcab95415fa9076d02"><li>其中，.是名称空间访问表达式，在这里。左边为主名称空间，.右边是子名称空间。这个表达式经过求职之后得到的值就是一个名称空间。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-5d0a9eb84d4644e5879bd4b856d6f715"><li>表达式可以由文字值、方法调用、操作符及其操作数或简单名称组成。</li></ul><ul class="notion-list notion-list-disc notion-block-ccdea2831ba34b7f8032d8f4b8e99b4d"><li>简单名称可以是变量、类型成员、方法参数、名称空间或类型的名称</li></ul></div></div><ul class="notion-list notion-list-disc notion-block-962150ad95014077b37c5d18eb10151b"><li>算法逻辑的基本（最小）的组成单元，表达一定的算法意图</li></ul><ul class="notion-list notion-list-disc notion-block-4c6f2710509c4f1ebe030868264cd3da"><li>因为操作符有优先级，所以表达式也就有了优先级。</li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-f980cda31269417fa332eb4686a65305"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/dabfce32-e8a1-4ee8-bba3-d2183c56da2b.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=f980cda3-1269-417f-a332-eb4686a65305" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><details class="notion-toggle notion-block-4855cf84007040e39f07e27259d5b941"><summary><h3 class="notion-h notion-h2 notion-block-4855cf84007040e39f07e27259d5b941" data-id="4855cf84007040e39f07e27259d5b941"><span><div id="4855cf84007040e39f07e27259d5b941" class="notion-header-anchor"></div><span class="notion-h-title">语句的定义</span></span></h3></summary><div><div class="notion-text notion-block-f35f714fb7a94dc49aaa277c813f7a09">在计算机编程语言中，语句是命令式编程语言中最小的独立元素。</div><ul class="notion-list notion-list-disc notion-block-3612f4950d804aab8812737f929f0a96"><li>命令式语言：大部分是高级语言，比如C# C++ JAVA等</li></ul><div class="notion-text notion-block-51c91552a88a4fd3b99fcb9b0bb64653">语句，是一种语法实体。他的功能是表达一些将被执行的动作。</div><div class="notion-text notion-block-95097d5f2998485e9616b24307d9999c">语句的内部组件就是表达式，每一个表达式都对应一个这个语句索要执行的一个动作。</div><div class="notion-text notion-block-b5881b01fe1f4397a9a6d45f11268143">一个高级语言所写成的程序，它实际上是由一系列语句所构成的</div><div class="notion-text notion-block-a277dbfd673f4dc3956f50821720e8a1">低级语言例如汇编语言和机器语言，他们只有指令，对应着CPU可以直接置信的动作</div><div class="notion-blank notion-block-929710c1d3464ee9b28bafda954c0c41"> </div><div class="notion-text notion-block-a2072242ce5f45be824fd185783f47da">例如我们可以在C语言 或C#语言编写后，勾选输出汇编文件或使用 对应的工具来查看C或C#语言编译出的的汇编代码</div><div class="notion-blank notion-block-5be40a62a3c04334aa51260447509fa5"> </div><div class="notion-text notion-block-84304a8680c64693b668c2a76c59c7b6">程序之中，<b>语句执行的顺序称为控制流（执行流）</b></div><div class="notion-text notion-block-10f878bbcb334a4bbf908cb2e5426b4b">C#语言的语句除了能够让程序员“顺序地”(sequentially)表达算法思想，还能通过条件判断、跳转和循环等方法控制程序逻辑的走向。</div><div class="notion-text notion-block-09a4712237324fc7aa55991b6cd43b78"><b>简言之就是:  </b>陈述算法思想，控制逻辑走向，完成有意义的动作(action)</div><div class="notion-text notion-block-ca3e41eea40140ed8bc7bd20e687957b">C#语言的语句由分号( ; )结尾，但由分号结尾的不一定都是语句<div class="notion-text-children"><ul class="notion-list notion-list-disc notion-block-0aba726ef36746a1b20e1ea42cf2c8dc"><li>例如引入名称空间。using 指令。</li></ul><ul class="notion-list notion-list-disc notion-block-e13b769a4fae49a8bcab93892b2a52c3"><li>例如public string Name;   字段的声明</li></ul></div></div><div class="notion-text notion-block-b17e62f5df6d43d7b7f74f05741e9270">语句一定是出现在方法体里</div></div></details><details class="notion-toggle notion-block-b887753b08d04c09b6b696a1c9f3b0a5"><summary><h3 class="notion-h notion-h2 notion-block-b887753b08d04c09b6b696a1c9f3b0a5" data-id="b887753b08d04c09b6b696a1c9f3b0a5"><span><div id="b887753b08d04c09b6b696a1c9f3b0a5" class="notion-header-anchor"></div><span class="notion-h-title">语句详解</span></span></h3></summary><div><details class="notion-toggle notion-block-ea36bc684fb54c2691c132c39c4cd0fd"><summary><h4 class="notion-h notion-h3 notion-block-ea36bc684fb54c2691c132c39c4cd0fd" data-id="ea36bc684fb54c2691c132c39c4cd0fd"><span><div id="ea36bc684fb54c2691c132c39c4cd0fd" class="notion-header-anchor"></div><span class="notion-h-title">C#语言的语句三大类</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-07ac643c10764e48aea9f6309e361489"><li><b>标签语句</b></li><ul class="notion-list notion-list-disc notion-block-07ac643c10764e48aea9f6309e361489"><div class="notion-text notion-block-1648b760a7ac411fb26e6f952096f004">前面带标签的语句，用得不多</div></ul></ul><ul class="notion-list notion-list-disc notion-block-4ddc924f2ef74b7d8e0093c5687d5317"><li><b>声明语句</b></li><ul class="notion-list notion-list-disc notion-block-4ddc924f2ef74b7d8e0093c5687d5317"><div class="notion-text notion-block-f62ab2c0a2de4fcd88a730a941de1564">用来声明变量，常量、</div></ul></ul><ul class="notion-list notion-list-disc notion-block-fc512ba3c14a4f219551f2ba84d72d68"><li><b>嵌入式语句</b></li></ul><ul class="notion-list notion-list-disc notion-block-16b1b54db1da409aa39f652a58a09e32"><li>被嵌入在其他语句当中的语句，就称为嵌入式语句</li><ul class="notion-list notion-list-disc notion-block-16b1b54db1da409aa39f652a58a09e32"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-64396f0ac7a646cf9050852ee5dd1269"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/9e1b1cb2-78dd-431b-b3d8-cfdbecc9cda0.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=64396f0a-c7a6-46cf-9050-852ee5dd1269" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul></div></details><details class="notion-toggle notion-block-48d34f6e43d94ec9b74e68a866223163"><summary><h4 class="notion-h notion-h3 notion-block-48d34f6e43d94ec9b74e68a866223163" data-id="48d34f6e43d94ec9b74e68a866223163"><span><div id="48d34f6e43d94ec9b74e68a866223163" class="notion-header-anchor"></div><span class="notion-h-title">C#语言语句详解</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-9b30963f610c42499d93eba3df12c540" style="list-style-type:decimal"><li>声明语句</li><ol class="notion-list notion-list-numbered notion-block-9b30963f610c42499d93eba3df12c540" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-02f5673dfa13479aaab5059888a568d7"><li>比如 int a ； int a = 100；（注意这俩，一个是声明，后续可赋值。一个是声明后追加初始化器）</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-bc2a6bc4f454415e95e3097aec4d036e" style="list-style-type:decimal"><li>表达式语句</li><ol class="notion-list notion-list-numbered notion-block-bc2a6bc4f454415e95e3097aec4d036e" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a0dcd698fe944c58152f9c3bc4ee5a4"><li>语句表达式+ ;  = 表达式语句。
（语句表达式是可以形成语句的表达式。不是所有表达式都可以作为语句来使用的）</li><ul class="notion-list notion-list-disc notion-block-2a0dcd698fe944c58152f9c3bc4ee5a4"><li>方法调用表达式（）； 比如打印“Hello World” 就是选择调用只接收一个字符串类型的重载。</li><li>对象创建表达式 new ：new操作符会创建一个对象，并调用对象的构造器。</li><li>赋值语句</li><li>后置（前置）自增（自减）表达式</li><li>await- expression</li><ul class="notion-list notion-list-disc notion-block-64db070cf979498b9f1979a887ccc9a3"><li>异步编程才用到。</li></ul></ul></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-26b07096bb194d97b4ea7ffc879846e7" style="list-style-type:decimal"><li><b>C#语言对语句的定义比C语言严格得多
</b>一些在C#中不能当做语句的表达式</li><ol class="notion-list notion-list-numbered notion-block-26b07096bb194d97b4ea7ffc879846e7" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-aae01702ba2b4a588bf3a5507efba7c5"><li>单独一行 x+y；  、  x；    y；    </li></ul><ul class="notion-list notion-list-disc notion-block-28422f010b55495a88c1cc49d22589eb"><li>而C语言可以。</li></ul></ol></ol></div></details></div></details></div></details><div class="notion-blank notion-block-797f73fdd99540e682cf29de721e695e"> </div><details class="notion-toggle notion-block-59aff50582604cab98da8e15d29c6ff2"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-59aff50582604cab98da8e15d29c6ff2" data-id="59aff50582604cab98da8e15d29c6ff2"><span><div id="59aff50582604cab98da8e15d29c6ff2" class="notion-header-anchor"></div><span class="notion-h-title">基于C#的串口助手</span></span></h2></summary><div><details class="notion-toggle notion-block-89a1151e64fe4346b08d9609d6d9f576"><summary><h3 class="notion-h notion-h2 notion-block-89a1151e64fe4346b08d9609d6d9f576" data-id="89a1151e64fe4346b08d9609d6d9f576"><span><div id="89a1151e64fe4346b08d9609d6d9f576" class="notion-header-anchor"></div><span class="notion-h-title">Demo1 实现基础的收发框架</span></span></h3></summary><div><details class="notion-toggle notion-block-acdb96aec7034311bafb9c7a396d4d98"><summary><h4 class="notion-h notion-h3 notion-block-acdb96aec7034311bafb9c7a396d4d98" data-id="acdb96aec7034311bafb9c7a396d4d98"><span><div id="acdb96aec7034311bafb9c7a396d4d98" class="notion-header-anchor"></div><span class="notion-h-title">实现的功能</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-dd41f18a8a104a68a7c42d3e5474bd91" style="list-style-type:decimal"><li>建立WinFrom项目</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-cd1436372b21499b81e08eb55489a7aa" style="list-style-type:decimal"><li>熟悉常用控件</li></ol></div></details><details class="notion-toggle notion-block-4799255bf0c64c7d96382fb0b69544c5"><summary><h4 class="notion-h notion-h3 notion-block-4799255bf0c64c7d96382fb0b69544c5" data-id="4799255bf0c64c7d96382fb0b69544c5"><span><div id="4799255bf0c64c7d96382fb0b69544c5" class="notion-header-anchor"></div><span class="notion-h-title">用到的控件</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-f8715d272972409abf3d78638b9aeac3"><li>label</li><ul class="notion-list notion-list-disc notion-block-f8715d272972409abf3d78638b9aeac3"><li>标签</li></ul></ul><ul class="notion-list notion-list-disc notion-block-9c7b6694ab684452b321550588fbdfc4"><li>ComboBox</li><ul class="notion-list notion-list-disc notion-block-9c7b6694ab684452b321550588fbdfc4"><li>下拉菜单</li></ul></ul><ul class="notion-list notion-list-disc notion-block-d91e01c63c3240279a3ffe53bddd74ef"><li>TextBox</li><ul class="notion-list notion-list-disc notion-block-d91e01c63c3240279a3ffe53bddd74ef"><li>文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-b20c80b00e82465f822f46bd9058e955"><li>RichTextBox</li><ul class="notion-list notion-list-disc notion-block-b20c80b00e82465f822f46bd9058e955"><li>复文本框</li><li>复文本框与文本框、标签的区别是，可以设置更多东西。有文本编辑等能力。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-338e6ea24e244ee4a1beab14aaa1cbc0"><li>Button</li><ul class="notion-list notion-list-disc notion-block-338e6ea24e244ee4a1beab14aaa1cbc0"><li>按钮</li></ul></ul></div></details><details class="notion-toggle notion-block-8624a0cfbab3422e87c2b260aec40769"><summary><h4 class="notion-h notion-h3 notion-block-8624a0cfbab3422e87c2b260aec40769" data-id="8624a0cfbab3422e87c2b260aec40769"><span><div id="8624a0cfbab3422e87c2b260aec40769" class="notion-header-anchor"></div><span class="notion-h-title">实现方法和思路</span></span></h4></summary><div><div class="notion-text notion-block-4d9b30987a8f47ed84157914eb57e4be">各个控件设置好位置和名称后，可以看到，在这个程序里，软件已经自动实例化了各个控件的对象，并且配置好了基础的属性，并在最后声明了这些实例化的对象。</div><div class="notion-row notion-block-93d4b5b2f26948b5b5620feda86629dc"><div class="notion-column notion-block-27bf0f75e01a455db2a30848eb2eed1a" style="width:calc((100% - (1 * min(32px, 4vw))) * 0.9375)"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-51b9e0f7a0574914842b0c0aa760ddb1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/12329654-44f5-48af-bedb-31eecf6a3a19.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=51b9e0f7-a057-4914-842b-0c0aa760ddb1" alt="notion image" loading="lazy" decoding="async"/></div></figure></div><div class="notion-spacer"></div><div class="notion-column notion-block-614a016bf4d74fd1a4f1058aeb0a31dc" style="width:calc((100% - (1 * min(32px, 4vw))) * 0.5)"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-2538e80a028e46c7ad97e28d0496a50d"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/e1548ea1-72dc-42eb-9fc8-daefae4ed0f1.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=2538e80a-028e-46c7-ad97-e28d0496a50d" alt="notion image" loading="lazy" decoding="async"/></div></figure></div><div class="notion-spacer"></div></div><div class="notion-text notion-block-a8a5cfc1d9e340b6ba86937372e3298f">下面再摸索一下，在窗口加载时初始化一些对象中的属性，需要在这个窗口控件的 这个事件下双击配置</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-e36a262c1afc4fdc990fc159f1aa8317"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/c86eb4f5-5223-48f2-a31a-b47c3a53ea21.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=e36a262c-1afc-4fdc-990f-c159f1aa8317" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-f0b56bcce6e2428dafba5b4ecce6657a">双击后，软件会自动生成一私有的方法， 可以在方法内对 声明的 实例化的对象进行属性的配置。如图</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-5ec88afbc24c475abb7f55a469a453f1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/88609695-51c5-405f-a499-c804ef2b40b7.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=5ec88afb-c24c-475a-bb7f-55a469a453f1" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-e2fc7b2c7d604f4c99c89222ff57e531">下面是发送按钮的配置，同上，也是在事件中，找到点击事件（也可以直接双击button控件）</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-07c3a0e748c34fafa471a3ca3a68aa0b"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/56360e28-f21c-4a8c-aa44-ceffb4e4a472.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=07c3a0e7-48c3-4faf-a471-a3ca3a68aa0b" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-d5274460d1b8459b8a4ccb3bfada3792">下面在私有的方法中配置如下内容，实现发送的基本逻辑</div></div></details></div></details><details class="notion-toggle notion-block-4f11c9d1abae4820bd7df843435bab09"><summary><h3 class="notion-h notion-h2 notion-block-4f11c9d1abae4820bd7df843435bab09" data-id="4f11c9d1abae4820bd7df843435bab09"><span><div id="4f11c9d1abae4820bd7df843435bab09" class="notion-header-anchor"></div><span class="notion-h-title">Demo2 创建界面</span></span></h3></summary><div><details class="notion-toggle notion-block-d038dec41bcd4d22bde071897cd9ee11"><summary><h4 class="notion-h notion-h3 notion-block-d038dec41bcd4d22bde071897cd9ee11" data-id="d038dec41bcd4d22bde071897cd9ee11"><span><div id="d038dec41bcd4d22bde071897cd9ee11" class="notion-header-anchor"></div><span class="notion-h-title">实现的功能</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-5a48fded6a3741c2bfc98d7f8ff726d7" style="list-style-type:decimal"><li>完善界面规划</li><ol class="notion-list notion-list-numbered notion-block-5a48fded6a3741c2bfc98d7f8ff726d7" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-961a34c74ff740768c6705638fd458c3"><li>配置区</li></ul><ul class="notion-list notion-list-disc notion-block-429c9ed01532487999ad1c06d92e0e55"><li>发送区</li></ul><ul class="notion-list notion-list-disc notion-block-2ea73453d6344ccbaa48a9a39a77a562"><li>接收区</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-ad76e315e61d4d499ed90136928385fe" style="list-style-type:decimal"><li>添加布局所有控件</li></ol></div></details><details class="notion-toggle notion-block-1e9fdbffbf4f4d7f80a3782c0e4c1627"><summary><h4 class="notion-h notion-h3 notion-block-1e9fdbffbf4f4d7f80a3782c0e4c1627" data-id="1e9fdbffbf4f4d7f80a3782c0e4c1627"><span><div id="1e9fdbffbf4f4d7f80a3782c0e4c1627" class="notion-header-anchor"></div><span class="notion-h-title">用到的控件</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-c8095d7c7a9b4800847f31a4f1511bbf"><li><b>label</b></li><ul class="notion-list notion-list-disc notion-block-c8095d7c7a9b4800847f31a4f1511bbf"><li>标签</li></ul></ul><ul class="notion-list notion-list-disc notion-block-72addadb32ea4170a157881c036fa461"><li>C<b>omboBox</b></li><ul class="notion-list notion-list-disc notion-block-72addadb32ea4170a157881c036fa461"><li>下拉菜单</li></ul></ul><ul class="notion-list notion-list-disc notion-block-7e20f9b04fb244839afe2faf309838c5"><li><b>TextBox</b></li><ul class="notion-list notion-list-disc notion-block-7e20f9b04fb244839afe2faf309838c5"><li>文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-2654bf1b3b324af8a94792f3b858d491"><li>R<b>ichTextBox</b></li><ul class="notion-list notion-list-disc notion-block-2654bf1b3b324af8a94792f3b858d491"><li>复文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-d3797d7f1047467fb1178923b8f71200"><li>Bu<b>tton</b></li><ul class="notion-list notion-list-disc notion-block-d3797d7f1047467fb1178923b8f71200"><li>按钮</li></ul></ul><ul class="notion-list notion-list-disc notion-block-74c659ef82d6413d96def4463753b7c3"><li><b>GropBox</b></li><ul class="notion-list notion-list-disc notion-block-74c659ef82d6413d96def4463753b7c3"><li>分组控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-22f51426b8e14025ad87b561dbaa709a"><li>C<b>heckBox</b></li><ul class="notion-list notion-list-disc notion-block-22f51426b8e14025ad87b561dbaa709a"><li>选择框控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-11ccf7122c084a0fbc1faee14d4c9fc2"><li><b>StatusStrip</b></li><ul class="notion-list notion-list-disc notion-block-11ccf7122c084a0fbc1faee14d4c9fc2"><li>状态栏控件</li></ul></ul></div></details><details class="notion-toggle notion-block-64062d98d1844896a33f2266de948746"><summary><h4 class="notion-h notion-h3 notion-block-64062d98d1844896a33f2266de948746" data-id="64062d98d1844896a33f2266de948746"><span><div id="64062d98d1844896a33f2266de948746" class="notion-header-anchor"></div><span class="notion-h-title">实现方法和思路</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-461601941e3940a6aef517bb9ae71a8b" style="list-style-type:decimal"><li>使用分组控件，分出三个区域，分别用作串口配置、接收配置和发送配置</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-b46d2425c471460e812ae91935b3c7b6" style="list-style-type:decimal"><li>使用选择框控件，用作功能开关</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-00c273528e114c6c9ab934d006ac0cbc" style="list-style-type:decimal"><li>使用状态栏控件， 创建StatusLabel标签，用于状态指示</li><ol class="notion-list notion-list-numbered notion-block-00c273528e114c6c9ab934d006ac0cbc" style="list-style-type:lower-alpha"><li>如果和下图一样，“初始化正常”字样的占长  修改的话， 需要修改下 状态图标的Spring（是否填满剩余空间）和AutoSize（自动调整项的大小） 设置为False</li></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-7d8c9cb73e554e1ba3d304a0a0288115" style="list-style-type:decimal"><li>最终效果如图</li></ol><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-a4ec6b34cfb1408a819ce52e721ae36b"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/5551b2b8-5f6b-456a-b1dd-85f2b9c15867.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=a4ec6b34-cfb1-408a-819c-e52e721ae36b" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details></div></details><details class="notion-toggle notion-block-2b7389a3ca2b432aaa409f09f9225eb7"><summary><h3 class="notion-h notion-h2 notion-block-2b7389a3ca2b432aaa409f09f9225eb7" data-id="2b7389a3ca2b432aaa409f09f9225eb7"><span><div id="2b7389a3ca2b432aaa409f09f9225eb7" class="notion-header-anchor"></div><span class="notion-h-title">Demo3 串口了解</span></span></h3></summary><div><details class="notion-toggle notion-block-bb1cf6fc1ef64997afd65acc3e961f23"><summary><h4 class="notion-h notion-h3 notion-block-bb1cf6fc1ef64997afd65acc3e961f23" data-id="bb1cf6fc1ef64997afd65acc3e961f23"><span><div id="bb1cf6fc1ef64997afd65acc3e961f23" class="notion-header-anchor"></div><span class="notion-h-title">实现的功能</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-9dbb5b01930142e4842e884974a11844" style="list-style-type:decimal"><li>修改各个控件的name，使其更加规范</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-c0b49b1be6c84a0083eda12c58fb9c16" style="list-style-type:decimal"><li>了解串口类</li><ol class="notion-list notion-list-numbered notion-block-c0b49b1be6c84a0083eda12c58fb9c16" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-22a2b94b809a4a69a7c68d369950c0c6"><li>string PortName（端口号）</li></ul><ul class="notion-list notion-list-disc notion-block-f59663eed506472789b80d740898cf8b"><li>int DataBits（数据位）</li></ul><ul class="notion-list notion-list-disc notion-block-5e0aee3dd1d546769af28f83a1dd1b03"><li>StopBits StopBits（停止位）</li></ul><ul class="notion-list notion-list-disc notion-block-060e9fa9cd0d462cb867cb982f884e44"><li>Parity Parity（校验位）</li></ul><ul class="notion-list notion-list-disc notion-block-40bb24ae730e4927bfcd592db5904634"><li>int BaudRate（波特率）</li></ul><ul class="notion-list notion-list-disc notion-block-440ee03d632243e686d74f3c1863c960"><li>bool IsOpen（状态）DtrEnable / RtsEnable</li></ul><ul class="notion-list notion-list-disc notion-block-4a3225704be145ff8b981cf72739ff2d"><li>获取端口号：RegistryKey keyCom = <code class="notion-inline-code">Registry.LocalMachine.OpenSubKey(@&quot;Hardware\DeviceMap\SerialComm&quot;);</code></li></ul><ul class="notion-list notion-list-disc notion-block-9617311c94b04336ac0175058385548d"><li>初始化配置参数，主要包括：端口号、波特率、数据位、停止位、校验位、编码格式
<code class="notion-inline-code">serialPort1.Encoding = Encoding.GetEncoding(&quot;GB2312&quot;);</code></li></ul></ol></ol></div></details><details class="notion-toggle notion-block-98503af791204315964a4ca49068771e"><summary><h4 class="notion-h notion-h3 notion-block-98503af791204315964a4ca49068771e" data-id="98503af791204315964a4ca49068771e"><span><div id="98503af791204315964a4ca49068771e" class="notion-header-anchor"></div><span class="notion-h-title">用到的控件</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-530f45edae0441f6bf84b3fce10838bf"><li><b>label</b></li><ul class="notion-list notion-list-disc notion-block-530f45edae0441f6bf84b3fce10838bf"><li>标签</li></ul></ul><ul class="notion-list notion-list-disc notion-block-669a2a0d66be4f5188935ce1d7fa2793"><li>C<b>omboBox</b></li><ul class="notion-list notion-list-disc notion-block-669a2a0d66be4f5188935ce1d7fa2793"><li>下拉菜单</li></ul></ul><ul class="notion-list notion-list-disc notion-block-16c9c51c388b4521a0f9ed29ac4ba4c9"><li><b>TextBox</b></li><ul class="notion-list notion-list-disc notion-block-16c9c51c388b4521a0f9ed29ac4ba4c9"><li>文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-a831d5d9d8274054a1814ae85cbf5baf"><li>R<b>ichTextBox</b></li><ul class="notion-list notion-list-disc notion-block-a831d5d9d8274054a1814ae85cbf5baf"><li>复文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-d046dbb219894a138da05635e547b786"><li>Bu<b>tton</b></li><ul class="notion-list notion-list-disc notion-block-d046dbb219894a138da05635e547b786"><li>按钮</li></ul></ul><ul class="notion-list notion-list-disc notion-block-3f3f8250782448be8d9df0fac786b109"><li><b>GropBox</b></li><ul class="notion-list notion-list-disc notion-block-3f3f8250782448be8d9df0fac786b109"><li>分组控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-a0497ebca4be47489e18dee050e15ae4"><li>C<b>heckBox</b></li><ul class="notion-list notion-list-disc notion-block-a0497ebca4be47489e18dee050e15ae4"><li>选择框控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-593741adac654a5bab477d40995a5f9e"><li><b>StatusStrip</b></li><ul class="notion-list notion-list-disc notion-block-593741adac654a5bab477d40995a5f9e"><li>状态栏控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-90818e83fffd47f7b49c61287def0a6d"><li><b>SerialPort</b></li><ul class="notion-list notion-list-disc notion-block-90818e83fffd47f7b49c61287def0a6d"><li>串口控件</li></ul></ul></div></details><details class="notion-toggle notion-block-f6c70821deb84a7a92afa3b03735de60"><summary><h4 class="notion-h notion-h3 notion-block-f6c70821deb84a7a92afa3b03735de60" data-id="f6c70821deb84a7a92afa3b03735de60"><span><div id="f6c70821deb84a7a92afa3b03735de60" class="notion-header-anchor"></div><span class="notion-h-title">实现方法和思路</span></span></h4></summary><div><div class="notion-text notion-block-2a4d7ad36a6842f3b1d7d1d58658efc1">这个Demo只做了解SerialPort类。所以只写了，点击打开串口时，的逻辑。</div><div class="notion-text notion-block-648d694267c24f99a888d064db0ce12f">在使用串口等 需要操作IO的类时，为了避免发生的错误，一般会用</div><div class="notion-text notion-block-d9b75ebe69ac440e86c39144f1881e96">来吧可能出现的错误先 抛出来。</div><div class="notion-text notion-block-d711ddce307e481ab5b505626a82ebac">最终代码</div></div></details></div></details><details class="notion-toggle notion-block-ec20a0566f5343dd8b892631823a8242"><summary><h3 class="notion-h notion-h2 notion-block-ec20a0566f5343dd8b892631823a8242" data-id="ec20a0566f5343dd8b892631823a8242"><span><div id="ec20a0566f5343dd8b892631823a8242" class="notion-header-anchor"></div><span class="notion-h-title">Demo4 串口打开、关闭</span></span></h3></summary><div><details class="notion-toggle notion-block-abfd2a81c2284fe9b6128d5939378c6e"><summary><h4 class="notion-h notion-h3 notion-block-abfd2a81c2284fe9b6128d5939378c6e" data-id="abfd2a81c2284fe9b6128d5939378c6e"><span><div id="abfd2a81c2284fe9b6128d5939378c6e" class="notion-header-anchor"></div><span class="notion-h-title">实现的功能</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-cdc5ab3ffee74e9fb102b3633dc01307" style="list-style-type:decimal"><li>实现串口的初始化（port，波特率、奇偶校验、停止位）</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1811f81794354c978f3c8238daa6a6b3" style="list-style-type:decimal"><li>串口开关</li></ol></div></details><details class="notion-toggle notion-block-236b01f3294145518c2ced8214497d55"><summary><h4 class="notion-h notion-h3 notion-block-236b01f3294145518c2ced8214497d55" data-id="236b01f3294145518c2ced8214497d55"><span><div id="236b01f3294145518c2ced8214497d55" class="notion-header-anchor"></div><span class="notion-h-title">用到的控件（不变）</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-78f10f62b75942359b5fc7a2e1820fc2"><li><b>label</b></li><ul class="notion-list notion-list-disc notion-block-78f10f62b75942359b5fc7a2e1820fc2"><li>标签</li></ul></ul><ul class="notion-list notion-list-disc notion-block-fafec7f55acb400a8fb0e1e963643cc2"><li>C<b>omboBox</b></li><ul class="notion-list notion-list-disc notion-block-fafec7f55acb400a8fb0e1e963643cc2"><li>下拉菜单</li></ul></ul><ul class="notion-list notion-list-disc notion-block-6982cf1c35e54a7ab1a14722c024e8a9"><li><b>TextBox</b></li><ul class="notion-list notion-list-disc notion-block-6982cf1c35e54a7ab1a14722c024e8a9"><li>文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-1309cae278854e34ab4076f510b06944"><li>R<b>ichTextBox</b></li><ul class="notion-list notion-list-disc notion-block-1309cae278854e34ab4076f510b06944"><li>复文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-7428ab756e944439b6fc888d94442038"><li>Bu<b>tton</b></li><ul class="notion-list notion-list-disc notion-block-7428ab756e944439b6fc888d94442038"><li>按钮</li></ul></ul><ul class="notion-list notion-list-disc notion-block-5de7344fd76a44f4ad6d0cd6ccd6ecf9"><li><b>GropBox</b></li><ul class="notion-list notion-list-disc notion-block-5de7344fd76a44f4ad6d0cd6ccd6ecf9"><li>分组控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-a73cd577b5254153b83e68ccfce8a7d1"><li>C<b>heckBox</b></li><ul class="notion-list notion-list-disc notion-block-a73cd577b5254153b83e68ccfce8a7d1"><li>选择框控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-d8bdd72c8bbe41eb8e9a52256d616efe"><li><b>StatusStrip</b></li><ul class="notion-list notion-list-disc notion-block-d8bdd72c8bbe41eb8e9a52256d616efe"><li>状态栏控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-3a76edf3183146e3b2696cf4bad3b79e"><li><b>SerialPort</b></li><ul class="notion-list notion-list-disc notion-block-3a76edf3183146e3b2696cf4bad3b79e"><li>串口控件</li></ul></ul></div></details><details class="notion-toggle notion-block-624cbbfdf5184f708c1e05a986ff0c9d"><summary><h4 class="notion-h notion-h3 notion-block-624cbbfdf5184f708c1e05a986ff0c9d" data-id="624cbbfdf5184f708c1e05a986ff0c9d"><span><div id="624cbbfdf5184f708c1e05a986ff0c9d" class="notion-header-anchor"></div><span class="notion-h-title">实现方法和思路</span></span></h4></summary><div><div class="notion-text notion-block-f41820108116465b8b46bfddcc55805f">在上个Demo的基础上修改，添加了一个标志位，用于 开，关串口</div><div class="notion-text notion-block-dec9fde788ca477d8ec159193795d4cd">最终代码</div></div></details></div></details><details class="notion-toggle notion-block-42012f36de874ea4ac6b96f9d1073ded"><summary><h3 class="notion-h notion-h2 notion-block-42012f36de874ea4ac6b96f9d1073ded" data-id="42012f36de874ea4ac6b96f9d1073ded"><span><div id="42012f36de874ea4ac6b96f9d1073ded" class="notion-header-anchor"></div><span class="notion-h-title">Demo5 获取端口及串口简单收发</span></span></h3></summary><div><details class="notion-toggle notion-block-be88578f9e484d2bb256b52c2d41c44a"><summary><h4 class="notion-h notion-h3 notion-block-be88578f9e484d2bb256b52c2d41c44a" data-id="be88578f9e484d2bb256b52c2d41c44a"><span><div id="be88578f9e484d2bb256b52c2d41c44a" class="notion-header-anchor"></div><span class="notion-h-title">实现的功能</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-86fd19f36fab4d9c8b4efc128db2993b" style="list-style-type:decimal"><li>从本地设备列表中获取串口</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-5c1ca74c69ca4266a13cbec2ea64a3e6" style="list-style-type:decimal"><li>串口数据的发送</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-33312b89d76e4be88b3d1b8ef9fd3098" style="list-style-type:decimal"><li>串口数据的接收</li></ol></div></details><details class="notion-toggle notion-block-60c3660300fc4668b300018892e9f01d"><summary><h4 class="notion-h notion-h3 notion-block-60c3660300fc4668b300018892e9f01d" data-id="60c3660300fc4668b300018892e9f01d"><span><div id="60c3660300fc4668b300018892e9f01d" class="notion-header-anchor"></div><span class="notion-h-title">用到的控件（不变）</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-e3e4bf0850604f00b648af13972a9f8b"><li><b>label</b></li><ul class="notion-list notion-list-disc notion-block-e3e4bf0850604f00b648af13972a9f8b"><li>标签</li></ul></ul><ul class="notion-list notion-list-disc notion-block-e8db4c5fbf9b445a911817af846710eb"><li>C<b>omboBox</b></li><ul class="notion-list notion-list-disc notion-block-e8db4c5fbf9b445a911817af846710eb"><li>下拉菜单</li></ul></ul><ul class="notion-list notion-list-disc notion-block-b8716beaabfe44378c35e5a3366cbd32"><li><b>TextBox</b></li><ul class="notion-list notion-list-disc notion-block-b8716beaabfe44378c35e5a3366cbd32"><li>文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-0b7d7ccf65d6491abfd21545404ca5f2"><li>R<b>ichTextBox</b></li><ul class="notion-list notion-list-disc notion-block-0b7d7ccf65d6491abfd21545404ca5f2"><li>复文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-98e02387a73b40219ea30c127fdada30"><li>Bu<b>tton</b></li><ul class="notion-list notion-list-disc notion-block-98e02387a73b40219ea30c127fdada30"><li>按钮</li></ul></ul><ul class="notion-list notion-list-disc notion-block-a5c8379474c640ceaaf9a2e2a24bd557"><li><b>GropBox</b></li><ul class="notion-list notion-list-disc notion-block-a5c8379474c640ceaaf9a2e2a24bd557"><li>分组控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-a322744474964a8eb1ace033a7605ad0"><li>C<b>heckBox</b></li><ul class="notion-list notion-list-disc notion-block-a322744474964a8eb1ace033a7605ad0"><li>选择框控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-68892e60fa414ec881815e7b378b8af9"><li><b>StatusStrip</b></li><ul class="notion-list notion-list-disc notion-block-68892e60fa414ec881815e7b378b8af9"><li>状态栏控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-9a7231e4f1d94f95a16d5f5417cee394"><li><b>SerialPort</b></li><ul class="notion-list notion-list-disc notion-block-9a7231e4f1d94f95a16d5f5417cee394"><li>串口控件</li></ul></ul></div></details><details class="notion-toggle notion-block-69d8f057d48d4779bbb3dd8daaa9724d"><summary><h4 class="notion-h notion-h3 notion-block-69d8f057d48d4779bbb3dd8daaa9724d" data-id="69d8f057d48d4779bbb3dd8daaa9724d"><span><div id="69d8f057d48d4779bbb3dd8daaa9724d" class="notion-header-anchor"></div><span class="notion-h-title">实现方法和思路</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-c29da1c937d145a5a0ffdff839592eee" style="list-style-type:decimal"><li>获取系统端口</li><ol class="notion-list notion-list-numbered notion-block-c29da1c937d145a5a0ffdff839592eee" style="list-style-type:lower-alpha"><div class="notion-text notion-block-7daaadaedca54bc6bf3b5fc09d3469e5">获取系统端口需要使用到注册表的一个类，从类中读取设备号</div><div class="notion-text notion-block-6c105885455c4722a7d724796d0d9dad"><code class="notion-inline-code">RegistryKey keyCom = Registry.LocalMachine.OpenSubKey(@&quot;Hardware\DeviceMap\SerialComm&quot;);</code></div><div class="notion-text notion-block-b33c6d56442c472c9ef45bc29daae8ce">实际上就对应了我们 计算机设备ide注册表的这个目录</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-5c0545923bf64089bae5e5c219fc5958"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Csharp/ce2180da-f347-499b-a7f1-5eebbf9862fb.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=5c054592-3bf6-4089-bae5-e5c219fc5958" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-d8877cf93c514253a4620762224ea8eb" style="list-style-type:decimal"><li>串口数据发送方法</li><ol class="notion-list notion-list-numbered notion-block-d8877cf93c514253a4620762224ea8eb" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-cf0dbeaa7baa45559ab78cb704340ef7"><li><code class="notion-inline-code">public void Write(byte[] buffer, int offset, int count);</code></li><ul class="notion-list notion-list-disc notion-block-cf0dbeaa7baa45559ab78cb704340ef7"><li>写入字节数组</li></ul></ul><ul class="notion-list notion-list-disc notion-block-02fb1e7605584e8b9a1df38feb9e52bd"><li><code class="notion-inline-code">public void Write(string text);</code></li><ul class="notion-list notion-list-disc notion-block-02fb1e7605584e8b9a1df38feb9e52bd"><li>写入字符串</li></ul></ul><ul class="notion-list notion-list-disc notion-block-d34ea193a92a4f57885ecbd820a9e9da"><li><code class="notion-inline-code">public void Write(char[] buffer, int offset, int count);</code></li><ul class="notion-list notion-list-disc notion-block-d34ea193a92a4f57885ecbd820a9e9da"><li>写入字符数组</li></ul></ul><ul class="notion-list notion-list-disc notion-block-de4800ea09b94c94a615ad9cc96ac295"><li><code class="notion-inline-code">public void WriteLine(string text);</code></li><ul class="notion-list notion-list-disc notion-block-de4800ea09b94c94a615ad9cc96ac295"><li>写入一行字符串（在字符串末尾添加换行符）</li></ul></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2cf5dee3175648a184e51a55481d7970" style="list-style-type:decimal"><li>串口数据接收方法</li><ol class="notion-list notion-list-numbered notion-block-2cf5dee3175648a184e51a55481d7970" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-788cc6dced2a4e0db292588fcdeddf70"><li><code class="notion-inline-code">public int Read(byte[] buffer, int offset, int count);</code></li><ul class="notion-list notion-list-disc notion-block-788cc6dced2a4e0db292588fcdeddf70"><li>从字节数组中读取数据</li></ul></ul><ul class="notion-list notion-list-disc notion-block-a492a5c059974cf095a62632c0cfb1f7"><li><code class="notion-inline-code">public int Read(char[] buffer, int offset, int count);</code></li><ul class="notion-list notion-list-disc notion-block-a492a5c059974cf095a62632c0cfb1f7"><li>从字符数组中读取数据</li></ul></ul><ul class="notion-list notion-list-disc notion-block-76adf205b88542fea957e6d0fb260136"><li><code class="notion-inline-code">public int ReadByte();</code></li><ul class="notion-list notion-list-disc notion-block-76adf205b88542fea957e6d0fb260136"><li>读取一个字节的数据</li></ul></ul><ul class="notion-list notion-list-disc notion-block-4709230836af4e6db8ad2647f386f6dc"><li><code class="notion-inline-code">public int ReadChar();</code></li><ul class="notion-list notion-list-disc notion-block-4709230836af4e6db8ad2647f386f6dc"><li>读取一个字符的数据</li></ul></ul><ul class="notion-list notion-list-disc notion-block-2c8eca8fe3964ccfacf47acd8470f7b2"><li><code class="notion-inline-code">public string ReadExisting();</code></li><ul class="notion-list notion-list-disc notion-block-2c8eca8fe3964ccfacf47acd8470f7b2"><li>读取所有可用的数据，并以字符串形式返回</li></ul></ul><ul class="notion-list notion-list-disc notion-block-51be117dfd1941ee9f39a65514b77ede"><li><code class="notion-inline-code">public string ReadLine();</code></li><ul class="notion-list notion-list-disc notion-block-51be117dfd1941ee9f39a65514b77ede"><li>读取一行数据，并以字符串形式返回</li></ul></ul><ul class="notion-list notion-list-disc notion-block-ef14a31a159b45eab51081718d9af9f9"><li><code class="notion-inline-code">public string ReadTo(string value);</code></li><ul class="notion-list notion-list-disc notion-block-ef14a31a159b45eab51081718d9af9f9"><li>读取数据直到遇到指定的字符串，并以字符串形式返回。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-9ba3edd5a5e449deadd7f0f9aab82154"><li><code class="notion-inline-code"><b>public event SerialDataReceivedEventHandler DataReceived;</b></code></li><ul class="notion-list notion-list-disc notion-block-9ba3edd5a5e449deadd7f0f9aab82154"><li><b>接收到数据时触发，使用SerialDataReceivedEventHandler类型的委托来处理事件。</b></li></ul></ul></ol></ol><div class="notion-text notion-block-4a3fa17c93264ab3986205f577689a60"><b>最终代码</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-c842b2a128734cd380dd7c17283cede9" style="list-style-type:decimal"><li>获取系统端口：</li><ol class="notion-list notion-list-numbered notion-block-c842b2a128734cd380dd7c17283cede9" style="list-style-type:lower-alpha"></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-bade710efa7b46cfa4c003f096182e8b" style="list-style-type:decimal"><li>点击发送按钮：</li><ol class="notion-list notion-list-numbered notion-block-bade710efa7b46cfa4c003f096182e8b" style="list-style-type:lower-alpha"></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-425e17b95ecd44718411a825b831684d" style="list-style-type:decimal"><li>点击接收按钮：</li><ol class="notion-list notion-list-numbered notion-block-425e17b95ecd44718411a825b831684d" style="list-style-type:lower-alpha"></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-5a17181b98fc4103be2ddeb9ae99756a" style="list-style-type:decimal"><li>其他</li><ol class="notion-list notion-list-numbered notion-block-5a17181b98fc4103be2ddeb9ae99756a" style="list-style-type:lower-alpha"></ol></ol></div></details></div></details><details class="notion-toggle notion-block-f29459e199844380b9f0d384d69589fc"><summary><h3 class="notion-h notion-h2 notion-block-f29459e199844380b9f0d384d69589fc" data-id="f29459e199844380b9f0d384d69589fc"><span><div id="f29459e199844380b9f0d384d69589fc" class="notion-header-anchor"></div><span class="notion-h-title">Demo6 串口收发优化</span></span></h3></summary><div><details class="notion-toggle notion-block-5dd9d9659a9b45fba68a055b68fee5b4"><summary><h4 class="notion-h notion-h3 notion-block-5dd9d9659a9b45fba68a055b68fee5b4" data-id="5dd9d9659a9b45fba68a055b68fee5b4"><span><div id="5dd9d9659a9b45fba68a055b68fee5b4" class="notion-header-anchor"></div><span class="notion-h-title">实现的功能</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-d1dc520501d84cb4a70262f4131b8a4a" style="list-style-type:decimal"><li>异步线程：更新UI</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-348b3d2d4d05405dadca8f2bffea44c8" style="list-style-type:decimal"><li>接收字符处理</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2fd24ba0fa864370ba4fc85803bed451" style="list-style-type:decimal"><li>发送字符处理</li></ol></div></details><details class="notion-toggle notion-block-ba6294311fb64eab9e662c2b914a27e5"><summary><h4 class="notion-h notion-h3 notion-block-ba6294311fb64eab9e662c2b914a27e5" data-id="ba6294311fb64eab9e662c2b914a27e5"><span><div id="ba6294311fb64eab9e662c2b914a27e5" class="notion-header-anchor"></div><span class="notion-h-title">用到的控件（添加了timer 定时器）</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-3691ed88e82b42ac8a1f60f48d674a3e"><li><b>label</b></li><ul class="notion-list notion-list-disc notion-block-3691ed88e82b42ac8a1f60f48d674a3e"><li>标签</li></ul></ul><ul class="notion-list notion-list-disc notion-block-0631256675ce43e18150c9b6276ba6c4"><li>C<b>omboBox</b></li><ul class="notion-list notion-list-disc notion-block-0631256675ce43e18150c9b6276ba6c4"><li>下拉菜单</li></ul></ul><ul class="notion-list notion-list-disc notion-block-d7381b5493a340d783787479407e4023"><li><b>TextBox</b></li><ul class="notion-list notion-list-disc notion-block-d7381b5493a340d783787479407e4023"><li>文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-cf37b4bb88b84f71a72f360fc486ab6f"><li>R<b>ichTextBox</b></li><ul class="notion-list notion-list-disc notion-block-cf37b4bb88b84f71a72f360fc486ab6f"><li>复文本框</li></ul></ul><ul class="notion-list notion-list-disc notion-block-6ca5921a37be4c60b0ece45ed441c4da"><li>Bu<b>tton</b></li><ul class="notion-list notion-list-disc notion-block-6ca5921a37be4c60b0ece45ed441c4da"><li>按钮</li></ul></ul><ul class="notion-list notion-list-disc notion-block-dc05b9539db64b9b8967542ad0f5f84e"><li><b>GropBox</b></li><ul class="notion-list notion-list-disc notion-block-dc05b9539db64b9b8967542ad0f5f84e"><li>分组控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-5c06a28fb61f41f6ab5c5b70a081eb73"><li>C<b>heckBox</b></li><ul class="notion-list notion-list-disc notion-block-5c06a28fb61f41f6ab5c5b70a081eb73"><li>选择框控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-8ff8fb69df1444a19b5172ed85379eb6"><li><b>StatusStrip</b></li><ul class="notion-list notion-list-disc notion-block-8ff8fb69df1444a19b5172ed85379eb6"><li>状态栏控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-3602cf0cd60b4472b61a29cae0a8a302"><li><b>SerialPort</b></li><ul class="notion-list notion-list-disc notion-block-3602cf0cd60b4472b61a29cae0a8a302"><li>串口控件</li></ul></ul><ul class="notion-list notion-list-disc notion-block-2601987a49b94776b8c554333f600682"><li>Timer</li><ul class="notion-list notion-list-disc notion-block-2601987a49b94776b8c554333f600682"><li>定时器</li></ul></ul></div></details><details class="notion-toggle notion-block-d60d6a2111334258ad91eb6547949d28"><summary><h4 class="notion-h notion-h3 notion-block-d60d6a2111334258ad91eb6547949d28" data-id="d60d6a2111334258ad91eb6547949d28"><span><div id="d60d6a2111334258ad91eb6547949d28" class="notion-header-anchor"></div><span class="notion-h-title">实现方法和思路</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-3728896f76ab41a6a4cccc90c5a2d994" style="list-style-type:decimal"><li>异步线程</li><ol class="notion-list notion-list-numbered notion-block-3728896f76ab41a6a4cccc90c5a2d994" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-ecee491635f84eeb8363ae90c59ea53f"><li>为什么要使用异步线程？</li><ul class="notion-list notion-list-disc notion-block-ecee491635f84eeb8363ae90c59ea53f"><div class="notion-text notion-block-f4d697b61f32448dbfd2eb470b2e721c">因为串口的data receive 接收，是在辅助线程执行，数据需要更新到ui的主线程时，这个操作就会跨线程，跨线程是不安全的。</div><div class="notion-text notion-block-c843ac8370214c67a137ebebe9f96e29">这时候就需要执行一个异步线程来执行数据䣌更新</div></ul></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-f7da71620dd0411a97ca40507741c862" style="list-style-type:decimal"><li>数据的接收处理</li><ol class="notion-list notion-list-numbered notion-block-f7da71620dd0411a97ca40507741c862" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-3e53745939b24543aa757512e3dc1ebe"><li>将数据接收，并缓存到数据缓冲区（List&lt;byte&gt; 优于 byte[] )</li></ul><ul class="notion-list notion-list-disc notion-block-fdce8e85099d48c5a1ba59c628bf5c43"><li>字符的编码格式：GB2312、UTF8 等等。。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-8f87701f03314d6788486680987b9183" style="list-style-type:decimal"><li>数据的发送处理</li><ol class="notion-list notion-list-numbered notion-block-8f87701f03314d6788486680987b9183" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-c9d3106a5f614890bff23ebfe870db85"><li>发送普通字符串</li></ul><ul class="notion-list notion-list-disc notion-block-ee11c5f619584c9198de49260a7de5aa"><li>发送16进制数据</li></ul></ol></ol><div class="notion-text notion-block-d75aac47e91c4107ba4261746f6f7920">代码部分——————————————</div><ul class="notion-list notion-list-disc notion-block-65615c6eb69f4f31bf6a3bd290742513"><li><b>异步线程：更新UI代码</b></li><ul class="notion-list notion-list-disc notion-block-65615c6eb69f4f31bf6a3bd290742513"><div class="notion-text notion-block-a786691a5a6646aebff99cf0470d97a5">这里是为了防止一个线程来操作另一个线程，这样会导致问题出现。</div></ul></ul><ul class="notion-list notion-list-disc notion-block-d0af915fdff14280b77c5c3e1eea916d"><li><b>接收数据处理</b></li><ul class="notion-list notion-list-disc notion-block-d0af915fdff14280b77c5c3e1eea916d"><ol start="1" class="notion-list notion-list-numbered notion-block-2ea66184c6724724b20c1670755db4cc" style="list-style-type:decimal"><li>数据处理并显示在发送文本框</li><ol class="notion-list notion-list-numbered notion-block-2ea66184c6724724b20c1670755db4cc" style="list-style-type:lower-alpha"><div class="notion-text notion-block-284f503c909c4c50ab718d2c6a22781b">其中包含了数据的处理和 累加接收长度</div></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a5d3c8cd493429db66fb0e73c166f0a" style="list-style-type:decimal"><li>1<b>6进制勾选逻辑</b></li><ol class="notion-list notion-list-numbered notion-block-2a5d3c8cd493429db66fb0e73c166f0a" style="list-style-type:lower-alpha"><div class="notion-text notion-block-13fc4d016d4044429de37cf70e0e2ff6">实现在勾选和取消勾选16进制时，使接收文本框内的数据变为相应的进制。</div></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-bd51b3316bc649c9b018089ebb61fd83" style="list-style-type:decimal"><li><b>清空接收数据</b></li><ol class="notion-list notion-list-numbered notion-block-bd51b3316bc649c9b018089ebb61fd83" style="list-style-type:lower-alpha"></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-c46a44ec9f8545c5910fa5b8d0eb0ada" style="list-style-type:decimal"><li>自动清空</li><ol class="notion-list notion-list-numbered notion-block-c46a44ec9f8545c5910fa5b8d0eb0ada" style="list-style-type:lower-alpha"><div class="notion-text notion-block-84efb1eee94f4257b37f489127c0dcfd">这里使用了一个新的控件：Timer，（设置为100ms一次的定时），当自动清空被勾选时，会打开定时器，定时器则会1s检测10次 接收框的数据长度，如果大于4096（默认）那么就清空。（后续会改为可设置）</div></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-50d52231632e4ec4bcbe86f7663a0b56" style="list-style-type:decimal"><li><b>暂停接收</b></li><ol class="notion-list notion-list-numbered notion-block-50d52231632e4ec4bcbe86f7663a0b56" style="list-style-type:lower-alpha"></ol></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-1b7e60c59e0b48b291a8bc05c4aa666b"><li><b>发送数据处理</b></li><ul class="notion-list notion-list-disc notion-block-1b7e60c59e0b48b291a8bc05c4aa666b"><ol start="1" class="notion-list notion-list-numbered notion-block-2548a6d4ffd247b4af58778507985a24" style="list-style-type:decimal"><li>数据处理并显示在接收文本框</li><ol class="notion-list notion-list-numbered notion-block-2548a6d4ffd247b4af58778507985a24" style="list-style-type:lower-alpha"><div class="notion-text notion-block-789d0aadb185404385fb4559290563fb">这里使用到了一个新的事件：发送文本框的Leave 离开焦点事件，当焦点离开时，执行下面的方法。目的时检测当前数据是否为16进制数据，如果不是，则发送相应警告。</div><div class="notion-text notion-block-f24042ba21e14b2f98934004d141cf74">根据选择， 处理或者不处理数据，让后放到发送缓冲区中</div><div class="notion-text notion-block-e825628099f14e69b27de234c19076b7">其中包含了数据的处理和 累加发送长度</div><blockquote class="notion-quote notion-block-b8dc2a16490247ec89478358287b6391"><div><b>注意如果使用文本发生变化事件，去处理16进制的转换，会发生错误
</b>问题就是0x00 转换</div></blockquote><div class="notion-text notion-block-2dc70b9c370c43869c655226ee357800">sendBuffer.AddRange(Transform.ToBytes(send_rtb.Text.Replace(&quot; &quot;, &quot;&quot;)));</div><div class="notion-text notion-block-f0fabd6f91464e9e9e3a2c504614ea60">}</div><div class="notion-text notion-block-e364077678ed4e2982e03055c42662fb">else //不是16进制数据</div><div class="notion-text notion-block-d3aa75e41d9c4c3cbc5b456cf8116658">{<div class="notion-text-children"><div class="notion-text notion-block-b16ad5392e2b4c179f7be7137d219241"><a class="notion-link" href="http://MessageBox.Show" target="_blank" rel="noopener noreferrer">MessageBox.Show</a>(&quot;请输入正确的十六进制数据！！&quot;, &quot;发送框警告&quot;);</div><div class="notion-text notion-block-0817d483e3f946aeba1f1fc14a1e906c">send_<a class="notion-link" href="http://rtb.Select" target="_blank" rel="noopener noreferrer">rtb.Select</a>();</div></div></div><div class="notion-text notion-block-2f3c61f6fd9648bbbcc62ce3bce6f616">}</div><div class="notion-text notion-block-f5e31b8300194a6f8a4b8bdb7080a91d">}</div><div class="notion-text notion-block-e6e2e92515184a9e993b60d7b6e316ba">else   //未选中16进制。</div><div class="notion-text notion-block-4d3397fb329345019f9cd3c595f0ce0f">{<div class="notion-text-children"><div class="notion-text notion-block-f452ad3a4879456f8f957456764dac23">sendBuffer.Clear();</div><div class="notion-text notion-block-00cc227fead14adf981ae00c7f65b3e7">//把当前数据，存放到发送缓冲区。</div><div class="notion-text notion-block-20e633f865a94689aeb4c434ff9f782e">sendBuffer.AddRange(Encoding.GetEncoding(&quot;gb2312&quot;).GetBytes(send_rtb.Text));</div></div></div><div class="notion-text notion-block-fd3208db04134b3684990c8ae004d5c6">}</div></ol></ol></ul></ul></div></details></div></details><div class="notion-text notion-block-4c27fe552dea4a5f820b1f86f03f41ac">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-9057b47b51334f678241f608787a7658">//发送 16进制切换 框 点击</div><div class="notion-text notion-block-b2e9eac8f6594e96b2de29f77d8ff92a">private void sendhex_chb_CheckedChanged(object sender, EventArgs e)</div><div class="notion-text notion-block-3506cb5ea6854d139214648bc2017109">{<div class="notion-text-children"><div class="notion-text notion-block-cc660c4ab82142bab16e9b4ce5be2767">//判断发送框文本你是否为空</div><div class="notion-text notion-block-1585ee8fcf2e42bc8860cdf72b04413c">if (send_rtb.Text == &quot;&quot;) return;</div><div class="notion-text notion-block-787c62e6d87c402b87a687ad5e6e355b">//把发送缓冲区的所有 变为 16进制， 用空格隔开</div><div class="notion-text notion-block-54d38a28d04a4df2ad3c50a5fd2bd127">if (sendhex_chb.Checked == true)</div><div class="notion-text notion-block-21a9ee8721ac43ac9d6a7342c6106037">{<div class="notion-text-children"><div class="notion-text notion-block-3a7f3990c7f740cfa8806a2101fd6cb7">send_rtb.Text = Transform.ToHexString(sendBuffer.ToArray(), &quot; &quot;);</div></div></div><div class="notion-text notion-block-290dc50ee68648198d81eb19faf82ef1">}</div><div class="notion-text notion-block-00254f550f024a189d42367d929630fa">else </div><div class="notion-text notion-block-10841e2210e54e7cb10d290d4ddaf0f4">{ <div class="notion-text-children"><div class="notion-text notion-block-a5444d6b26584e2db0f5d436dfe52987">send_rtb.Text = Encoding.GetEncoding(&quot;gb2312&quot;).GetString(sendBuffer.ToArray()).Replace(&quot;0&quot;,&quot;\0&quot;);</div></div></div><div class="notion-text notion-block-efeb5660547f426595c455a1660d3437">}</div></div></div><div class="notion-text notion-block-41a476a4ef6d474ba8ae14e59e995d83">}<div class="notion-text-children"></div></div><div class="notion-text notion-block-40873052277a452a96dd05203dbab7ff">//发送框清除按钮点击事件</div><div class="notion-text notion-block-0c4410e48e474bddb99dfdac11dce824">private void sendclear_btn_Click(object sender, EventArgs e)</div><div class="notion-text notion-block-356b732fbc2d4bc5a8be9bdec5ad26e9">{<div class="notion-text-children"><div class="notion-text notion-block-601aa324387e401888311bc7170c7c80">sendBuffer.Clear();     //清除发送框缓冲区</div><div class="notion-text notion-block-5aede06978014d24a0297d552373dcec">send_rtb.Text = &quot;&quot;;     //清除发送框</div><div class="notion-text notion-block-b4141466f1bd4dfa8dcf99a4b9625139">sendCount = 0;          //清除发送计数</div><div class="notion-text notion-block-d0de7689dcb548629e6e9e2358a6acbf">sencount_tssl.Text = &quot;0&quot;;        //清除发送框计数</div></div></div><div class="notion-text notion-block-d790901c417e4176999f8bc89d16cf16">}<div class="notion-text-children"></div></div></div></details><div class="notion-text notion-block-49efa36b57ab41cda2dddbb49c50672f">using <a class="notion-link" href="http://Microsoft.Win" target="_blank" rel="noopener noreferrer">Microsoft.Win</a>32;</div><div class="notion-text notion-block-a60addebea22405ba0c8a653e74b5c76">using System;</div><div class="notion-text notion-block-b19823cc31234cfdb949c3225f260202">using System.Collections.Generic;</div><div class="notion-text notion-block-27f0b5681e8d41c6abfb98b71c3e4199">using System.ComponentModel;</div><div class="notion-text notion-block-721b403e2e9843cd918d4a453a2bb779">using <a class="notion-link" href="http://System.Data" target="_blank" rel="noopener noreferrer">System.Data</a>;</div><div class="notion-text notion-block-67b7a11703034492bde2739689870f65">using System.Drawing;</div><div class="notion-text notion-block-a4cbbb9c883547c7bfe5338f44ed35a7">using <a class="notion-link" href="http://System.IO" target="_blank" rel="noopener noreferrer">System.IO</a>.Ports;</div><div class="notion-text notion-block-8350e332a16d497fa84cd8753518cb9e">using System.Text;</div><div class="notion-text notion-block-398133a4eb6d4e32bb1381a40730359d">using <a class="notion-link" href="http://System.Windows" target="_blank" rel="noopener noreferrer">System.Windows</a>.Forms;</div><div class="notion-text notion-block-f7ad8275e71c455b9c7d8574dd4e5885">namespace 串口助手</div><div class="notion-text notion-block-7aa3f37a4abc40a4baeb0bae0fb1a1dd">{<div class="notion-text-children"><div class="notion-text notion-block-8247df4c26644917ab05d8b0b618599e">public partial class Form1 : Form</div><div class="notion-text notion-block-badf46de5fda4c2ab1625429866d9393">{<div class="notion-text-children"><div class="notion-text notion-block-77b6a0ba03954b3c82420f623f821f85">//串口标志位</div><div class="notion-text notion-block-954e3a86cd81401e8ac9fcc7accbcb77">private bool isOpen = false;</div><div class="notion-text notion-block-d908d610077a4960a4643a53259b8574">//暂停标志位</div><div class="notion-text notion-block-f2dc451c5f544e2cba511b2f8d1207e5">private bool isRxShow = true;</div><div class="notion-text notion-block-7c73745d04724dd1960e0baf7977b8b7">//接收缓冲区</div><div class="notion-text notion-block-64ad1d1b4a6c45c7971de2ce872d1b73">private List&lt;byte&gt; reciveBuffer = new List&lt;byte&gt;();</div><div class="notion-text notion-block-feb7ceabd48449a6a5e9f98876fd5e5a">//发送缓冲区</div><div class="notion-text notion-block-7557b6da55a04cd6be655c4b6138632f">private List&lt;byte&gt; sendBuffer = new List&lt;byte&gt;();</div><div class="notion-text notion-block-8b97a267ef044fe8b5ad4b293e947503">//接收计数</div><div class="notion-text notion-block-252ddbbd22224cd8bce0480a9e45982e">private int reciveCount = 0;</div><div class="notion-text notion-block-99a9627af320412eb15cfe6bb03d389d">//发送计数</div><div class="notion-text notion-block-e80f90c5aca54deaafedef6c6ca58966">private int sendCount = 0;</div><div class="notion-text notion-block-ce990f5b22d54b4ba1cda69b2988a5f8">//实例化SerialPort窗口事件</div><div class="notion-text notion-block-799e97ab5c1448dfba3be053dd085656">public Form1()</div><div class="notion-text notion-block-9646452cd0dc4ef99829498540b31faf">{<div class="notion-text-children"><div class="notion-text notion-block-5ec41b11b5684e0897d0bcc62b1cd9c4">InitializeComponent();</div><div class="notion-text notion-block-bd8ac1235226486893cfa860da338129">Control.CheckForIllegalCrossThreadCalls = false;</div></div></div><div class="notion-text notion-block-7794105824dd4cb8b018a5e8c3ee2a64">}</div><div class="notion-text notion-block-196f324617ce436084f9e4699ccf85c4">//加载窗口控件事件</div><div class="notion-text notion-block-b4045ac278f142ef95dd36a73c124f35">private void Form1_Load(object sender, EventArgs e)</div><div class="notion-text notion-block-f93151daae674d81bf8fc5e05c26d5db">{<div class="notion-text-children"><div class="notion-text notion-block-332a7d369fc64f29978791ff7a27c4a7">serialLoad();</div></div></div><div class="notion-text notion-block-b1ff6d6ad0c04b0587917d4cdb49abe9">}</div><div class="notion-text notion-block-6efe7b5c83cc4427a30208463d761ac2">//自定义私有方法，初始化串口配置等</div><div class="notion-text notion-block-ddb6e7a2dbb848c8b1422729d216f02f">private void serialLoad()</div><div class="notion-text notion-block-54de473be92a4588b067781aaa8ee50d">{<div class="notion-text-children"><div class="notion-text notion-block-2d87d5e3ebc9433eb77c4fe3d48a47ad">EncodingInfo[] encodingInfos = Encoding.GetEncodings();</div><div class="notion-text notion-block-16f8a83b89124ea5967837e76a61467f">RegistryKey keyCom = Registry.LocalMachine.OpenSubKey(@&quot;HardwareDeviceMapSerialComm&quot;);</div><div class="notion-text notion-block-780966238c2f42babd368c928f8a379d">string[] sSubKeys = keyCom.GetValueNames();</div><div class="notion-text notion-block-7fb10498800d4ffeb6001dcd8e2107e4">port_cbb.Items.Clear();</div><div class="notion-text notion-block-9d7115a35666406195e9c7eb1acf4683">foreach (var sValue in   sSubKeys)</div><div class="notion-text notion-block-0c5e9ff8821442d3a76a739da9f2b6fc">{<div class="notion-text-children"><div class="notion-text notion-block-71d2c957cb19466a9891e4e42f6b5800">string portName = (string)keyCom.GetValue(sValue);</div><div class="notion-text notion-block-a9b4c0d69a974754a72df8ab4c00e083">port_cbb.Items.Add(portName);</div></div></div><div class="notion-text notion-block-011b1386e8754931a1754303b7f525ef">}</div><div class="notion-text notion-block-27b3a66ca85e402e90c93905af5b6111">this.port_cbb.SelectedIndex = 0;</div><div class="notion-text notion-block-bf1f203c430c4a1e971a6ac58b06037f">this.baud_cbb.SelectedIndex = 1;</div><div class="notion-text notion-block-319981bc0bf84f72aa72510fe9efe29b">this.check_cbb.SelectedIndex = 0;</div><div class="notion-text notion-block-3f615c215d264a99a7c2cafd30ff8e47">this.databit_cbb.SelectedIndex = 3;</div><div class="notion-text notion-block-a8f3a99d778448c3b2421a72d2c24db2">this.stopbit_cbb.SelectedIndex = 0;</div></div></div><div class="notion-text notion-block-b25bfef9a0b24a5e88a4ad638f1dd2c4">}</div><div class="notion-text notion-block-572d12a0816b40f791d8585c271b58f5">//发送</div><div class="notion-text notion-block-75f977ff7be7485099ffbe80346f291a">private void sendData()</div><div class="notion-text notion-block-5079d0b60baa4a4d8722110ce326be5a">{<div class="notion-text-children"><div class="notion-text notion-block-c3719d5d4a9c4e6f909acc4b01b6ddd3">//写串口，发送缓冲区中的数据</div><div class="notion-text notion-block-36f05d9153e3400ca50998b0a7698038">serialPort1.Write(sendBuffer.ToArray(),0,sendBuffer.Count);</div><div class="notion-text notion-block-d9e54bec004e4c4eab3ce38738a26e61">//累加发送数据长度</div><div class="notion-text notion-block-3e2a365445804b6987b0a73035a787b9">sendCount += sendBuffer.Count;</div><div class="notion-text notion-block-a185f76fc42741bc8772cf4cf799c118">//更新数据长度到状态</div><div class="notion-text notion-block-6976543cd3eb4581b80902c05f36b6db">sencount_tssl.Text = sendCount.ToString();</div></div></div><div class="notion-text notion-block-2bbb9453afe7480d8d3ab6d1cf7863e9">}</div><div class="notion-text notion-block-cbadf6ab33144ef78b13499b2fd22dc7">private void send_btn_Click(object sender, EventArgs e)</div><div class="notion-text notion-block-5ff93f623043453fbe11a7c2cff2ac15">{<div class="notion-text-children"><div class="notion-text notion-block-f8041eead3304fa0a4eca131c9a2af59">// 如果发送的数据不为空，则发送</div><div class="notion-text notion-block-29007034b7b4404fa323e5aa440fd66d">if (this.send_rtb.Text != &quot;&quot; &amp;&amp; serialPort1.IsOpen)</div><div class="notion-text notion-block-bef8296f275c400992d1c4c5d0af530d">{<div class="notion-text-children"><div class="notion-text notion-block-a494635ef4a4405882fb2cd302ed22d9">Console.WriteLine(Transform.ToHexString(sendBuffer.ToArray()));//调试用</div><div class="notion-text notion-block-254a0f2aa07549feb97e0eee0ae23ffd">sendData(); //调用自己的发送方法</div></div></div><div class="notion-text notion-block-6bbdb5f8311e4401a6cdc2ce692b09b5">}</div><div class="notion-text notion-block-34e02af6a0424f719f10aba18936be54">else</div><div class="notion-text notion-block-dd2b0236d74a4868b715d4cf04edef19">{<div class="notion-text-children"><div class="notion-text notion-block-7a56f72162e148cab40889474bfdee20"><a class="notion-link" href="http://MessageBox.Show" target="_blank" rel="noopener noreferrer">MessageBox.Show</a>(&quot;请先输入发送数据！&quot;);</div></div></div><div class="notion-text notion-block-8a39166c56f54c6c85ec745385df13dd">}</div></div></div><div class="notion-text notion-block-df6cad834b7e4143abf7b522eb1b11a2">}</div><div class="notion-text notion-block-cf249b892a3d49b7b4d0dc2ae2046654">//点击打开串口按钮</div><div class="notion-text notion-block-0e857d22cd564cc0991d54f230f9624c">private void open_btn_Click(object sender, EventArgs e)</div><div class="notion-text notion-block-c8956a98592d4bee8db2ae7b3fadb8e7">{<div class="notion-text-children"><div class="notion-text notion-block-57707257bc1a42d08e3cded8a7cac509">try</div><div class="notion-text notion-block-0e83a6737ca1482db81a1057f15859ad">{<div class="notion-text-children"><div class="notion-text notion-block-6f7bd7c518944de48959d5ffae67f621">if (serialPort1.IsOpen == false)</div><div class="notion-text notion-block-8f7edbccdfda46c9afb6bc6b832ea7d9">{<div class="notion-text-children"><div class="notion-text notion-block-6bdaf1ab0aec46b294bf3da05d272e78">//设置基础配置</div><div class="notion-text notion-block-62f194415a3344219f76e448e8195ee2">serialPort1.PortName = port_cbb.Text;</div><div class="notion-text notion-block-8d6251741c204666861176d5afde7b25">serialPort1.BaudRate = Convert.ToInt32(baud_cbb.Text);</div><div class="notion-text notion-block-f64a8ee3ce354824a4494f0af3ce492a">serialPort1.DataBits = Convert.ToInt32(databit_cbb.Text);</div><div class="notion-text notion-block-e61bec4220024dd887f92bd23c04d790">switch (check_cbb.SelectedIndex)</div><div class="notion-text notion-block-a7d99561c2544220a71a456173b78de5">{<div class="notion-text-children"><div class="notion-text notion-block-6d08c61ef0894785945d40a49eb3613a">//  none  odd  even </div><div class="notion-text notion-block-069dd2d1b5624fc6985c9a966f224b0a">case 0:<div class="notion-text-children"><div class="notion-text notion-block-b5ae7fb543a345efb4887dbed912748a">serialPort1.Parity = Parity.None;</div><div class="notion-text notion-block-223c6737dee84c3097758ba78514d91c">break;</div></div></div><div class="notion-text notion-block-82298995e079461f875d3dd0248995ae">case 1:<div class="notion-text-children"><div class="notion-text notion-block-9c6e5cc6706748b585f349779f294799">serialPort1.Parity = Parity.Odd;</div><div class="notion-text notion-block-4842bd7b52e840c9bc83629032ee0246">break;</div></div></div><div class="notion-text notion-block-f0f6e4262995498ca96b4f4c6ad1ab06">case 2:<div class="notion-text-children"><div class="notion-text notion-block-140bc43b6a704e35915b3ba079338e3e">serialPort1.Parity = Parity.Even;</div><div class="notion-text notion-block-2961d7197f7d4052b04caf40a10f55b5">break;</div></div></div><div class="notion-text notion-block-d1188488d24444739d41bf7dac8bcb21">default:<div class="notion-text-children"><div class="notion-text notion-block-c61acfc837104ceb9d4aba64385192e0">serialPort1.Parity = Parity.None;</div><div class="notion-text notion-block-fab69912fa804a88a47797e9e6dc74b0">break;</div></div></div></div></div><div class="notion-text notion-block-a3049ea56f7549aebb7ad6fa035a7ce7">}</div><div class="notion-text notion-block-f4c7db921cad43eb92e57fe5439d78e5">switch (stopbit_cbb.SelectedIndex)</div><div class="notion-text notion-block-057c532571c34a6881504d7e546cbe08">{<div class="notion-text-children"><div class="notion-text notion-block-f042db77e4804922a5bd3ec2ce306a28">// 1 1.5 2</div><div class="notion-text notion-block-9ca60ceef042444ea41353838b361f86">case 0:<div class="notion-text-children"><div class="notion-text notion-block-8877cfe4d306478fa4a903d51d7accd4">serialPort1.StopBits = <a class="notion-link" href="http://StopBits.One" target="_blank" rel="noopener noreferrer">StopBits.One</a>;</div><div class="notion-text notion-block-9346c117e6b7470db2409e403497e06b">break;</div></div></div><div class="notion-text notion-block-75b6d7cf135448589d1c4f471496f92f">case 1:<div class="notion-text-children"><div class="notion-text notion-block-49261ff9f140478a8d7087a407e114a7">serialPort1.StopBits = StopBits.OnePointFive;</div><div class="notion-text notion-block-0993201323fc4bfeb632b9b86b3a975e">break;</div></div></div><div class="notion-text notion-block-faed21494ff24f9cb7129c613827390e">case 2:<div class="notion-text-children"><div class="notion-text notion-block-f89ae1b56e014659b079865ad60830c4">serialPort1.StopBits = StopBits.Two;</div><div class="notion-text notion-block-31d0fc0c43654c74a459123aa3173b1e">break;</div></div></div><div class="notion-text notion-block-cb2a354a255f49dd90f934abad051aa6">default:<div class="notion-text-children"><div class="notion-text notion-block-7c3ab753915d430189b4d5e5a700b91b">serialPort1.StopBits = <a class="notion-link" href="http://StopBits.One" target="_blank" rel="noopener noreferrer">StopBits.One</a>;</div><div class="notion-text notion-block-006d64504c244e0ca95ce4616100117a">break;</div></div></div></div></div><div class="notion-text notion-block-ee9bddb713f9490dae66965e586c1f5f">}</div><div class="notion-text notion-block-afb27cdcf94c424eaa34f423af8f077c"><a class="notion-link" href="http://serialPort1.Open" target="_blank" rel="noopener noreferrer">serialPort1.Open</a>();</div><div class="notion-text notion-block-e0e91f25bd0d40d3873d830b9c8d18c0">isOpen = true;</div><div class="notion-text notion-block-45a724097be646ae9e91616c12b51931">open_btn.Text = &quot;关闭串口&quot;;</div></div></div><div class="notion-text notion-block-9f4f2b213e35477098f579d0fb3b5721">}</div><div class="notion-text notion-block-7cc3f25917f94ed7bc777654855edd10">else</div><div class="notion-text notion-block-9203a679280643c393a2c9f094a9733a">{<div class="notion-text-children"><div class="notion-text notion-block-d9772813b343418eabd22d5bf9ece99d">serialPort1.Close();</div><div class="notion-text notion-block-ffd9db57e6c94be099bedcc0045e190e">isOpen = false;</div><div class="notion-text notion-block-094efc9a3cd140939761d04fff4110a4">open_btn.Text = &quot;打开串口&quot;;</div></div></div><div class="notion-text notion-block-f786b18acbf24f8ebeff067f9d46616f">}</div></div></div><div class="notion-text notion-block-3c68402b97894bf6aa80ef0b2455c36a">}</div><div class="notion-text notion-block-58662d21e2e24287baa240cccd2aa7f9">catch (Exception ex)</div><div class="notion-text notion-block-0282363993154a10880335df40f3b48d">{<div class="notion-text-children"><div class="notion-text notion-block-60f47bfc1c1a4db2824abade9157375d"><a class="notion-link" href="http://MessageBox.Show" target="_blank" rel="noopener noreferrer">MessageBox.Show</a>(ex.ToString()+serialPort1.PortName.ToString());</div></div></div><div class="notion-text notion-block-97f97922fdf5411884aa1a9ea31f092c">}</div></div></div><div class="notion-text notion-block-8205bd31ab0748e88e7698cd8d0a2a8b">}</div><div class="notion-text notion-block-e43368be8c03458ca6870019e3841f8c">//串口接收到数据事件</div><div class="notion-text notion-block-33a5ac84e3074c8480813e35ed4c0597">private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)</div><div class="notion-text notion-block-e9ce14848d0c4fef9d99df7b3e33b554">{<div class="notion-text-children"><div class="notion-text notion-block-4114f4becb98420cb0f08cd4237f0154">//如果暂停了，那么就不显示在接收框，直接return</div><div class="notion-text notion-block-6b83011dea904edeb5cf0e99f4a28641">if (isRxShow == false) return;</div><div class="notion-text notion-block-d574228f0b834d7ab5c7676b0ee66001">// 1,需要读取有效的数据 BytesToRead</div><div class="notion-text notion-block-126ad217ce2e45e5a2495d0a177e3ce4">//创建一个 数组，大小是当前串口缓存中的字节数量</div><div class="notion-text notion-block-10e1447d3e0046b5bfbf1ac8ec49668a">byte[] dataTemp = new byte[serialPort1.BytesToRead];</div><div class="notion-text notion-block-257056a90a6d4bf8a5230dbc0783bc83">//读取数据。</div><div class="notion-text notion-block-330c8759c2324b99a8b27d708617fe36"><a class="notion-link" href="http://serialPort1.Read" target="_blank" rel="noopener noreferrer">serialPort1.Read</a>(dataTemp,0,dataTemp.Length);</div><div class="notion-text notion-block-75ed1eb9f00947fab590b7cd16a373de">//添加一组（集合）数据到接收框的末尾</div><div class="notion-text notion-block-691958e857e042f584c60c5e8af5b6d4">reciveBuffer.AddRange(dataTemp);</div><div class="notion-text notion-block-44c79f5b37ed4a5084f5da1020391d89">//计数下接收到的数据</div><div class="notion-text notion-block-c9790a1704864d749c7236099c666eaa">reciveCount += dataTemp.Length;</div><div class="notion-text notion-block-c3ee17468e61466cbfc8c8265c86b1f7">// 使用 Invoke 方法确保在 UI 线程上执行以下操作，防止异步线程</div><div class="notion-text notion-block-f6f941b23fd14801a193ec556596dd8a">this.Invoke(new EventHandler(delegate //委托给 UI 线程</div><div class="notion-text notion-block-8caf46e72f3f4d4e9eddf9de333a7c62">{<div class="notion-text-children"><div class="notion-text notion-block-feef07e2c23046829c1011882a0f35b0">// 显示接收数据的长度</div><div class="notion-text notion-block-2bddb3b0883d4edeaa1a67519b255126">recivecount_tssl.Text = reciveCount.ToString();</div><div class="notion-text notion-block-3c3978785dc04e65a8cfb933d98fec6e">//如果没有勾选16进制</div><div class="notion-text notion-block-0c5e84e610f64e3e9579e06ce8c8fc34">if (!recivehex_chb.Checked)</div><div class="notion-text notion-block-487252d676ed40308db815469ac9d251">{<div class="notion-text-children"><div class="notion-text notion-block-52c29786379b41f683f85eb2417480ba">// 通过指定的编码格式来获取字符串</div><div class="notion-text notion-block-9f5155ab7b1e468c8de18eaabdf2cd47">string str = Encoding.GetEncoding(&quot;gb2312&quot;).GetString(dataTemp);</div><div class="notion-text notion-block-c370556e17ec44f3b442230a99676f11">// 3，0x00 -&gt; 0 结束 不会显示，所以转义成0 显示出来</div><div class="notion-text notion-block-6ff8a8155b1441fab65cf12de347f188">str=str.Replace(&quot;0&quot;, &quot;\0&quot;);</div><div class="notion-text notion-block-f5b0a6a2e3ed4b84aada6c1633b611d5">//向接收文本框追加处理后的数据</div><div class="notion-text notion-block-827c19cf35cc4d4fb615676c41da9a1b">recive_rtb.AppendText(str);</div><div class="notion-text notion-block-31a243aa29ea49ab974848368ac14f7d">//下面等同于上面三句话</div><div class="notion-text notion-block-6e348504e8a645069b6dcbd3ed12c6b3">//recive_rtb.AppendText(Encoding.GetEncoding(&quot;gb2312&quot;).GetString(dataTemp).Replace(&quot;0&quot;, &quot;\0&quot;));</div></div></div><div class="notion-text notion-block-6f8833d447f94724827d677d097b2fce">}</div><div class="notion-text notion-block-2f3313f411614e65a6e269752fd4a7a8">else</div><div class="notion-text notion-block-17f4226fa690494cb2fd8fe13a09c016">{<div class="notion-text-children"><div class="notion-text notion-block-35a8dbfbc156444ea3f90a765815153d">//  十六进制是选中的状态下</div><div class="notion-text notion-block-9b9a56ef26b14ad69ebaf02071cf10ab">//向接收文本框追加  将byte转化为16进制的 数据，然后追加一个空格</div><div class="notion-text notion-block-313c3883d32249309b19c312d695e003">recive_rtb.AppendText(Transform.ToHexString(dataTemp, &quot; &quot;));</div></div></div><div class="notion-text notion-block-88536fb28f9a48db8684fcf18b6b0bfb">}</div></div></div><div class="notion-text notion-block-04d6dc42ccf742b3b7d58af50a29db10">}));</div></div></div><div class="notion-text notion-block-0587ef655b46414a97e45b072e74a743">}</div><div class="notion-text notion-block-74c4652bae5d4bf59d2745ab5e7f7e5b">//暂停按键事件</div><div class="notion-text notion-block-976284694bfd4f63a47ea36d13a66722">private void stop_btn_Click(object sender, EventArgs e)</div><div class="notion-text notion-block-ab2f4bc47ec84bb58ce2071a92a5d641">{<div class="notion-text-children"><div class="notion-text notion-block-8684baea84464edda2610e69b27f5d48">if (isRxShow == true)</div><div class="notion-text notion-block-8906d84a6b2f441d83248858ae39f32e">{<div class="notion-text-children"><div class="notion-text notion-block-7856fd45e4964a9f81e522e2af1c104e">isRxShow = false;</div><div class="notion-text notion-block-094707b4ae174c71aa4e143c0c07b915">stop_btn.Text = &quot;取消暂停&quot;;</div></div></div><div class="notion-text notion-block-4ec491b5b3ad476bb3139581ab0e3447">}</div><div class="notion-text notion-block-4376b6cb53b745288d0c55061b1df4fd">else</div><div class="notion-text notion-block-94df6cf570fe454aa78dc1e2db08c6ee">{<div class="notion-text-children"><div class="notion-text notion-block-dd6a47826c3a4dfe8c41d3c61463f5e9">isRxShow = true;</div><div class="notion-text notion-block-037588695cee461aa6e4d2aa1f728126">stop_btn.Text = &quot;暂停&quot;;</div></div></div><div class="notion-text notion-block-df3aef804fbd4367863e4b4c7c561998">}</div></div></div><div class="notion-text notion-block-b45da2be650944ad8128bc08623dbd86">}</div><div class="notion-text notion-block-b0895b4271834a78a63d4dc36d453f64">//接收 16进制切换 框 点击<div class="notion-text-children"><div class="notion-text notion-block-f6882275f692481f8a9de224748670a6">private void recivehex_chb_CheckedChanged(object sender, EventArgs e)</div><div class="notion-text notion-block-34fc3173ea3e481897bab137d54eb168">{<div class="notion-text-children"><div class="notion-text notion-block-8efa837d065949b7bd7d0bf6bbdd00e4">//如果接收缓冲区 为空，直接退出</div><div class="notion-text notion-block-1e2d11eea9344cc5aeb17726decc111d">if (recive_rtb.Text == &quot;&quot;) return;</div><div class="notion-text notion-block-c48c1d5efa6e487e90d7e1e93f38ae1a">//如果16进制为勾选状态</div><div class="notion-text notion-block-e254c4930d7c4410b1752727f2c4c75b">if (recivehex_chb.Checked)</div><div class="notion-text notion-block-56015bd0670a483ba860f345d8703fc8">{<div class="notion-text-children"><div class="notion-text notion-block-bef482a675644f3b96386016ccca6b44">//把接收缓冲区的所有 变为 16进制， 用空格隔开</div><div class="notion-text notion-block-efac6c50aeba4a3bae5f211875ce4bb2">recive_rtb.Text = Transform.ToHexString(reciveBuffer.ToArray(),&quot; &quot;);</div></div></div><div class="notion-text notion-block-5c6ed88b63554e7eb61c52a8ba108dbf">}</div><div class="notion-text notion-block-01e3419c45464d479a80eb81da8c4cd4">else</div><div class="notion-text notion-block-2ff31e828861407793f675096549e6a6">{<div class="notion-text-children"><div class="notion-text notion-block-39697284944743838e4798d6307d9d43">//将接收到的字节数据根据 GB2312 编码转换为字符串，替换不可见的空字符 0 为可见的 \0</div><div class="notion-text notion-block-0e0d9bab77e8439fbc1a2a39890ea7e8">recive_rtb.Text = Encoding.GetEncoding(&quot;gb2312&quot;).GetString(reciveBuffer.ToArray()).Replace(&quot;0&quot;,&quot;\0&quot;);</div></div></div><div class="notion-text notion-block-9b5abe47250244628565e8230fd6584b">}</div></div></div><div class="notion-text notion-block-756aa339860d435086a3ec381fbd89e2">}</div><div class="notion-text notion-block-ef950467aad747dbad68d8b1672d1a42">//清空接收的数据</div><div class="notion-text notion-block-9101ce9f8c0348728da39906ab3a8e8f">private void clear_btn_Click(object sender, EventArgs e)</div><div class="notion-text notion-block-2ab089e8c24341e2beae8a805f7e655f">{<div class="notion-text-children"><div class="notion-text notion-block-da63d0abcde6499ebbe0f1f1beb870a8">reciveBuffer.Clear();</div><div class="notion-text notion-block-6a8bbfb0f6a0459a9d826bbe013f2805">recivecount_tssl.Text = &quot;&quot;;</div><div class="notion-text notion-block-db719cbec1d949b98611caf093a07795">recive_rtb.Text = &quot;&quot;;</div></div></div><div class="notion-text notion-block-892633e0b6574d7d92c246f7994f5459">}</div><div class="notion-text notion-block-fba9d40d15d54304bc62ba1f55afff0d">//自动清空点击事件</div><div class="notion-text notion-block-c2dac4a6d7d24f4f9808fc23baa90de5">private void autoclear_chb_CheckedChanged(object sender, EventArgs e)</div><div class="notion-text notion-block-0a644a422bf94b04a1267600549316a1">{<div class="notion-text-children"><div class="notion-text notion-block-dba886d8500d42dfbff58e9a14a71db6">//如果勾选了自动清空，那么启动定时器</div><div class="notion-text notion-block-b37d8530b0a246f6b4c25764e8f32c5a">if (autoclear_chb.Checked)</div><div class="notion-text notion-block-c12a87f21e854b588f0420d57c9c4f86">{<div class="notion-text-children"><div class="notion-text notion-block-dc3ab592c54a480a8daa20658aec21e7">timer1.Start();</div></div></div><div class="notion-text notion-block-00331bf215df467d83d468198323609f">}</div><div class="notion-text notion-block-a8847b27a1e248c78dfec6b001cb0d67">else</div><div class="notion-text notion-block-450e3347e8c345fab541fbba6d7f7628">{<div class="notion-text-children"><div class="notion-text notion-block-ce12e2b638b7471285315f26ac1dbb08">timer1.Stop();</div></div></div><div class="notion-text notion-block-806c16f25b8146eb8a048d11211b0eff">}</div></div></div><div class="notion-text notion-block-ac3bf9ae4b06469293c7547d004aa535">}</div><div class="notion-text notion-block-92191fb47e4e4db08d16543cdca999ff">//Timer定时事件到（100ms检测一次)</div><div class="notion-text notion-block-7eb3d63fa0dc4bfbbe2ef8cdce9c730c">private void timer1_Tick(object sender, EventArgs e)</div><div class="notion-text notion-block-88bcc20237b7484c9867057a76699b4d">{<div class="notion-text-children"><div class="notion-text notion-block-064a6970e3f24e63a239bfa7f6b5e8e2">//如果接收框内容大于4096，那么自动清除</div><div class="notion-text notion-block-bfb08b4baee2432f8fa86f4c754e5a01">if (recive_rtb.Text.Length &gt; 4096)</div><div class="notion-text notion-block-6093099d017b4ddebd4e8035fc11a288">{<div class="notion-text-children"><div class="notion-text notion-block-5b5c29c87c9341aab55baa52bb76d69a">reciveBuffer.Clear();       //清除接收缓冲区</div><div class="notion-text notion-block-b67a838ff65245b4a4b102a28d3a5e1f">recive_rtb.Text = &quot;&quot;;       //清除接收框</div><div class="notion-text notion-block-c0b774605afc4486bb33dabfdbc2f334">recivecount_tssl.Text = &quot;&quot;; //清除计数</div></div></div><div class="notion-text notion-block-1b055677708e44de9c2db924e898eab6">}</div></div></div><div class="notion-text notion-block-8006a189b2324b4ca138b744b26da6af">}</div><div class="notion-text notion-block-cb8ac685bf85437d9ee51af6014ba505">//当焦点移开发送框时触发</div><div class="notion-text notion-block-937d1c7335ab4f9996177fa11ca6c2eb">private void send_rtb_Leave(object sender, EventArgs e)</div><div class="notion-text notion-block-2428475f24ba4449b9fa2e3582cad8be">{<div class="notion-text-children"><div class="notion-text notion-block-e08d5f7fdfe147b5967457b03159a22e">//判断是否要发送16进制数据（是否为选中状态）</div><div class="notion-text notion-block-c52787da98014740a93c6457ad60bb7f">if (sendhex_chb.CheckState == CheckState.Checked)</div><div class="notion-text notion-block-c3f509e135cb472fa512b0571aa00d58">{<div class="notion-text-children"><div class="notion-text notion-block-341af5e2ab7547358b7e23dcf21e41b1">//选中了16进制发送</div><div class="notion-text notion-block-2e7506e307f2453d89e9ea387284d8f2">//把所有空格删除后，判断这是不是一个16进制字符串</div><div class="notion-text notion-block-400246f997774518aef324acecdce9ca">if (DataEncoding.IsHexString(send_rtb.Text.Replace(&quot; &quot;, &quot;&quot;)))</div><div class="notion-text notion-block-1e8bf48d87394288a8b9930f28e8be41">{<div class="notion-text-children"><div class="notion-text notion-block-cedbf321be4d41bca59870f04ca4aa02">sendBuffer.Clear();</div><div class="notion-text notion-block-ef8d1e14484246c39d142dac74ab4f21">//把转换好的数据，存放到发送缓冲区</div><div class="notion-text notion-block-888c265763d94d7da79664c343139e0a">sendBuffer.AddRange(Transform.ToBytes(send_rtb.Text.Replace(&quot; &quot;, &quot;&quot;)));</div></div></div><div class="notion-text notion-block-c8851c5d91ea47a983ad0bf0f3803b8b">}</div><div class="notion-text notion-block-3827defb1b4649a9bcd59101e90995a6">else //不是16进制数据</div><div class="notion-text notion-block-df25dc33fb55441490243cd15418a853">{<div class="notion-text-children"><div class="notion-text notion-block-ef536586e0e0483e8bf836039ea974e8"><a class="notion-link" href="http://MessageBox.Show" target="_blank" rel="noopener noreferrer">MessageBox.Show</a>(&quot;请输入正确的十六进制数据！！&quot;, &quot;发送框警告&quot;);</div><div class="notion-text notion-block-4c3a565ee6ab41ff81045dc6645b4f81">send_<a class="notion-link" href="http://rtb.Select" target="_blank" rel="noopener noreferrer">rtb.Select</a>();</div></div></div><div class="notion-text notion-block-da610649f43142adb8071d192c28ed07">}</div></div></div><div class="notion-text notion-block-97f64c0fd01f4a8bafac27a292949d21">}</div><div class="notion-text notion-block-c5d4b1701f6142c4803edd9264c27084">else   //未选中16进制。</div><div class="notion-text notion-block-08b421dd9e6c4885a2b29823ef49150b">{<div class="notion-text-children"><div class="notion-text notion-block-71bf8b36ade747299149ce1ede2e4c4f">sendBuffer.Clear();</div><div class="notion-text notion-block-b1e0fea94df846e493f23978c0f71995">//把当前数据，存放到发送缓冲区。</div><div class="notion-text notion-block-22473401f89e42639b6b3e31152084cf">sendBuffer.AddRange(Encoding.GetEncoding(&quot;gb2312&quot;).GetBytes(send_rtb.Text));</div></div></div><div class="notion-text notion-block-040005d64f0f4907a1a988fb5834e55d">}</div></div></div><div class="notion-text notion-block-84133a42f17042babfe12224333c74ed">}</div><div class="notion-text notion-block-1cd03a52c3e74c238da5ebead7c9c640">//注意如果使用文本发生变化事件，去处理16进制的转换，会发生错误</div><div class="notion-text notion-block-fca4b707ad644c35b2b0591d5655e4f2">private void send_rtb_TextChanged(object sender, EventArgs e)</div><div class="notion-text notion-block-5777a353660144769ed49eae7f4a3b31">{<div class="notion-text-children"><div class="notion-text notion-block-ece8a7b4e7ca4c898fee0fa76131b17c">// 十六进制切换 会出现问题  这问题就是0x00 转换</div></div></div><div class="notion-text notion-block-7bf32e8e011a4d76a4e1ab072d02a227">}</div><div class="notion-text notion-block-92eff4ac1dd242ce9fde8183b81f9194">//发送 16进制切换 框 点击</div><div class="notion-text notion-block-ec2b3f22c69744fabd28d8c2259e9927">private void sendhex_chb_CheckedChanged(object sender, EventArgs e)</div><div class="notion-text notion-block-eb2cc456b65844fdb8902093d4fc1973">{<div class="notion-text-children"><div class="notion-text notion-block-4f488296a23049dda95bb4d3683cc23b">//判断发送框文本你是否为空</div><div class="notion-text notion-block-24d8e3c2f7064e19a2617f7b23b27c00">if (send_rtb.Text == &quot;&quot;) return;</div><div class="notion-text notion-block-99626bee6f3f41f58ced8cb77eb3e278">//把发送缓冲区的所有 变为 16进制， 用空格隔开</div><div class="notion-text notion-block-0218fae9d1c14731a9509d849fcc306e">if (sendhex_chb.Checked == true)</div><div class="notion-text notion-block-6ce9d38d8fdb4b289a9773514cdeb3ea">{<div class="notion-text-children"><div class="notion-text notion-block-c700b58bb0134638a5dd44f15a394471">send_rtb.Text = Transform.ToHexString(sendBuffer.ToArray(), &quot; &quot;);</div></div></div><div class="notion-text notion-block-983aa78a403b495481cd68efcc141c0e">}</div><div class="notion-text notion-block-6895b5438b614181ad9f01f5539b7e55">else </div><div class="notion-text notion-block-b8e8618efdbb4b08b68ed48b4faf5860">{ <div class="notion-text-children"><div class="notion-text notion-block-447d7a4018884c16919a5d119afabd7c">send_rtb.Text = Encoding.GetEncoding(&quot;gb2312&quot;).GetString(sendBuffer.ToArray()).Replace(&quot;0&quot;,&quot;\0&quot;);</div></div></div><div class="notion-text notion-block-1b013439f3794a7f933086907ec14db6">}</div></div></div><div class="notion-text notion-block-6f9805ff73dc4906a4bdfa8b279bd712">}</div><div class="notion-text notion-block-473a3c55e09c4ef59bec04fe5f45698a">//发送框清除按钮点击事件</div><div class="notion-text notion-block-3d3d32d0b08c462c9b2cdd54f6ca2819">private void sendclear_btn_Click(object sender, EventArgs e)</div><div class="notion-text notion-block-3eaad429e59e49e1a5241de03b2a082e">{<div class="notion-text-children"><div class="notion-text notion-block-6b9f13988f724f6ca99afca6129e5717">sendBuffer.Clear();     //清除发送框缓冲区</div><div class="notion-text notion-block-8861ab8489824025bcd424ee80d08aa2">send_rtb.Text = &quot;&quot;;     //清除发送框</div><div class="notion-text notion-block-4e889b969658412bb0ec32b7cca4c0b3">sendCount = 0;          //清除发送计数</div><div class="notion-text notion-block-e1942134b79041b9811a7624e92c601a">sencount_tssl.Text = &quot;0&quot;;        //清除发送框计数</div></div></div><div class="notion-text notion-block-7c27b46d4cc245038d47c84d7557b5aa">}</div><div class="notion-text notion-block-5a76a21538e246db9f224805471e7039">}</div></div></div></div></div></div></div><div class="notion-text notion-block-a1aa217541b742cb874e18a7cab9b94a">}<div class="notion-text-children"><div class="notion-text notion-block-d122638f4e2d466e93e30b55ab3493ae">private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)</div><div class="notion-text notion-block-74c72d75e2ab464e8b2e3d4cd2f5d53c">{<div class="notion-text-children"><div class="notion-text notion-block-52d4fb4099bb4872bf99bb7f815668e0">if (isRxShow == false) return;</div><div class="notion-text notion-block-c571080b075a490c80bde9f885bbbfaf">// 1,需要读取有效的数据 BytesToRead</div><div class="notion-text notion-block-d04b4e560ddb45a2bc9138ef0ef30edd">byte[] dataTemp = new byte[serialPort1.BytesToRead];</div><div class="notion-text notion-block-f641554ef8184fe18708a63398d37842"><a class="notion-link" href="http://serialPort1.Read" target="_blank" rel="noopener noreferrer">serialPort1.Read</a>(dataTemp,0,dataTemp.Length);</div><div class="notion-text notion-block-bd8572188e51439f97e03bbab1fe3aa4">reciveBuffer.AddRange(dataTemp);</div><div class="notion-text notion-block-3814c2a029964f648c008cc0e711431d">reciveCount += dataTemp.Length;</div><div class="notion-text notion-block-9ba54f38c6b04f96ba9e14c8dced9f96">this.Invoke(new EventHandler(delegate</div><div class="notion-text notion-block-a7adbd45b174413c852478ee0a2a4709">{<div class="notion-text-children"><div class="notion-text notion-block-a243a93c693e40cca31c7dcfa461b5c6">// 显示接收数据的长度</div><div class="notion-text notion-block-f518812313174fcb88902cb3db14483f">recivecount_tssl.Text = reciveCount.ToString();</div><div class="notion-text notion-block-2a87319cbfd74dadbd7c3b386e2cafed">//如果数据帧格式没有被选中，那么就按照原先逻辑</div><div class="notion-text notion-block-630a492a35ee4507b87f4ed0040a5a8b">if (startData_chb.Checked == false)</div><div class="notion-text notion-block-92ce0a06ee014d12ae142e5c984d4118">{<div class="notion-text-children"><div class="notion-text notion-block-60639647f8964ebebc8cd36546ae7a00">if (!recivehex_chb.Checked)</div><div class="notion-text notion-block-d0de9f76493b4fbeb84b419a2ff131c0">{<div class="notion-text-children"><div class="notion-text notion-block-257fe20e1bfb44c585b8de043933b2a9">// 2, 编码格式的选择</div><div class="notion-text notion-block-173a850beaab4bf4b3642250bec08575">string str = Encoding.GetEncoding(&quot;gb2312&quot;).GetString(dataTemp);</div><div class="notion-text notion-block-e7aaf141d60a412f9277c3471891330d">// 3，0x00 -&gt; 0 结束 不会显示</div><div class="notion-text notion-block-e239b3e9015c4d9db2f23770d7d13d6e">str = str.Replace(&quot;0&quot;, &quot;\0&quot;);</div><div class="notion-text notion-block-293d80014ae64a62baffb19e03c65f66">recive_rtb.AppendText(str);</div><div class="notion-text notion-block-b0c0f19422774426af86ec4e3973e714">// recive_rtb.AppendText(Encoding.GetEncoding(&quot;gb2312&quot;).GetString(dataTemp).Replace(&quot;0&quot;, &quot;\0&quot;));</div></div></div><div class="notion-text notion-block-57e78998de6349debca5ae50fc4395b3">}</div><div class="notion-text notion-block-4ee1d908dd814c32ac087fbf4f7406c3">else</div><div class="notion-text notion-block-e9f4acd42a6249afab66a44013f99233">{<div class="notion-text-children"><div class="notion-text notion-block-10d0c463d7764b218d830bb08b409233">//  十六进制是选中的状态下</div><div class="notion-text notion-block-927bc6b87a224ea0bff7e3aace6af61c">recive_rtb.AppendText(Transform.ToHexString(dataTemp, &quot; &quot;));</div></div></div><div class="notion-text notion-block-afd2ada2732d407fbe91cafadd70985c">}</div></div></div><div class="notion-text notion-block-63c77319deeb4fd7a9a8b43941926c1b">}</div><div class="notion-text notion-block-cc31c2d903c640efb68b5ff0cf172ea3">else//如果选中了，那么久按照数据帧逻辑</div><div class="notion-text notion-block-60d1125edafe408eb701713a04ccbcff">{<div class="notion-text-children"><div class="notion-text notion-block-85f8c3c9eebd4f9aac41ebd5712d5e41">// 解析数据 queue</div><div class="notion-text notion-block-46bafd4d5e01411a9bf8a68f8422de4e">foreach (byte item in dataTemp)</div><div class="notion-text notion-block-37225e24f5a24c8c9c25006873fdce29">{<div class="notion-text-children"><div class="notion-text notion-block-5b5a226de5db4390b3723a471e71f21a">// 入列</div><div class="notion-text notion-block-08b0929534e04259913fa3468a761581">bufferQueue.Enqueue(item);</div></div></div><div class="notion-text notion-block-66da5564af824a00b04c562cd7fc4f4e">}</div><div class="notion-text notion-block-dfc2ee7500b84c7c8553447e3f353755">// 解析获取帧头</div><div class="notion-text notion-block-328d7abbf0c043928b936381baf1482b">if (isHeadRecive == false)</div><div class="notion-text notion-block-058edd22fed246d384dfe1eceea123e2">{<div class="notion-text-children"><div class="notion-text notion-block-058a8e76a189428293d037e9e14ab765">foreach (byte item in bufferQueue.ToArray())</div><div class="notion-text notion-block-f918987dfae5437b93c800ce0a4234e9">{<div class="notion-text-children"><div class="notion-text notion-block-9585667205664960b7478d46aab23223">//查找帧头</div><div class="notion-text notion-block-cff8a94629154aa9a1a7c71d00a0d026">if (item != 0x7f)</div><div class="notion-text notion-block-a6b0a7a28daf496980c7cebd8cc72550">{<div class="notion-text-children"><div class="notion-text notion-block-e6ee3dc1cd3b4bd684d17b826bf58cf9">// 出列</div><div class="notion-text notion-block-181b59cfeaa649c4a13e223bd2899a87">bufferQueue.Dequeue();</div><div class="notion-text notion-block-afa29e30d1f8493093395476978feb8e">Console.WriteLine(&quot;not 0x7f, Dequeue !!&quot;);</div></div></div><div class="notion-text notion-block-4e6b6efd7d4e4d06a2860cfb848bc970">}</div><div class="notion-text notion-block-7c025fcdc62b4799952d7e05f99e3641">else</div><div class="notion-text notion-block-7b633dcb65a644e1a8794dbdd1f8681a">{<div class="notion-text-children"><div class="notion-text notion-block-d5e56a08cdf34ea08192929ee6058051">// get 0x7f from bufferQueue</div><div class="notion-text notion-block-f5e95e85e919410786a2424468594cd1">isHeadRecive = true;</div><div class="notion-text notion-block-fb15f880f52b482e9886250f7a539906">Console.WriteLine(&quot;0x7f is recived !!&quot;);</div><div class="notion-text notion-block-81b2729c27014917829aaace64b9065c">break;</div></div></div><div class="notion-text notion-block-beab00f2c529473792384ac14b35ed54">}</div></div></div><div class="notion-text notion-block-e0c186faa7dd42519f8c9eb9b13daf5b">}</div></div></div><div class="notion-text notion-block-f52b9f67ddef401c8c995a9ecf2e77d3">}</div><div class="notion-text notion-block-07c4d3e9e92443c9a9236bb923d949bd">//接收数据</div><div class="notion-text notion-block-25150f166ca94e49a5dc283fdfa9d970">if (isHeadRecive == true)</div><div class="notion-text notion-block-a4eb6955092147e188f43b3935af9a0c">{<div class="notion-text-children"><div class="notion-text notion-block-c39aa00ddfca4835aca45cc8c34873f4">// 判断有数据帧长度</div><div class="notion-text notion-block-fc604e741be14e5d832ce35f946fcb4c">if (bufferQueue.Count &gt;= 2)</div><div class="notion-text notion-block-15b6ae21caeb4aa1b6a14b8f028c0407">{<div class="notion-text-children"><div class="notion-text notion-block-b82592fb234c408ca89d3c69ab569685">//调试数据</div><div class="notion-text notion-block-4dec0591d0e04cbc991b66b01acaeae1">Console.WriteLine(<a class="notion-link" href="http://DateTime.Now" target="_blank" rel="noopener noreferrer">DateTime.Now</a>.ToLongTimeString());</div><div class="notion-text notion-block-56a6fb80f9de40098377292116219772">Console.WriteLine($&quot;show the data in bufferQueue{Transform.ToHexString(bufferQueue.ToArray())}&quot;);</div><div class="notion-text notion-block-150f09424dfb450a9ab359ab62a3f2ab">Console.WriteLine($&quot;frame lenth ={String.Format(&quot;{0:X2}&quot;, bufferQueue.ToArray()[1])}&quot;);</div><div class="notion-text notion-block-a431c7411a27474da8524b6b7db49cc2">frameLenth = bufferQueue.ToArray()[1];</div><div class="notion-text notion-block-342bb461f5cd4206b6f6dd6fc5062d79">// 一帧完整的数据长度判断，不代表数据是正确的</div><div class="notion-text notion-block-5f27a647362042b88ef29a94cb5cb498">if(bufferQueue.Count&gt;=1+1+frameLenth+2) //帧头、数据、数据、CRC校验</div><div class="notion-text notion-block-8c1ebd20cb8a4c55a76a8c62d7470a23">{<div class="notion-text-children"><div class="notion-text notion-block-c6f019cd0d2d4f8fb15e8c9e3171a7e6">//把有效的帧长度拷贝出去</div><div class="notion-text notion-block-9968cd44169d4724926d5ab2124b6294">byte[] frameBuffer = new byte[1 + 1 + frameLenth + 2];</div><div class="notion-text notion-block-374bfb99e4c6419f92d608e6109b2c69">Array.Copy(bufferQueue.ToArray(), 0, frameBuffer, 0, frameBuffer.Length); </div><div class="notion-text notion-block-6963c2e970b9474eb8761070aaa072c9">if(crc_chech(frameBuffer))   //CRC校验有效则进入</div><div class="notion-text notion-block-00a77a56e2ff49c985262b9baea3d8fc">{<div class="notion-text-children"><div class="notion-text notion-block-645a9bc684864ea38bd2ce95e6398030">Console.WriteLine(&quot;frame is check ok,pick it&quot;);</div><div class="notion-text notion-block-0530f2e872724a24b142d79a789c8537">data_txb.Text = Transform.ToHexString(frameBuffer);</div><div class="notion-text notion-block-c9f11834ed86411d86f143866c1adbdf">data1_txb.Text = String.Format(&quot;{0:X2}&quot;, frameBuffer[2]);</div><div class="notion-text notion-block-53ede171ada545388a2a73809cb7e22f">data2_txb.Text = String.Format(&quot;{0:X2}&quot;, frameBuffer[3]);</div><div class="notion-text notion-block-9a418e24dd0645a790a58e450270689d">data3_txb.Text = String.Format(&quot;{0:X2}&quot;, frameBuffer[4]);</div><div class="notion-text notion-block-dde8edbf664f4ede97c77b8197db5747">data4_txb.Text = String.Format(&quot;{0:X2}&quot;, frameBuffer[5]);</div></div></div><div class="notion-text notion-block-d6bd7823726a4818ad48653ace2fb3cf">}</div><div class="notion-text notion-block-01a5f7f65be74b07887a16ed48f39bf4">else</div><div class="notion-text notion-block-2d8789e434914302ada2adb92b5f40fb">{<div class="notion-text-children"><div class="notion-text notion-block-76b1b2a681574f468d27a1a97a0fcb19">// 无效数据</div><div class="notion-text notion-block-8754e63e3fd745918827519ba01f2ed2">Console.WriteLine(&quot;bad frame, drop it&quot;);</div></div></div><div class="notion-text notion-block-5548e1a1a4614161ab82d5783c49907e">}<div class="notion-text-children"><div class="notion-text notion-block-a11a513f82c44a718935d103892b16f5">for(int i=0; i&lt;1 + 1+frameLenth+2;i++)  //抛弃（出列），</div><div class="notion-text notion-block-88a9dd56e896457b9034774da098fdb5">{<div class="notion-text-children"><div class="notion-text notion-block-61232825047449fb98a301b3a4ab95a1">bufferQueue.Dequeue();</div></div></div><div class="notion-text notion-block-2b9ab648e36b4433a6abfe12ed13a997">}</div><div class="notion-text notion-block-cd49ec4de2ba47ff9ad8cf8e0293f641">//处理下一帧数据</div><div class="notion-text notion-block-b0d961e92eae4a13aed31c21263674fe">isHeadRecive = false;</div><div class="notion-text notion-block-aa72be73d6064e548c5f5fee319bb769">}</div><div class="notion-text notion-block-0ef6c4630c7a4135a82388eccb6913fc">}</div><div class="notion-text notion-block-d08fdb89a0244d0d97809b67fa667eeb">//接续接收数据</div><div class="notion-text notion-block-3b0770fd64cb437bb6237d2548122640">}</div><div class="notion-text notion-block-73e4e6c96abf495f9d3b47271b4c0a19">}</div></div></div></div></div></div></div><div class="notion-text notion-block-83be60a8574f41d0a92cb3c33c1fe4e1">}));</div></div></div></div></div></div></div></div></div><div class="notion-text notion-block-7ecd2206ae9e42cc98dd7ea60c0c51ae">}</div><div class="notion-text notion-block-18bc5429e3b94a838ef2ca2432ff3386">//CRC校验，自己定义的。</div><div class="notion-text notion-block-6efa1815c5914328afbfba8964a21514">private bool crc_chech(byte[] frameBuffer)</div><div class="notion-text notion-block-52f50424f1a341f58415ac388edf0b2d">{<div class="notion-text-children"><div class="notion-text notion-block-bbd63632759d4eca874ee9029ea556e6">/*大端模式: 是指数据的高字节保存在内存的低地址中，<div class="notion-text-children"><ul class="notion-list notion-list-disc notion-block-42937962bfe643e8a381af51e8788aa3"><li>而数据的低字节保存在内存的高地址中，这样的存储</li></ul><ul class="notion-list notion-list-disc notion-block-8479b6b8d1c34c7080390cdf075df73f"><li>模式有点儿类似于把数据当作字符串顺序处理：地址</li></ul><ul class="notion-list notion-list-disc notion-block-75e392e176b54f5f88903950940d9a36"><li>由小向大增加，而数据从高位往低位放；这和我们的</li></ul><ul class="notion-list notion-list-disc notion-block-914c428a2bb2403fa120794c998d72f2"><li>阅读习惯一致。</li></ul><ul class="notion-list notion-list-disc notion-block-7714f81807b04f9eb7269ea783a84d5f"></ul><ul class="notion-list notion-list-disc notion-block-0b1e33e3d8824c769ec3807eeb40fe1d"><li>小端模式: 是指数据的高字节保存在内存的高地址中，</li></ul><ul class="notion-list notion-list-disc notion-block-c8b6906a9a594b0a981d11d98d6886d4"><li>而数据的低字节保存在内存的低地址中，这种存储模</li></ul><ul class="notion-list notion-list-disc notion-block-a13281c4ec644048b27216461afb5a20"><li>式将地址的高低和数据位权有效地结合起来，高地址</li></ul><ul class="notion-list notion-list-disc notion-block-d9f8ecf97dd5495db347a8f51bac87b6"><li>部分权值高，低地址部分权值低。</li></ul><div class="notion-text notion-block-db25833db9624d1794d8ef69eeeb3ff1">*/</div></div></div><div class="notion-text notion-block-96a338de5e834a018e99f70ba47ce909">bool ret = false;</div><div class="notion-text notion-block-eb6a8b05530040d1a47855dd8762b000">byte[] temp = new byte[frameBuffer.Length - 2];</div><div class="notion-text notion-block-3e21bf290c3d49afb94799b9252fb436">Array.Copy(frameBuffer, 0, temp, 0, temp.Length);</div><div class="notion-text notion-block-ac083a2bac69447dbf4e34c0313e4016">byte[] crcdata = DataCheck.DataCrc16_Ccitt(temp, DataCheck.BigOrLittle.BigEndian); //使用大端 CRC校验</div><div class="notion-text notion-block-a9cb9f46acf04cb6aaadb75f8a0e048c">if (crcdata[0] == frameBuffer[frameBuffer.Length - 2] &amp;&amp;   <div class="notion-text-children"><div class="notion-text notion-block-e7b5670197a84e1ba46b3c662beb185b">crcdata[1]== frameBuffer[frameBuffer.Length-1]) //如果校验值相等</div></div></div><div class="notion-text notion-block-7bc120f471f74d359bab7b3ffc0efedf">{<div class="notion-text-children"><div class="notion-text notion-block-9cea4253293c426a9dcbba9fe7961dbe">// check ok</div><div class="notion-text notion-block-75669095d48f4ed4bf1368d907da37d2">ret = true;</div></div></div><div class="notion-text notion-block-d1832e1b6f544aa590d042a826af217b">}</div><div class="notion-text notion-block-f86bbd12ee40416e9b6f1c2457ddd194">return ret;</div></div></div><div class="notion-text notion-block-d06a4495ea874bf5b8fe26239c56b8b0">}<div class="notion-text-children"></div></div></div></div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LVGL学习-PC]]></title>
            <link>https://www.mcoi.top/article/Post-LVGL-PC</link>
            <guid>https://www.mcoi.top/article/Post-LVGL-PC</guid>
            <pubDate>Sat, 16 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[PC环境下LVGL的环境搭建与学习]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2a9e940c69bb8096b69dccde980d67ce"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb80a99ff4d6c03bc0ba81"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">一个简单的开头</div></div><details class="notion-toggle notion-block-2a9e940c69bb8072ab34fedc08c5f6e7"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb8072ab34fedc08c5f6e7" data-id="2a9e940c69bb8072ab34fedc08c5f6e7"><span><div id="2a9e940c69bb8072ab34fedc08c5f6e7" class="notion-header-anchor"></div><span class="notion-h-title">一、LVGL是什么</span></span></h2></summary><div><details class="notion-toggle notion-block-2a9e940c69bb80be8041f018b60bb8d8"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb80be8041f018b60bb8d8" data-id="2a9e940c69bb80be8041f018b60bb8d8"><span><div id="2a9e940c69bb80be8041f018b60bb8d8" class="notion-header-anchor"></div><span class="notion-h-title">简介</span></span></h3></summary><div><div class="notion-text notion-block-2a9e940c69bb805db928c91f88ca82d3">LVGL (Light and Versatile Graphics Library)是一个开源的图形用户界面库，旨在提供轻量级、可移植、灵活和易于使用的图形用户界面解决方案。
它适用于嵌入式系统，可以在不同的操作系统、微控制器和图形加速器上运行。LVGL的核心代码是用C语言编写的，支持多种显示设备和输入设备，包括液晶显示屏、0LED显示屏、触摸屏、按键和编码器害，
LVGL提供了一系列组件和小部件，例如文本框、按钮、滑动条、表格、菜单等，可以快速构建交互式用户界面。LVGL还具有高度自定义的能力，用户可以根据需要修改或扩展库的功能。总之，LVGL是一个功能强大、易于使用的图形用户界面库，可以帮助开发人员在嵌入式系统中实现各种交互式应用程序。</div></div></details><details class="notion-toggle notion-block-2a9e940c69bb80db9702c59a2f0cd3bd"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb80db9702c59a2f0cd3bd" data-id="2a9e940c69bb80db9702c59a2f0cd3bd"><span><div id="2a9e940c69bb80db9702c59a2f0cd3bd" class="notion-header-anchor"></div><span class="notion-h-title">特点</span></span></h3></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8006a697c836cd3cbf7b" style="list-style-type:decimal"><li><b>轻量级和高效:</b> LVGL的核心代码非常小巧，可以在资源受限的嵌入式系统上运行，同时具有出色的性能和速度。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb809b860ac92b0ee17ad5" style="list-style-type:decimal"><li><b>可移植性:</b> LVGL支持多种处理器架构和操作系统，可以在不同的平台上使用。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb803a89edf8d62ae80d54" style="list-style-type:decimal"><li><b>灵活性:</b> LVGL提供了大量的可自定义选项，包括主题、字体、颜色、大小、形状等，可以根据项目需求进行灵活定制。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80debc46fcdbe274f795" style="list-style-type:decimal"><li><b>易于使用:</b> LVGL提供了简单易懂的API和丰富的文档，使开发人员可以快速上手，构建复杂的图形用户界面。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80fb95abed573713f48b" style="list-style-type:decimal"><li><b>多种输入设备支持: </b>LVGL支持多种输入设备，包括触摸屏、按键、编码器等，可以满足不同应用场景的需求。</li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80faa538ffe4c887ecf4" style="list-style-type:decimal"><li><b>多种组件支持:</b> LVGL提供了多种常用组件，如文本框、按钮、滑动条、表格、菜单等，同时还支持自定义组件。</li></ol><ol start="7" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8013abeadbc98d817730" style="list-style-type:decimal"><li><b>兼容性: </b>LVGL支持多种显示设备，包括LCD、OLED、ePaper等，可以适应不同的显示分辨率和屏幕尺寸。</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80adb489df3e2712377a" style="list-style-type:decimal"><li><b>社区支持: </b>LVGL有一个活跃的社区，用户可以在社区中获得支持和帮助，同时也可以分享自己的经验和贡献代码。</li></ol></div></details></div></details><details class="notion-toggle notion-block-2a9e940c69bb801d9006d701296318df"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb801d9006d701296318df" data-id="2a9e940c69bb801d9006d701296318df"><span><div id="2a9e940c69bb801d9006d701296318df" class="notion-header-anchor"></div><span class="notion-h-title">二、LVGL模拟器环境搭建（PC端）</span></span></h2></summary><div><blockquote class="notion-quote notion-block-2a9e940c69bb81de8da0ca2a9d8c126e"><div><span class="notion-pink">为什么用PC端的模拟器： 方便调试，后续可移植MCU MPU</span></div></blockquote><a class="notion-page-link notion-block-2a9e940c69bb81579998e52c8fe7d176" href="/2a9e940c69bb81579998e52c8fe7d176"><span class="notion-page-title"><div class="notion-page-icon-inline notion-page-icon-image"><svg class="notion-page-title-icon notion-page-icon" alt="Github lvgl库" viewBox="0 0 30 30" width="16"><path d="M16,1H4v28h22V11L16,1z M16,3.828L23.172,11H16V3.828z M24,27H6V3h8v10h10V27z M8,17h14v-2H8V17z M8,21h14v-2H8V21z M8,25h14v-2H8V25z"></path></svg></div><span class="notion-page-title-text">Github lvgl库</span></span></a><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb816fb953ecf993493be4" style="list-style-type:decimal"><li>LVGL github库版本调试不好，这里选择用<b>CodeBlocks</b>，建议去看韦东山老师的教学<a class="notion-link" href="https://www.bilibili.com/video/BV19s421u7TH?buvid=XU6FD4C69728329C9FE240A4DB0D9639E6048&amp;from_spmid=search.search-result.0.0&amp;is_story_h5=false&amp;mid=JNLCkfj9NCRkDTjg67qFwg%3D%3D&amp;plat_id=116&amp;share_from=ugc&amp;share_medium=android&amp;share_plat=android&amp;share_session_id=4512bdb4-feca-47e3-a542-a1aa9bd05c2b&amp;share_source=WEIXIN&amp;share_tag=s_i&amp;spmid=united.player-video-detail.0.0&amp;timestamp=1744212600&amp;unique_k=XMtjoGp&amp;up_id=275908810&amp;vd_source=1a07d5f9a611dfcab66b26946efdfc4d&amp;spm_id_from=333.788.videopod.sections" target="_blank" rel="noopener noreferrer">1-4-0_LVGL入门教程之设置CodeBlocks（补充内容-重要必看）_哔哩哔哩_bilibili</a></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81f59247e1ebb76133a3" style="list-style-type:decimal"><li>如何修改<b>CodeBlocks工程的LVGL源码</b><a class="notion-link" href="https://www.bilibili.com/video/BV16Z421j7ip?buvid=XU6FD4C69728329C9FE240A4DB0D9639E6048&amp;from_spmid=search.search-result.0.0&amp;is_story_h5=false&amp;mid=JNLCkfj9NCRkDTjg67qFwg%3D%3D&amp;plat_id=116&amp;share_from=ugc&amp;share_medium=android&amp;share_plat=android&amp;share_session_id=4512bdb4-feca-47e3-a542-a1aa9bd05c2b&amp;share_source=WEIXIN&amp;share_tag=s_i&amp;spmid=united.player-video-detail.0.0&amp;timestamp=1744212600&amp;unique_k=XMtjoGp&amp;up_id=275908810&amp;vd_source=1a07d5f9a611dfcab66b26946efdfc4d&amp;spm_id_from=333.788.videopod.sections" target="_blank" rel="noopener noreferrer">2-1-1_LVGL入门教程之如何获取LVGL的源码_哔哩哔哩_bilibili</a></li></ol><div class="notion-blank notion-block-2a9e940c69bb8190a433dc41f4025ff7"> </div></div></details><details class="notion-toggle notion-block-2a9e940c69bb80fb8d94d0df358273c6"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb80fb8d94d0df358273c6" data-id="2a9e940c69bb80fb8d94d0df358273c6"><span><div id="2a9e940c69bb80fb8d94d0df358273c6" class="notion-header-anchor"></div><span class="notion-h-title">三、LVGL的学习（看手册去了， 这里不写了）</span></span></h2></summary><div><details class="notion-toggle notion-block-2a9e940c69bb80398530f791bb3a15cb"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb80398530f791bb3a15cb" data-id="2a9e940c69bb80398530f791bb3a15cb"><span><div id="2a9e940c69bb80398530f791bb3a15cb" class="notion-header-anchor"></div><span class="notion-h-title">LVGL目录解析</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-2a9e940c69bb8094a021f0da016e8472"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb8094a021f0da016e8472" data-id="2a9e940c69bb8094a021f0da016e8472"><span><div id="2a9e940c69bb8094a021f0da016e8472" class="notion-header-anchor"></div><span class="notion-h-title">LVGL的启动流程</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-2a9e940c69bb8052b81bfb4167032fe3"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb8052b81bfb4167032fe3" data-id="2a9e940c69bb8052b81bfb4167032fe3"><span><div id="2a9e940c69bb8052b81bfb4167032fe3" class="notion-header-anchor"></div><span class="notion-h-title">LVGL的裁剪</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-2a9e940c69bb80d4a5e5d745f7e7d8d5"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb80d4a5e5d745f7e7d8d5" data-id="2a9e940c69bb80d4a5e5d745f7e7d8d5"><span><div id="2a9e940c69bb80d4a5e5d745f7e7d8d5" class="notion-header-anchor"></div><span class="notion-h-title">LVGL的基础对象（lv_obj）2.3.1</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80aa936aeb828c42b5e3"><li>在面向对象的思想中，基础对象 是 LVGL 中所有其他对象都继承自的基类。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8018a36ce3335b51a4a2"><li><b>我们在学习时以基础对象为开头进行学习。</b></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d98ffde38ad19a216f"><li>在LVGL中，有三层屏幕：活动屏幕(screen_active) &lt; 顶层(top layer) &lt; 系统层(system layer)</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d98ffde38ad19a216f"><li>同级的话，先创建的被后创建的覆盖，示例：</li><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-e57c2ab0e5ef4f9298882bf2bdff9d91"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/1f514593-2beb-4676-b72d-c7d207275ba5-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=e57c2ab0-e5ef-4f92-9888-2bf2bdff9d91" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80288d5fe1ae4a68ce5d" style="list-style-type:decimal"></ol></div></details><details class="notion-toggle notion-block-2a9e940c69bb8007b592e61a74f37f83"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb8007b592e61a74f37f83" data-id="2a9e940c69bb8007b592e61a74f37f83"><span><div id="2a9e940c69bb8007b592e61a74f37f83" class="notion-header-anchor"></div><span class="notion-h-title">LVGL对象的大小</span></span></h3></summary><div><div class="notion-text notion-block-2a9e940c69bb80e994d2d957759d3468">修改大小</div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80edb91cc2d1738c0deb"><li>可以使用<code class="notion-inline-code"> lv_obj_set_width(obj, new_width) </code>和 <code class="notion-inline-code">lv_obj_set_height(obj, new_height) </code>设置或修改单个轴上的对象大小，</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80dabefecf668a657e6c"><li>或者可以同时修改两个轴用<code class="notion-inline-code"> lv_obj_set_size(obj, new_width, new_height)  </code></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80cfb5aceb5f16099356"><li>以最后一次设置为准</li></ul><div class="notion-text notion-block-2a9e940c69bb8063804afd24fbd7c1fb">获取大小</div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8021b13edfb7e2f7b806"><li>使用<code class="notion-inline-code">lv_obj_get_width(obj) </code>来获取宽度</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb805bb0a8d33a6be1ed02"><li>使用<code class="notion-inline-code">lv_obj_get_hight(obj) </code>来获取宽度</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb800eb090c9967d2b1efb"><li>使用<code class="notion-inline-code">lv_obj_get_content_width (obj)</code>获取实际可用宽度</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb803c8f65d929cb6cb94b"><li>使用<code class="notion-inline-code">lv_obj_get_content_height(obj)</code>获取实际可用高度</li></ul><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb80008e63e51909efd597"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-2a9e940c69bb8070ba18e926f64b0a43">后者获取的大小会比前者小， 因为LVGL为了更美观，会预留空间，这个空间是可调的</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-57766994f2724b82a8bd0b20457efba9"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/35e7a837-dbee-4b8b-bd64-6535f5fe17f0-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=57766994-f272-4b82-a8bd-0b20457efba9" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80558214f4df8fac722c"><li>注意：坐标会被延迟计算，强制更新坐标函数为<code class="notion-inline-code"><b>lv_obj_update_layout()</b></code></li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-12af0a970b49480a8fdaca5a041e0266"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/2a586365-3af8-44b1-92d5-c6d36f5ee0a5-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=12af0a97-0b49-480a-8fda-ca5a041e0266" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-2a9e940c69bb80c8babbf9fde0d4d368">文档位置</div></div></details><details class="notion-toggle notion-block-2a9e940c69bb8024a891db93cce3de92"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb8024a891db93cce3de92" data-id="2a9e940c69bb8024a891db93cce3de92"><span><div id="2a9e940c69bb8024a891db93cce3de92" class="notion-header-anchor"></div><span class="notion-h-title">LVGL对象的位置</span></span></h3></summary><div><details class="notion-toggle notion-block-2a9e940c69bb80e19c73edfe87c60705"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb80e19c73edfe87c60705" data-id="2a9e940c69bb80e19c73edfe87c60705"><span><div id="2a9e940c69bb80e19c73edfe87c60705" class="notion-header-anchor"></div><span class="notion-h-title">位置的设置</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb80ff9370feacc02d80a5">一个对象未设置位置，会默认位于左上角 </div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-dd16303550e743608f21bceb2781b889"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/88301ce7-8ca8-428b-80ba-9d8e2f46dd3e-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=dd163035-50e7-4360-8f21-bceb2781b889" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-2a9e940c69bb80c58797c9edcba641cd">可以使用</div><div class="notion-text notion-block-2a9e940c69bb806b888bcefc376d107a">来设置大小，这里的200指的是右移200， -50为上移 如图</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-4390fdc2725b4b3693de1c2654066dee"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/aa7efd84-b9df-40a5-ae0f-32bd94f8ee65-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=4390fdc2-725b-4b36-93de-1c2654066dee" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><details class="notion-toggle notion-block-2a9e940c69bb80cd80f8d47259daedb3"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb80cd80f8d47259daedb3" data-id="2a9e940c69bb80cd80f8d47259daedb3"><span><div id="2a9e940c69bb80cd80f8d47259daedb3" class="notion-header-anchor"></div><span class="notion-h-title">位置的对齐</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb8015bf0afc9f7e833852">api：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-fa1d278f01ff46b595bf344ce7105ea5"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/6883644f-0b2f-47d7-86cd-99d31e37c9c2-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=fa1d278f-01ff-46b5-95bf-344ce7105ea5" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-2a9e940c69bb806495f8e143bd5616aa">例如：<code class="notion-inline-code">lv_obj_set_align(obj, LV_ALIGN_CENTER);</code></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-3f43de8da3e44e99bb76641f639d2352"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/06301785-cc95-4696-b98f-769279e8e926-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=3f43de8d-a3e4-4e99-bb76-641f639d2352" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-2a9e940c69bb805da2b2ddcbc3ebee65">也能居中后偏移，<code class="notion-inline-code">lv_obj_align(obj, LV_ALIGN_CENTER, 100, 100);</code></div><div class="notion-text notion-block-2a9e940c69bb8017ada5d761ea66ee65"><code class="notion-inline-code">lv_obj_align_to(label, obj, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);</code>
相较于一个对象的位置</div></div></details><details class="notion-toggle notion-block-2a9e940c69bb8087af2cd9494367d94b"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb8087af2cd9494367d94b" data-id="2a9e940c69bb8087af2cd9494367d94b"><span><div id="2a9e940c69bb8087af2cd9494367d94b" class="notion-header-anchor"></div><span class="notion-h-title">获取位置</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb802eb2d1fc22f62186ea">两个点就能确定一块区域。</div><div class="notion-text notion-block-2a9e940c69bb809399d2cf1bafdb2bab">可以获取基于屏幕原点的x  x2 y y2的位置， 也可以获取对齐后的x1  x2   y  y2位置</div></div></details></div></details><details class="notion-toggle notion-block-2a9e940c69bb80deab6bf3aa619bd192"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb80deab6bf3aa619bd192" data-id="2a9e940c69bb80deab6bf3aa619bd192"><span><div id="2a9e940c69bb80deab6bf3aa619bd192" class="notion-header-anchor"></div><span class="notion-h-title">LVGL对象的盒子模型</span></span></h3></summary><div><details class="notion-toggle notion-block-2a9e940c69bb8030b08af3b5feb4291e"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb8030b08af3b5feb4291e" data-id="2a9e940c69bb8030b08af3b5feb4291e"><span><div id="2a9e940c69bb8030b08af3b5feb4291e" class="notion-header-anchor"></div><span class="notion-h-title">简单介绍</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb80d3b965edfa00f9396b">LVGL`遵循<b> CSS 的 border-box 模型。</b> <b>对象的“盒子”由以下部分构成:</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80dc9725e0c07e16996a"><li>边界(bounding):元素的宽度/高度围起来的区域(整个盒子)。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d4a391c2ec691230bc"><li>边框(border):边框有大小和颜色等属性(相当于盒子的厚度和它的颜色)。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb807b8573e9bb12b01703"><li>填充(padding):对象两侧与其子对象之间的空间(盒子的填充物)。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb808fa047e0afffc86bf8"><li>内容(content):如果边界框按边框宽度和填充的大小缩小，则显示其大小的内容区域(盒子实际装东西的区域)。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb800696bbc23f9393d621"><li>轮廓(outline): LVGL中没有外边距(margin)的概念(盒子之间的距离)，确认代之的是轮廓(outline)。它是绘制于元素(盒子)周围的一条线，它不占据空间，位于边框边缘的外围，可起到突出元素(盒子)的作用。在浏览器里，当鼠标点击或使用Tab键让一个选项或者一个图片获得焦点的时候，这个元素就会多了一个轮廓框围绕。轮廓(outline)。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb808c9bacc402e35b98e6"><li>LVGL的盒子模型是我们理解对象(部件)的组成，修改对象的样式，实现对对象的布局、处理对象排列等等的关键。</li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-fd8b3c6748ce49f5864878ab2b5b6dbe"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/79f0920a-134b-4bda-a29b-3ac103cabe5d-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=fd8b3c67-48ce-49f5-8648-78ab2b5b6dbe" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><details class="notion-toggle notion-block-2a9e940c69bb80b3a1b8ecb641ef46de"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb80b3a1b8ecb641ef46de" data-id="2a9e940c69bb80b3a1b8ecb641ef46de"><span><div id="2a9e940c69bb80b3a1b8ecb641ef46de" class="notion-header-anchor"></div><span class="notion-h-title"><b>盒子模型通俗理解:</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80c4a56cf5ce31532dc2"><li>这些属性我们可以把它转移到我们日常生活中的盒子(箱子)上来理解，日常生活中所见的盒子也就是能装东西的一种箱子，也具有这些属性，所以叫它盒子模型。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8038b0a4dcf45f205895"><li>content就是盒子里装的东西，它有高度(height)和宽度(width),可以是图片，可以是文字或者小盒子嵌套，在现实中，内容不能大于盒子，内容大于盒子就会撑破盒子，在LVGL中盒子不会变化，会产生滚动条，我们可以滚动查看超出盒子的内容，盒子也可以是有弹性的，内容太大就会撑大盒子(自动调整大小)，但是不会损害盒子。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80a08e23c55e03fc6031"><li>padding即是填充，就好像我们为了保证盒子里的东西不损坏，填充了一些东西，比如泡沫或者塑料薄膜，填充物有
大有小，有软有硬。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80c4a20ff6bad9c362b9"><li>border就是再外一层的边框，因为边框有大小和颜色的属性，相当于盒子的厚度和它的颜色或者材料。marain外边距，就是我们的盒子与其他的盒子或者其他东西的距离。假如有很多盒子，margin就是盒子之间直接的距离，可以通风，也美观同时方便取出。</li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-b2964a55ded84763817df35982900564"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-LVGL-PC/f1500a6f-e870-4243-b32a-1d50979e6fbd-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=b2964a55-ded8-4763-817d-f35982900564" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details></div></details></div></details><div class="notion-blank notion-block-2a9e940c69bb8029af8ff0b6836c3898"> </div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb803693c0f202c4c26e00"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text">有关LVGL其他问题，欢迎您在底部评论区留言，一起交流~</div></div></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>