江协科技STM32学习- P28 USART串口数据包
🚀write in front🚀
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝💬本系列哔哩哔哩江科大STM32的视频为主以及自己的总结梳理📚
🚀Projeet source code🚀
💾工程代码放在了本人的Gitee仓库:iPickCan (iPickCan) - Gitee.com
引用:
STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili
Keil5 MDK版 下载与安装教程(STM32单片机编程软件)_mdk528-CSDN博客
STM32之Keil5 MDK的安装与下载_keil5下载程序到单片机stm32-CSDN博客
0. 江协科技/江科大-STM32入门教程-各章节详细笔记-查阅传送门-STM32标准库开发_江协科技stm32笔记-CSDN博客
【STM32】江科大STM32学习笔记汇总(已完结)_stm32江科大笔记-CSDN博客
江科大STM32学习笔记(上)_stm32博客-CSDN博客
STM32学习笔记一(基于标准库学习)_电平输出推免-CSDN博客
STM32 MCU学习资源-CSDN博客
stm32学习笔记-作者: Vera工程师养成记
stem32江科大自学笔记-CSDN博客
术语:
英文缩写 | 描述 |
GPIO:General Purpose Input Onuput | 通用输入输出 |
AFIO:Alternate Function Input Output | 复用输入输出 |
AO:Analog Output | 模拟输出 |
DO:Digital Output | 数字输出 |
内部时钟源 CK_INT:Clock Internal | 内部时钟源 |
外部时钟源 ETR:External Trigger | 时钟源 External 触发 |
外部时钟源 ETR:External Trigger mode 1 | 外部时钟源 External 触发 时钟模式1 |
外部时钟源 ETR:External Trigger mode 2 | 外部时钟源 External 触发 时钟模式2 |
外部时钟源 ITRx:Internal Trigger inputs | 外部时钟源,ITRx (Internal trigger inputs)内部触发输入 |
外部时钟源 TIx:exTernal Input pin | 外部时钟源 TIx (external input pin)外部输入引脚 |
CCR:Capture/Comapre Register | 捕获/比较寄存器 |
OC:Output Compare | 输出比较 |
IC:Input Capture | 输入捕获 |
TI1FP1:TI1 Filter Polarity 1 | Extern Input 1 Filter Polarity 1,外部输入1滤波极性1 |
TI1FP2:TI1 Filter Polarity 2 | Extern Input 1 Filter Polarity 2,外部输入1滤波极性2 |
DMA:Direct Memory Access | 直接存储器存取 |
正文:
0. 概述
从 2024/06/12 定下计划开始学习下江协科技STM32课程,接下来将会按照哔站上江协科技STM32的教学视频来学习入门STM32 开发,本文是视频教程 P2 STM32简介一讲的笔记。
本节学习一下串口数据包收发的思路和流程
接下来就来学习一下如何去规定一个合理的数据包格式,以及如何收发数据包。
数据包格式一般有两种:一种是Hex数据包,一种是文本数据包。
先看一下Hex数据包格式。
1.🚢Hex数据包
首先数据包的作用是把一个个单独的数据给打包起来,方便我们进行多字节的数据通信。
我们之前学习了串口的代码,发送一个字节,接收一个字节都没问题。但在实际应用中,我们可能需要把多个字节打包为一个整体进行发送。比如说我们有个陀螺仪传感器,需要用串口发送数据STM32。陀螺仪的数据,比如x轴一个字节,y轴一个字节,z轴一个字节,总共三个数据需要连续不断的发送,当你像这样xyzxyzxyz连续发送的时候,就会出现一个问题,就是接收方不知道这数据哪个对应x,哪个对应y,哪个对应z,因为接收方可能会从任意位置开始接收,所以会出现数据错位的现象。
这时候我们就需要研究一种方式,把这个数据进行分割,把xyzxyzxyzxyz这一批数据分割开,分成xyz,分成一个个数据包。这样再接收的时候就知道了数据包的第一个数据就是x,第二个是y,第三个是z。这就是数据包的任务,就是把属于同一批的数据进行打包和分割,方便接收方进行识别。
有关分割打包的方法可以是自己发挥想象力来设计,只要逻辑行得通就行。比如可以设计在这个xyzxyzxyzxyz数据流中,数据包的第一个数据,也就是x的数据包,它的最高位置1,其余数据包最高位都置0。这样当接收到数据之后,判断一下最高位,如果是1,就是x数据,然后紧跟着的两个数据就分别是y和z,这就是一种可行的分割方法。
这种方法就是把每个数据的最高位当做标志位来进行分割的。实际也有应用的例子,比如UTF8的编码方法和这就是类似的。
但是本节我们主要讲的数据包分割方法,并不是在数据的高位添加标志位这种方式。因为这种方式破坏了原有数据,使用起来比较复杂。
我们串口数据包通常使用的是额外添加包头包尾这种方式。比如这里就列举了两种数据包格式
第一种是固定包长,含包头包尾
第二种是可变包长,含包头包尾
也就是每个数据包的长度可以是不一样的。前面是包头,后面是包尾。
数据包格式可以是用户根据需求自己规定的,也可以是你买个模块别的开发者规定的。
我们这里规定是,比如固定包长,一批数据规定有四个字节,在这四个字节之前加个包头,比如定义0xFF为包头。在四个字节之后加一个包尾,比如定义0xFE为包尾。当接收到0xFF之后就知道一个数据包来了,接着再接收到的四个字节就当做数据包的第一,二、三、四个数据存在一个数组里,最后跟一个包尾。当收到0xFE之后就可以置一个标志位,告诉程序收到了一个数据包。然后新的数据包过来再重复之前的过程。
这样就可以在一个连续不断的数据流中分割出我们想要的数据包来。这就是通过添加包头包尾,实现数据分割打包的思路。
接着我们来研究几个问题。
收发过程中的问题
🐟️🐟️第一个问题就是包头包
这里定义FF为包头FE为包尾,那如果传输的数据本身就是FF和FE怎么办?
这个问题确实存在,如果数据和包头包尾重复可能会引起误判。对应这个问题,我们有如下几种解决方法:
尾和数据载荷重复的问题
第一种方法,限制载荷数据的范围
如果可以的话,我们可以在发送的时候,对数据进行限幅,比如xyz三个数据变化范围都可以是0~100,我们可以在载荷中只发送0~100的数据,这样就不会和包头报尾重复了。
第二种方法,如果无法避免载荷数据和包头包尾重复,就尽量使用固定长度的数据包
这样由于载荷数据是固定的,只要我们通过包头包尾对齐了数据,我们就可以严格知道哪个数据应该是包头包尾,哪个数据应该是载荷数据。在接收载荷数据的时候,我们并不会判断它是否是包头包尾。而在接收包头包尾的时候,我们会判断它是不是确实是包头包尾,用于数据对齐。这样在经过几个数据包的对齐之后,剩下的数据包应该就不会出现问题了。
第三种方法,就是增加包头包尾的数量,并且让它尽量呈现出载荷数据出现不了的状态
比如我们使用FF、FE作为包头,FD、FC作为包尾,这样也可以避免再和数据和包头包尾重复的情况发生。
🐟️🐟️第二个问题是这个包头包尾并不是全部都需要的
比如我们可以只要一个包头,把包尾删掉。这样数据包的格式就是一个包头FF加四个数据,这样也是可以的。当检测到FF开始接收,收够四个字节后置标志位,一个数据包接收完成,这样也可以。不过这样的话,载荷和包头重复的问题会更严重一些。
比如最严重的情况下,载荷全是FF,包头也是FF,那肯定不知道哪个是包头了。而加上FE作为包尾,无论数据怎么变化,都是可以分辨出包头包尾的。
🐟️🐟️第三个问题就是固定包长和可变包长的选择问题
对应hex数据包来说,如果载荷会出现和包头包尾重复的情况,就最好选择固定包长,这样可以避免接收错误。如果你又会重复又选择可变包长,数据很容易就乱套了。
如果载荷不会和包头包尾重复,可以选择可变包长数据长度,像这样四位、三位、一位、十位、来回任一变,肯定都没问题。因为包头包尾是唯一的,只要出现包头就开始数据包,只要出现包尾就结束数据包,这样就非常灵活。
这就是固定包长和可变包长选择的问题。
🐟️🐟️第四个问题就是各种数据转换为字节流的问题
这里数据包都是一个字节一个字节组成的,如果想发送十六位的整形数据,三十二位的整形数据,float double,甚至是结构体,其实都没问题。因为它们内部其实都是由一个字节一个字节组成的,只需要用一个uint8_t的指针指向它,把它们当做一个字节数组发送就行了。
接下来看一下文本数据包。
2.🚢文本数据包
文本数据包和Hex数据包就分别对应了文本模式和Hex这两种模式。在Hex数据包里面,数据都是以原始的字节数据本身呈现的。而在文本数据包里面,每个字节就经过了一层编码和译码,最终表现出来的就是文本格式。但实际上每个文本字符背后,其实都还是一个字节的hex数据。
同样文本数据包也可以有两种模式:
第一种是固定包长,含包头包尾
第二种是可变包长,含包头包尾
由于数据译码成了字符形式,这就会存在大量的字符可以作为包头包尾,可以有效避免载荷和包头包尾重复的问题。比如我这里规定的就是以@这个字符作为包头,以’\r’’\n’,也就是换行这两个字符作为包尾。
在载荷数据中间,可以出现除了包头包尾的任意字符,这很容易做到。所以文本数据包基本不用担心载荷和包头包尾重复的问题,使用非常灵活。可变包长、各种字母、符号、数字都可以随意使用。
当我们接收到载荷数据之后,得到的就是一个字符串,在软件中再对字符串进行操作和判断。就可以实现各种指令控制的功能了,而且字符串数据包表达的意义很明显,可以把字符串数据包直接打印到串口助手上,什么指令、什么数据一眼就能看明白。所以这个文本数据包通常会以换行作为包尾。这样在打印的时候就可以一行一行的显示了非常方便。
3.🚢Hex数据包和文本数据包的优缺点
Hex数据包和文本数据包这两种对比下来其实也各有优缺点。
hex数据包
优点是传输最直接解析数据非常简单,比较适合一些模块发送原始的数据。比如一些使用串口通信的陀螺仪,温湿度传感器,
缺点就是灵活性不足,载荷容易和包头包尾重复。
文本数据包
优点是数据直观易理解,非常灵活,比较适合一些输入指令,进行人机交互的场合。比如蓝牙模块常用的AT指令,CNC和3D打印机常用的G代码都是文本数据包的格式。
缺点就是解析效率低,比如发送一个数100,hex数据包,就是一个字节100完事儿,文本数据包就得是三个字节的字符,’1’’0’’0’,收到之后,还要把字符转换成数据才能得到一百。
所以说我们需要根据实际场景来选择和设计数据包格式。
接下来我们就来学一下数据包的收发流程。
4.🚢数据包的收发流程
首先是数据包的发送,这个比较简单。
发送数据包
如果想发送一个数据包,就定义一个数组填充数据,然后用上节我们写过的SendArray函数一发就完事了,文本数据包这里也很简单,写一个字符串,然后调用SendString一发送也完事了。
所以说发送这个数据包是很简单的,因为发送过程是完全自主可控的,想发啥就发啥,我们写代码的时候也能感受到串口发送比接收简单多了。
接下来接收一个数据包就比较复杂了。
接收数据包
这里演示了固定包长hex数据包的接收方法和可变包长文本数据包的接收方法,其他的数据包也都可以套用这个形式。下节写程序就会根据这里面的流程来。
HEX数据包接收
我们先看一下如何来接收这个固定包长的hex数据包。
首先根据之前的代码,我们知道每收到一个字节程序都会进一步中断。在中断函数里,我们可以拿到这一个字节,但拿到之后我们就得退出中断了。所以每拿到一个数据都是一个独立的过程。而对于数据包来说很明显,它具有前后关联性。包头之后是数据,数据之后是包尾。对于包头、数据和包尾这三种状态,我们都需要有不同的处理逻辑。所以在程序中,我们需要设计一个能记住不同状态的机制。
在不同状态执行不同的操作,同时还要进行状态的合理转移。这种程序设计思维就叫做‘状态机’。在这里我们就使用状态机的方法来接收一个数据包,要想设计一个好的状态机程序画一个这样的状态,转移图是必要的。
对于上面这样一个固定包长hex数据包来说,我们可以定义三个状态,第一个状态是等待包头、第二个状态是接收数据、第三个状态是等待包尾,每个状态需要用一个变量来标志一下。比如这里用变量s来标志。三个状态依次为s等于0,s等于1,s等于2。这一点类似于置标志位,只不过标志位只有零和一,而状态机是多标志位状态的一种方式。
然后执行流程是最开始s等于0收到一个数据进中断,根据s等于0进入第一个状态的程序,判断数据是不是包头FF,如果是FF则代表收到包头,之后置s等于1,退出中断结束。这样下次再进中断,根据s等于1就可以进行接收数据的程序了。
在第一个状态,如果收到的不是FF就证明数据包没有对齐,我们应该等待数据包包头的出现。这时状态就仍然是0,下次进中断,就还是判断包头的逻辑,直到出现FF才能转到下一个状态。
之后出现了FF,我们就可以转移到接收数据的状态了。这时再收到数据,我们就直接把它存在数组中。另外再用一个变量记录收纳多少个数据,如果没收够四个数据,就一直是接收状态。如果收够了,就置s等于2,下次进入中断时就可以进入下一个状态了。
最后一个状态就是等待包尾了。判断数据是不是FE,正常情况应该是FE,这样就可以置s等于0,回到最初的状态,开始下一个轮回。当然也有可能这个数据不是FE,比如数据和包头重复,导致包头位置判断错了,这个包尾位置就有可能不是FE,这时就可以进入重复等待包尾的状态,直到接收到真正的包尾。这样加入包尾的判断,更能预防因数据和包头重复造成的错误。这就是使用状态机接收数据包的思路。
这个状态机其实是一种很广泛的编程思路,在很多地方都可以用到。使用的基本步骤是先根据项目要求定义状态画几个圈,然后考虑好各个状态,在什么情况下会进行转移,如何转移,画好线和转移条件,最后根据这个图来进行编程,这样思维就会非常清晰了。比如你要做个菜单,就可以用到状态机的思维,按什么键切换,什么菜单,执行什么样的程序。还有一些芯片内部逻辑也会用到状态机,比如芯片什么情况下进入待机状态,什么情况下进入工作状态,这也是状态机的应用。希望大家可以研究一下,对你的编程肯定会有帮助。
接下来继续我们来看一下这个可变包长文本数据包的接收流程。
文本数据包接收
同样也是利用状态机定义三个状态。第一个状态,等待包头,判断收到的是不是我们规定的@符号,如果是就进入接收状态,在这个状态下依次接收数据。同时,这个状态还应该要兼具等待包尾的功能,因为这是可变包长,我们接收数据的时候,也要时刻监视,是不是收到包尾了,一旦收到包尾了就结束。这个状态的逻辑就应该是收到一个数据判断是不是’\r’,如果不是则正常接收,如果是则不接受,同时跳到下一个状态,等待包尾’\n’,因为这里数据包有两个包尾’\r’’\n’,所以需要第三个状态。如果只有一个包尾,在出现包尾之后,就可以直接回到初始状态了,只需要两个状态就行。因为接收数据和等待包尾需要在一个状态里同时进行。
由于串口的包头包尾不会出现在数据中,所以基本不会出现数据错位的现象。这就是使用状态机接收文本数据包的方法。
下节我们就写程序验证一下以上所学的内容。
相关文章:

