当前位置: 首页 > news >正文

奇怪的知识又增加了:ESP32下的Lisp编程=>ULisp--Lisp for microcontrollers

ESP32下有MicroPython,那么我就在想,有Lisp语言支持吗?答案是果然有!有ULisp,专门为MCU设计的Lisp!

网址:uLisp - Lisp for microcontrollers

介绍:用于微控制器的 Lisp

适用于 Arduino、Adafruit M0/M4、Micro:bit、ESP32、RISC-V 和 Teensy 4.x 板的 Lisp。

uLisp® 是 Lisp 编程语言的一个版本,专门设计用于在具有有限 RAM 的微控制器上运行,从基于 ATmega328 的 Arduino Uno 到 Teensy 4.0/4.1。无论平台如何,您都可以使用完全相同的 uLisp 程序。有关每个平台的性能,请参阅 性能。

因为 uLisp 是一个解释器,所以你可以输入命令,并立即看到效果,而不必编译和上传你的程序。这使它成为学习编程或设置简单电子设备的理想环境。

Lisp 也是学习基本编程概念的理想语言。它结合了字符串处理、列表处理和垃圾回收,因此也是表达复杂想法的优秀语言,例如教机器人解决迷宫或在地图上找到最短的路线。除了支持一组核心的 Lisp 功能外,uLisp 还包括 Arduino 扩展,使其成为 Arduino 控制语言的理想选择。

下载软件

您可以从下载并安装 uLisp

下载ESP32的Ulist软件

这个链接:http://www.ulisp.com/list?50GW 

或者:

GitHub - technoblogy/ulisp-esp: A version of the Lisp programming language for ESP32-based boards.

 有两个版本,分别是ulisp-esp-comments.ino 和ulisp-esp.ino ,两个版本内容一样,只是ulisp-esp-comments.ino 代码里有注释。

直接把文件,也就是c源代码保存下来即可。ino后缀就是Arduino的文件。

下载Arduino的UList软件

AVR-Nano version

Download the AVR-Nano version for AVR platforms with 32 or 48 Kbytes of program memory, such as the Arduino Uno, Arduino Nano, and Arduino Nano Every:

AVR-Nano Release 4.7 - 9th November 2024

or get it from GitHub at GitHub - technoblogy/ulisp: A version of the Lisp programming language for ATmega-based Arduino boards..

同样把源代码保存即可。

编译安装

直接在Arduino中编译即可。当然ESP32可以在自己的ESP-IDF里面编译(没测试)。

在Arduino新创建的项目中黏贴文件代码。

在ESP32中编译安装

编译,上传

编译好慢啊

编译失败。最终是在文件里加上这段才编译成功,不明白为什么我的esp32c3的板子,被认成了esp32,可以修改ESP32的定义:

​
#elif defined(ESP32)                             /* Generic ESP32 board */#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

 也可以这样处理,在文件开始加入一句:

#define AIRM2M_CORE_ESP32C3

后面加入一段

#elif defined(AIRM2M_CORE_ESP32C3)#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

这样就能识别出开发板了。 这块AIRM2M_CORE_ESP32C3开发板需要这样做,测试发现手上的ESP32S3开发板不需要这样做。

编译好这样显示:

在Arduino Uno中安装

编译,上传

编译好快啊

Sketch uses 32232 bytes (99%) of program storage space. Maximum is 32256 bytes.
Global variables use 1552 bytes (75%) of dynamic memory, leaving 496 bytes for local variables. Maximum is 2048 bytes.
 

这样就上传好了

测试

在Arduino Uno中,将13端口接上一个LED灯,

在ESP32C3中,直接用开发板上自带的LED灯,

输入如下代码

(defun blink (&optional x)(pinmode :led-builtin :output)(digitalwrite :led-builtin x)(delay 1000)(blink (not x)))

然后输入

(blink)

我们就看到13号接口的灯在闪了,把频率调高一点:

(defun blink (&optional x)(pinmode :led-builtin :output)(digitalwrite :led-builtin x)(delay 500)(blink (not x)))

 好像没有变化啊,看来lisp跟python不太一样啊,python是冲掉原来的代码....

(后来明白了,是灯闪了之后就卡住了,不接收任何指令,除非用“~”中断)

中断之后,再去修改频率等,就有变化了。

安装Arduino ESP_OTA库

Installing uLisp

The download is a single text file. To compile it in the Arduino IDE either save it as a text file and rename it to a .cpp file, or copy and paste the text into a new empty project file. You can download the latest Arduino IDE from arduino.cc.

