如何在 Flipper Zero 应用中用 serial 模块配置 usart/lpuart 并完成收发与 expect 匹配

发布时间:2026/9/14 8:55:05
如何在 Flipper Zero 应用中用 serial 模块配置 usart/lpuart 并完成收发与 expect 匹配 如何在 Flipper Zero 应用中用 serial 模块配置 usart/lpuart 并完成收发与 expect 匹配【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware这篇文档面向在 Flipper Zero 上开发 JavaScript 应用的读者你需要在 JS 脚本中通过内置的serial模块配置usart或lpuart串口完成数据发送、接收并用expect对接收到的数据流做模式匹配。适用前提是一台 Flipper Zero、一台 PC 和一根 USB 线serial模块随固件自带以编译好的 FAL 文件形式存放在 microSD 卡上无需额外安装只需在脚本里用require()加载。完成后可在 CLI 或设备的 Scripts 菜单中运行脚本通过print()输出和expect的返回值判断收发是否成功。准备工作加载模块并放置脚本在使用任何serial方法之前必须先用require()导入模块否则无法访问其方法。所有已加载模块会在应用结束后自动从 RAM 卸载let serial require(serial);把脚本文件保存到设备的SD Card/apps/Scripts/目录可通过 qFlipper 的文件管理器拖入。运行脚本有两条路径设备菜单Apps → Scripts选择脚本后按OK运行print()输出显示在屏幕CLI设备通过 USB 连接 PC 后进入 CLI执行js /ext/apps/Scripts/脚本名.js此时print()输出全部发送到 CLI 而不是设备屏幕适合边改边测。也可以用 Flipper Zero JavaScript SDK 的npm start一键拷贝并运行见 JavaScript SDK 文档。用 setup() 配置 usart/lpuart 端口setup()必须在该模块的所有其他方法之前调用serial.setup(lpuart, 115200);参数依次为串口名只能是usart或lpuart波特率例如115200、230400可选的帧配置对象例如{ dataBits: 8, parity: even, stopBits: 1 }。不传第三个参数时使用默认的 8N1 帧8 数据位、无校验、1 停止位。帧配置的取值与约束文档原文限制配置前务必核对dataBits6、7、8、9。6 数据位只能在启用校验even/odd时选择9 数据位只能在无校验none时选择paritynone、even、oddstopBits0.5、1、1.5、2。LPUART 只支持整数停止位长度即 1 和 2不支持 0.5 和 1.5。一个使用 8E1 帧的完整配置示例来自仓库样例 uart_echo_8e1.jslet serial require(serial); serial.setup(usart, 230400, { dataBits: 8, parity: even, stopBits: 1 });注意如果在已配置状态下再次调用setup()会报错Serial is already configured见实现 js_serial.c。需要重新初始化时先调用end()。用 write() 发送数据write()接受一个或多个参数支持以下类型字符串单个数字按字节解释数字数组每个数字解释为一个字节ArrayBuffer 或 DataView。serial.write(0x0a); // 写入单字节 0x0A serial.write(Hello, world!); // 写入字符串 serial.write(Hello, world!, [0x0d, 0x0a]); // 字符串后跟两个字节write()没有返回值发送是否成功要靠对端响应或后续接收来验证。用 read/readln/readAny/readBytes 接收数据四个接收方法都以毫秒为单位的超时可选项为参数超时未收到数据时返回undefined方法行为serial.read(n)读取固定 n 个字节返回字符串serial.readln()读到换行字符\r或\n为止返回该行字符serial.readAny()读出当前缓冲区中所有可用数据避免小步长读取拖慢循环serial.readBytes(n)读取固定 n 个字节返回 ArrayBuffer示例serial.read(1); // 读 1 个字节不设超时 serial.read(10, 5000); // 读 10 个字节5 秒超时 serial.readln(5000); // 带 5 秒超时读一行 serial.readAny(5000); // 带 5 秒超时读出所有可用数据readBytes(1, 0)是特殊用法零超时从接收缓冲区读 1 字节缓冲区为空时返回undefined适合非阻塞轮询。用 expect() 做接收数据的模式匹配expect()在接收数据流中搜索字符串模式签名是serial.expect(patterns, timeout)patterns 可以是单个字符串、单个数字数组按字节解释或它们的数组多个候选模式超时参数可选单位 ms不传则无限等待。返回值是匹配模式在候选列表中的下标超时未匹配到则返回undefined// 等待根 shell 提示符1 秒超时收到返回 0没收到返回 undefined serial.expect(# , 1000); // 无限等待两个字符串之一匹配第一个返回 0匹配第二个返回 1 serial.expect([: not found, Usage: ]);下标语义在多候选场景是判断逻辑的依据例如上例中返回值1表示第二条模式Usage: 命中。完整示例一usart 回显验证收发仓库自带样例 uart_echo.js 演示了 usart 上的收发闭环配置端口后循环读 1 字节1 秒超时读到就原样写回并通过print把字节值以十六进制打印出来let serial require(serial); serial.setup(usart, 230400); while (1) { let rx_data serial.readBytes(1, 1000); if (rx_data ! undefined) { serial.write(rx_data); let data_view Uint8Array(rx_data); print(0x data_view[0].toString(16)); } }把文件放入SD Card/apps/Scripts/后用 CLI 执行js /ext/apps/Scripts/uart_echo.js验证方式向串口发送字节CLI 中会看到print输出的形如0x41的十六进制值这是文档示例中的输出格式具体数值取决于你发送的字节。同时外部接收设备应收到回显的原始字节。完整示例二expect 驱动的多步交互仓库样例 bad_uart.js 展示了在 lpuart 上用expect串起一整个交互流程先发送换行等待 shell 提示符确认设备上有uci命令后逐步执行并读取结果let serial require(serial); serial.setup(lpuart, 115200); // serial.write(\n); serial.write([0x0a]); let console_resp serial.expect(# , 1000); if (console_resp undefined) { print(No CLI response); } else { serial.write(uci\n); let uci_state serial.expect([: not found, Usage: ]); if (uci_state 1) { serial.expect(# ); serial.write(uci show wireless\n); serial.expect(.key); print(key:, serial.readln()); } else { print(uci cmd not found); } }运行后的判断标准都写在代码里expect(# , 1000)返回undefined说明 1 秒内没等到提示符打印No CLI responseexpect([: not found, Usage: ])返回1表示Usage:命中uci命令存在返回0则打印uci cmd not found。readln()在这里用于读取.key行之后的整行内容并打印例如输出key:加上读到的那一行。重新配置与限制重新初始化脚本运行期间不能直接再次setup()。end()会反初始化串口之后可以重新setup()serial.end(); // 重新配置 LPUART 端口波特率 115200 serial.setup(lpuart, 115200);未初始化就调用在setup()之前调用write()、read*()、expect()等方法会报错Serial is not configured见 js_serial.c。LPUART 停止位只能用1或20.5、1.5不被 LPUART 支持。数据位约束dataBits: 6必须搭配 even/odd 校验dataBits: 9必须搭配parity: none否则按文档约束组合不成立。更多模块 API 细节各方法参数与返回值的完整说明见 Serial module 文档。【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询