江协科技STM32学习- P28 USART串口数据包
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...

Linux脚本循环(for、while、until)
文章目录 for基础风格for列表风格for与seq组合for与大括号for循环处理脚本参数组合命令while基础while数字累加utilcontinue for基础风格 这种风格最像高级程序中的for循环 #!/bin/bashfor(( i0; i<10; i )) doecho "第$i次for循环" donefor列表风格 #!/bin/ba…...
文件系统上云的挑战
优质博文:IT-BLOG-CN 一、挑战/注意事项 【1】因文件系统HDFS没有关联信息OrderId等,不能对存量数据进行有策略的同步,因此目前是将所有的文件同步至云服务器SIN; 【2】海外数据和国内数据上传到各自的文件服务器后,…...

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十一章 制作Ubuntu文件系统
iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…...

中间件漏洞总结
参考:Tomcat漏洞详解-CSDN博客 tomcat 历史漏洞 阿里云漏洞库 (aliyun.com) 弱口令和war远程部署漏洞 弱口令 Tomcat8.* 登录页面:/manager/html 弱口令:tomcat/tomcat 后台Getshell 登录到后台后可以通过部署 war 包进行 getshell wa…...
PySpark Yarn集群模式
目录 简介 一、PySpark简介 二、YARN模式概述 三、配置环境 1. 安装与配置Spark 2. 配置Hadoop和YARN 3. 启动yarn 四、编写PySpark脚本 五、提交PySpark作业到YARN 参数解释: 六、常见问题及解决 七、总结 简介 随着大数据的普及,Spark作为…...
Matlab基于经纬度点并行提取指定日期的tiff栅格位置的值
文章目录 前言一、基本说明二、代码 前言 该 MATLAB 代码用于从 GeoTIFF 文件中提取基于特定地理位置(经纬度)和日期的某个点的相关数据。代码首先读取一个包含事件数据(日期、经纬度)的 Excel 文件,然后根据日期和位…...
npm入门教程19:npm包管理
一、代码更新 遵循语义化版本控制: 在更新包时,应遵循语义化版本控制(Semantic Versioning,简称SemVer)规范。这意味着版本号的变更应反映代码变更的程度,通常遵循主版本号.次版本号.修订号的格式。主版本号…...