Select the correct Board option for your platform on the Tools menu, select the USB port from the Port menu, and upload uLisp. You should then be able to select Serial Monitor from the Tools menu, and interact with uLisp as described in Using uLisp.

The following pages give specific installation instructions for particular platforms:

一些简单语法

比如循环亮灯,

(defun b ()(pinmode 13 t)(loop(digitalwrite 13 t)(delay 1000)(digitalwrite 13 nil) (delay 1000)))

停住循环,用 "~"

  • Enter a "~" into the Serial Monitor entry field, and press Return.

在ESP32C3里学习一点lisp

用问号查询 

首先可以查询函数和运算符,比如输入:(? assoc)

9216>  (? assoc)
(assoc key list [:test function])
Looks up a key in an association list of (key . value) pairs, using eq or the specified test function,
and returns the matching pair, or nil if no pair is found.
(+ number*)
Adds its arguments together.
If each argument is an integer, and the running total doesn't overflow, the result is an integer,
otherwise a floating-point number.

 驱动LED

在ESP32C3下用analogwrite:(analogwrite 10 128) 失败 ,这句话是点亮10脚的灯,但这是Arduino的。所以analogwrite这句指令不能用。

在ESP32C3下应该用:

(defun blink (&optional x)(pinmode :led-builtin t)(digitalwrite :led-builtin x)(delay 1000)(blink (not x)))(blink())

这个据说是点亮13脚的灯,我这个开发板没有13脚,但是开发板上板载的灯闪了,原来13脚被接了LED灯啊!

闪起来之后交互就卡住了,需要用“~”来中断程序。

调试

ESP32编译报错'dacWrite' was not declared in this scope; did you mean 'i2cWrite'?

C:\Users\Admin\AppData\Local\Temp\.arduinoIDE-unsaved20241112-15076-ocdvvn.kcpg\sketch_dec12e\sketch_dec12e.ino:5345:3: note: in expansion of macro 'analogWrite'
 5345 |   analogWrite(pin, checkinteger(value));
      |   ^~~~~~~~~~~

exit status 1

Compilation error: 'dacWrite' was not declared in this scope; did you mean 'i2cWrite'?

还有这句:

'dacWrite' was not declared in this scope; did you mean 'i2cWrite'?
  213 |   #define analogWrite(x,y) dacWrite((x),(y)) 

看了下,没看明白。但是确实是dacWrite((x),(y)) 没有

引入arduino试试:

#include <Arduino.h>

还是不行。

用ESP32S3板子试试。这个就能编译成功。

倒是找到dacWrite((x),(y))了,在这个文件里:

arduino-esp32/cores/esp32/esp32-hal-dac.h at master · espressif/arduino-esp32 · GitHub

文件内容为:

/** SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD** SPDX-License-Identifier: Apache-2.0*/#include "esp32-hal-dac.h"#if SOC_DAC_SUPPORTED
#include "esp32-hal.h"
#include "esp32-hal-periman.h"
#include "soc/dac_channel.h"
#include "driver/dac_oneshot.h"static bool dacDetachBus(void *bus) {esp_err_t err = dac_oneshot_del_channel((dac_oneshot_handle_t)bus);if (err != ESP_OK) {log_e("dac_oneshot_del_channel failed with error: %d", err);return false;}return true;
}bool __dacWrite(uint8_t pin, uint8_t value) {esp_err_t err = ESP_OK;if (pin != DAC_CHAN0_GPIO_NUM && pin != DAC_CHAN1_GPIO_NUM) {log_e("pin %u is not a DAC pin", pin);return false;  //not dac pin}dac_oneshot_handle_t bus = (dac_oneshot_handle_t)perimanGetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT);if (bus == NULL) {perimanSetBusDeinit(ESP32_BUS_TYPE_DAC_ONESHOT, dacDetachBus);if (!perimanClearPinBus(pin)) {return false;}dac_channel_t channel = (pin == DAC_CHAN0_GPIO_NUM) ? DAC_CHAN_0 : DAC_CHAN_1;dac_oneshot_config_t config = {.chan_id = channel};err = dac_oneshot_new_channel(&config, &bus);if (err != ESP_OK) {log_e("dac_oneshot_new_channel failed with error: %d", err);return false;}if (!perimanSetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT, (void *)bus, -1, channel)) {dacDetachBus((void *)bus);return false;}}err = dac_oneshot_output_voltage(bus, value);if (err != ESP_OK) {log_e("dac_oneshot_output_voltage failed with error: %d", err);return false;}return true;
}bool __dacDisable(uint8_t pin) {if (pin != DAC_CHAN0_GPIO_NUM && pin != DAC_CHAN1_GPIO_NUM) {log_e("pin %u is not a DAC pin", pin);return false;  //not dac pin}void *bus = perimanGetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT);if (bus != NULL) {// will call dacDetachBusreturn perimanClearPinBus(pin);} else {log_e("pin %u is not attached to DAC", pin);}return false;
}extern bool dacWrite(uint8_t pin, uint8_t value) __attribute__((weak, alias("__dacWrite")));
extern bool dacDisable(uint8_t pin) __attribute__((weak, alias("__dacDisable")));#endif

 发现这个文件里arduino-esp32/cores/esp32/esp32-hal.h at master · espressif/arduino-esp32 · GitHub也有这个定义,void analogWrite(uint8_t pin, int value);

这样在Arduino里面是不是不用转义了?

本来想不转义了,于是去看代码,结果看到了这里:

#elif defined(ARDUINO_ADAFRUIT_QTPY_ESP32C3)#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V// Legacy boards ***************************************************************#elif defined(ESP32)                             /* Generic ESP32 board */#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 7000#define LITTLEFS#include <LittleFS.h>#define analogWrite(x,y) dacWrite((x),(y))#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_LX6

根据报错信息,主板没有选对ESP32C3,而是选成了ESP32 ,这就比较搞了...

修改代码,加上

#elif defined(ARDUINO_AIRM2M_CORE_ESP32C3)#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

编译,还是报错,不明白为什么还是没认出板子来?

它就认成esp32了?这不bug了吗?

手工写上:

#elif defined(ESP32)                             /* Generic ESP32 board */#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

编译,终于过了!

显示:

Wrote 1128144 bytes (683960 compressed) at 0x00010000 in 13.9 seconds (effective 649.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

除了这样处理,还可以在文件开始加入一句:

#define AIRM2M_CORE_ESP32C3

后面加入一段

#elif defined(AIRM2M_CORE_ESP32C3)#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

相关文章:

奇怪的知识又增加了:ESP32下的Lisp编程=>ULisp--Lisp for microcontrollers

ESP32下有MicroPython&#xff0c;那么我就在想&#xff0c;有Lisp语言支持吗&#xff1f;答案是果然有&#xff01;有ULisp&#xff0c;专门为MCU设计的Lisp&#xff01; 网址&#xff1a;uLisp - Lisp for microcontrollers 介绍&#xff1a;用于微控制器的 Lisp 适用于 Ar…...

渗透测试之信息收集

免责声明&#xff1a;使用本教程或工具&#xff0c;用户必须遵守所有适用的法律和法规&#xff0c;并且用户应自行承担所有风险和责任。 文章目录 1. 基础信息收集2. 网络资产发现3. 网站和应用信息4. 技术栈识别5. 安全漏洞和配置6. 移动应用分析7.Google语法常见Google使用场…...

基本分页存储管理

一、实验目的 目的&#xff1a;熟悉并掌握基本分页存储管理的思想及其实现方法&#xff0c;熟悉并掌握基本分页存储管理的分配和回收方式。 任务&#xff1a;模拟实现基本分页存储管理方式下内存空间的分配和回收。 二、实验内容 1、实验内容 内存空间的初始化——可以由用户输…...

SQLServer到MySQL的数据高效迁移方案分享

SQL Server数据集成到MySQL的技术案例分享 在企业级数据管理中&#xff0c;跨平台的数据集成是一个常见且关键的任务。本次我们将探讨如何通过轻易云数据集成平台&#xff0c;将巨益OMS系统中的退款单明细表从SQL Server高效、安全地迁移到MySQL数据库中。具体方案名称为“7--…...

软考:工作后再考的性价比分析

引言 在当今的就业市场中&#xff0c;软考&#xff08;软件设计师、系统分析师等资格考试&#xff09;是否值得在校学生花费时间和精力去准备&#xff1f;本文将从多个角度深入分析软考在不同阶段的性价比&#xff0c;帮助大家做出明智的选择。 一、软考的价值与局限性 1.1 …...

shell编程(完结)

shell编程&#xff08;完结&#xff09; 声明&#xff01; 学习视频来自B站up主 ​泷羽sec​​ 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其…...

UNIX数据恢复—UNIX系统常见故障问题和数据恢复方案

UNIX系统常见故障表现&#xff1a; 1、存储结构出错&#xff1b; 2、数据删除&#xff1b; 3、文件系统格式化&#xff1b; 4、其他原因数据丢失。 UNIX系统常见故障解决方案&#xff1a; 1、检测UNIX系统故障涉及的设备是否存在硬件故障&#xff0c;如果存在硬件故障&#xf…...

adb连接逍遥安卓模拟器失败的问题解决方案

1、逍遥安卓模拟器进入系统应用&#xff0c;设置-关于平板电脑-版本号&#xff0c;连续点击3次以上&#xff0c;直到提示进入开发者模式&#xff0c;返回设置界面&#xff0c;进入【开发者选项】-【USB调试】开启&#xff0c;之后重启模拟器再次adb尝试连接。 2、android stud…...

【昇腾】NPU ID:物理ID、逻辑ID、芯片映射关系

起因&#xff1a; https://www.hiascend.com/document/detail/zh/Atlas%20200I%20A2/23.0.0/re/npu/npusmi_013.html npu-smi info -l查询所有NPU设备&#xff1a; [naienotebook-npu-bd130045-55bbffd786-lr6t8 DCNN]$ npu-smi info -lTotal Count : 1NPU…...

Three.js曲线篇 8.管道漫游

目录 创建样条曲线 创建管道 透视相机漫游 完整代码 大家不要被这个“管道漫游”这几个字所蒙骗了&#xff0c;学完后大家就知道这个知识点有多脏了。我也是误入歧途&#xff0c;好奇了一下“管道漫游”。好了&#xff0c;现在就给大家展示一下为啥这个只是点脏了。 我也废话…...

scala基础_数据类型概览

Scala 数据类型 下表列出了 Scala 支持的数据类型&#xff1a; 类型类别数据类型描述Scala标准库中的实际类基本类型Byte8位有符号整数&#xff0c;数值范围为 -128 到 127scala.Byte基本类型Short16位有符号整数&#xff0c;数值范围为 -32768 到 32767scala.Short基本类型I…...

【LeetCode刷题之路】622.设计循环队列

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…...

暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)

前提 之前开自己的GitHub项目&#xff0c;想着不是团队项目&#xff0c;偷懒没有配置eslint&#xff0c;后面发现还是不行。eslint的存在可以帮助我们规范代码格式&#xff0c;同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外&#xff0c;团队使用eslint也是好处颇多…...

Windows系统磁盘与分区之详解(Detailed Explanation of Windows System Disks and Partitions)

Windows系统磁盘与分区知识详解 在日常使用Windows操作系统的过程中,我们常常会接触到磁盘管理,磁盘分区等操作.然而,许多人可能并不完全理解磁盘和分区的运作原理以及如何高效管理它们. 本篇文章将探讨Windows系统中关于磁盘和分区的各种知识,帮助大家更好地理解磁盘以及分区…...

顺序表的使用,对数据的增删改查

主函数&#xff1a; 3.c #include "3.h"//头文件调用 SqlListptr sql_cerate()//创建顺序表函数 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆区申请连续的空间if(NULLptr){printf("创建失败\n");return NULL;//如果没有申请成功&#xff…...

XDMA与FPGA:高效数据传输的艺术

XDMA与FPGA&#xff1a;高效数据传输的艺术 引言 在现代计算系统中&#xff0c;数据传输的效率直接影响系统的整体性能。特别是在涉及到高速数据处理的领域&#xff0c;如高性能计算&#xff08;HPC&#xff09;、实时视频处理和大数据分析等&#xff0c;如何高效地在主机与F…...

#思科模拟器通过服务配置保障无线网络安全Radius

演示拓扑图&#xff1a; 搭建拓扑时要注意&#xff1a; 只能连接它的Ethernet接口&#xff0c;不然会不通 MAC地址绑定 要求 &#xff1a;通过配置MAC地址过滤禁止非内部员工连接WiFi 打开无线路由器GUI界面&#xff0c;点开下图页面&#xff0c;配置路由器无线网络MAC地址过…...

浅谈Python库之pillow

一、pillow的介绍 Pillow是Python Imaging Library (PIL) 的一个分支&#xff0c;它是一个强大的图像处理库&#xff0c;用于打开、操作和保存许多不同图像文件格式。Pillow提供了广泛的文件格式支持、强大的图像处理能力和广泛的文件格式兼容性。它是PIL的一个友好的分支&…...

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了&#xff0c;直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀&#xff0c;比如我定义为 .mp4 下…...

计算机网络从诞生之初到至今的发展历程

前言 "上网"&#xff0c;相信大家对这个动词已经不再陌生&#xff0c;网 通常指的是网络&#xff1b;在 2024 年的今天&#xff0c;网络已经渗透到了每个人的生活中&#xff0c;成为其不可或缺的一部分&#xff1b;你此时此刻在看到我的博客&#xff0c;就是通过网络…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...