【NOIP提高组】虫食算
【NOIP提高组】虫食算 C语言C 💐The Begin💐点点关注,收藏不迷路💐 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: 43#98…...

软件测试面试题个人总结
前面看到了一些面试题,总感觉会用得到,但是看一遍又记不住,所以我把面试题都整合在一起,都是来自各路大佬的分享,为了方便以后自己需要的时候刷一刷,不用再到处找题,今天把自己整理的这些面试题…...

HTML 语法规范——代码注释、缩进与格式、标签与属性、字符编码等
文章目录 一、代码注释1.1 使用注释的主要目的1.2 使用建议二、标签的使用2.1 开始标签和结束标签2.2 自闭合标签2.3 标签的嵌套2.4 标签的有效性三、属性四、缩进与格式4.1 一致的缩进4.2 元素单独占用一行4.3 嵌套元素的缩进4.4 避免冗长的行五、字符编码六、小结在开发 HTML…...

【Wi-Fi】WiFi中QAM及16-QAM、64-QAM、512-QAM、1024-QAM、2048-QAM、4096-QAM整理
参考链接 什么是QAM?QAM是如何工作的? - 华为 不同阶QAM调制星座图中,符号能量的归一化计算原理 - 知乎 16 QAM modulation vs 64 QAM modulation vs 256 QAM modulation 512 QAM vs 1024 QAM vs 2048 QAM vs 4096 QAM modulation type…...

红黑树的平衡之舞:数据结构中的优雅艺术
文章目录 前言🚀一、红黑树的介绍1.1 红黑树的概念1.2 红黑树的特点1.3 红黑树的性质 🚀二、红黑树结点的定义🚀三、红黑树的框架🚀四、旋转操作🚀五、红黑树的插入操作5.1 uncle结点存在且为红5.2 uncle结点不存在或者…...

angular实现list列表和翻页效果
说明:angular实现list列表和翻页效果 上一页 当前页面 下一页 效果图: step1: E:\projectgood\ajnine\untitled4\src\app\car\car.component.css .example-form-fields {display: flex;align-items: flex-start; }mat-list-item{background: antiquew…...

闯关leetcode——3285. Find Indices of Stable Mountains
大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-indices-of-stable-mountains/description/ 内容 There are n mountains in a row, and each mountain has a height. You are given an integer array height where height[i] represents t…...

算法【Java】—— 动态规划之斐波那契数列模型
动态规划 动态规划的思路一共有五个步骤: 状态表示:由经验和题目要求得出,这个确实有点抽象,下面的题目会带大家慢慢感受状态标识状态转移方程初始化:避免越界访问 dp 表,所以在进行填表之前我们要预先填…...

idea连接docker并构建镜像
安装docker 安装docker idea连接docker 安装docker插件 设置docker连接 设置docker.exe 这个docker.exe是为了运行docker,可以通过安装docker desktop获取 docker desktop下载地址 右键图标找到文件位置 在同级的resource中 编写Dockerfile # 使用官方 Nginx…...

百度如何打造AI原生研发新范式?
👉点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日,2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家,优秀的工程师和产品经理,以及其它行…...

RedisTemplate类中的常用方法粗解(简单明了,预计5分钟看完)
在阅读项目代码过程中发现引用RedisTemplate 的方法操作redis时,都会有一些特定的ops ,对此好奇就查资料的情况下有了本博客。 操作之前付一张我们项目中的用到的地方的图 另外本文中的语言用到的是Java,附上试验用到的redisTemplete依赖 <…...

鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)
在鸿蒙ArkTS中,布局容器组件有很多,常见的有: ⑴ Column:(垂直布局容器):用于将子组件垂直排列。 ⑵ Row:(水平布局容器):用于将子组件水…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...