粉丝233获赞1.3万


哈喽,大家好,我是你们的好朋友老王,今天给大家分享最全的串口通讯风包, 然后内容的话啊分四块,其实我这边主要是想讲我做的一个 u r t p 的 这个啊原码的,但是呢为了让这个内容啊看起来啊衔接的过程中比较丝滑,我这边啊啊补充了零一二三这几个 几个啊部分的内容啊,对于串口使用啊,有已经有相当经验的人其实可以直接去啊跳过零一二三,直接看我视频最后面的这个关于啊原 u r t p 这个原码的一个一个讲解。 好,那我们这个啊,我们先看一下啊,这边就快速过一下啊,为什么要封包?那本质就是说串口的话, 他这边的话,因为他是以这个字节流的形式吗?原始的话是字节流,相当于是一个啊水流,一个字节,两个字节,那这边的话如果说不封包的话,其实你都不知道哪一个是第一个字节, 然后为什么要封包的啊?啊?更多原因啊,数据完整性较严啊,应用层,应用层和传输层结偶协议的可扩展性,传输效率, 我这边就快速的过了一下,这边的话如果感兴趣的话可以暂停,自己去看一下,然后三大核心问题,边界问题、顺序问题,完整性问题, 然后呃应用层传输结藕啊,那这边的话就呃稍微重点讲一下,那其实我做的这个模块其实就属于这个传输层 u r t p transport, 那 这边的话就相当于是这边是应用层,这边是底层的物理层,那应用层比方说想发这个,呃一二三四这个应用 四个这个应用数据,那他应用的话直接去发,然后把这个把这个 四个数据直接往这边去丢。那其他这边封包啊,这个完整性他其实都不管,都放在传输层做。那传输层的话,呃,打包好之后,然后的话去发到这个物理层上,那其实肯定他发的不只是原始四个字,也他会发一些 crcr 以及 以及这个头可选的可能存在的头或者尾,那反过来那底层收到收到串口,那收到的串口那肯定也是一个一个的字节流嘛。那这边的话就有这个传输层,他自己去去把这一包书收到的这个字节流去解析,然后 解析,如果如果通过了,他认为是一包叫验通过的这个数据包,他就把这个数据包直接再给应用,那这样的话就实现了这个这个解偶 我做的话就是这一块,然后的话,呃,第二,第二就是这个分包方式的选择,那分包方式的话就分为这个啊,定场分包 不定长分吗?那定长的话那就是固定的,比方说每次发比较比较典型的行。有的人,呃在网上有时候能看到吗?比方说每次就只能发,比方说十六个字节, 那头比方固定的,比方说是 a 五,然后尾比方说也是一个 f, 每次都发固定的长度,那那这就是一个定长分吗?那这个缺陷他也有的吗?那这个就是不灵活吗?包括一些效率,还有一个就不定长分吗?那我这边做的这个 u r t p 模块,主要是这个 基于啊不定糖分猫或者说不定糖分猫其实是是包含定糖分猫的,因为这个他可以去去根据这个应用每次发的一包数据去自己去去去去定糖分,根据这个不定糖分嘛, 那两种分猫的方式的对比,这边的话快速快速过,想看的话自己截图, 然后定塘封封包的局限性,然后这边的话封包的过程呢?还有一个啊示意图,这边其实非常基础,这边的话直接过,然后不定塘封不定塘封包的一些这个啊结构, 比方说针头啊,长度啊,数据载荷,胶原码啊,这个针尾,这边一一个常规的典型的一般的做法。然后呢这边的话是讲到一个数据格式, 数据格式是什么意思?那我们这边看一下我这边做的吃的这几种模式,基本上把这种都做全了。第一种 row x row row hex 就 最简单的,那比方说发连 x 一 压,那就是这个一压三四,就是三四,那这个的优优势和特点 row hex, 然后的话是 ask hex, ask hex 是 什么意思?那就是它就是把把这个每每这个 每个这个字节转化成两个 ask 字母,那比方说他想发发这个 一二,那其实就应该要发一对应的这个原始的这个 hex, 其实是应该是零 x 三幺二,就是零 x 三幺,其实要发两个字节他才能转化成这个真正的幺二,那这也是他的一个特点。还有这个转 e, 那一转移的话就相当于是比方说使用一个特定的一个字母当做这个头,那一旦,那,那一旦数据中如果说出现出现这个和头相符的呢?那么的话在传输过程他要给他转移掉, 说白了就是说在传输过程中,头和尾这两个东西在数据中间是不允许出现的,如果真要出现那个数据,那就要通过转移去 去解解决掉,那这是他特点。还有一个就是这个纯这个 ask 码,那这个的就是说想仅用于这种话,就比较典型的就是说一些这种啊 jason 的 这种格式的,一个 阶梯的一个格式的,这个啊去交互,那这边传的话都是一些啊阿斯科马,然后,呃,那这边的话一些场景的选择啊,你这边后面我会讲然后的话,啊啊源码实战,那这边的话 这个这个的简介,然后的话界面已经啊讲了,然后这边的话这个我已经传到这 git 上面,然后的话我们直接去看原码。啊,那这边的话我给传到了这个啊 git git 上面去,然后我们看一下啊,这边的话一个简介是,呃是,就是说这是 rox 阿阿斯格玛,然后加带头尾的 在转意的,总有一款满足你设计的目标,支持任意长度,查人自自恢复,说白了这个其实相当于是他的鲁邦性了,传输效率高,然后解析简单可靠。那看这哈看一下我这边支持的类型, 第一种基于时间间隔,那这边的话,那这个其实是一个 raw hex 的, 那它的这个特点,那它这个这个,呃是没有,没有头,没有尾,它这个标记,它其实是靠这个 数据和数据之间的间隔,那这个典型的应用其实就是这个 modbus 的 r t u, 其实就是这个就是基于这种类型,就是说 modbus r t u 的 话,它是其实它的间隔是三点五个字母吗?三点五个字字母,然后的话就是 r、 n、 t, 然后,然后 e a, e a 的 话,它的编码方式是绕绕 hex, 它的这个头标记这个,然后这个这个尾 b 啊,我这边头尾的话都是支持自定义的,都是自行是自定义,我这边的话只是一个展示这边头尾, 然后的话有长度字段,然后的话 c r c, c, r c 都是用的十六,然后 e a, a, a 和 a 和 b 的 特点其实就相当于是这个 a 都是带头带尾,相当于它的这个呃鲁棒性会更强,然后呃 b 的 话其实是相当于是没有尾的,这个去做的话,它俩的特点就是说呃,你对这个数据要不要去呃,让它去严苛的检查?就是防止。比方说,有时候, 有时候,比方说,比方说我们拿这种方式来说, a a 来说,它在传输过程,比方说它这个长度, 长度,比方说明明是,比方说是十,由于这个传输过程中被干扰了,结果他变成了八,那意味着数据就会被提前截断,而且刚好刚好八截断的那个位置,哎, 通过一算 crc 也刚好也也匹配到了,那么这样的话其实就是会有有呃,一定概率上,比方说这个由于这个认错,认错了导致这个 crc 凑上,然后导致这个数据啊被被那个了,那我们通过加加这个 加这个尾呢,那就意味着他还得去看那个尾,说白就是增加了一种这种极端情况下,可能呢,可能被这个啊误误误这个认为他是一包正确的这个,那这样的话他其实 说白了就是说任任何东西,就是说啊,怎么说呢?没有六边形战士,他任何的话都是啊,有有这个我们要学会去取取舍,那这边的话他的他的牺牲呢?就是说会会会增加一个额外的这个伪标记, 这这是一个字节,主要也不是一个字节,主要是取决于你这边定义的,你如果说定义一百个字节,那它的尾长度就是一百个字节,那那这样的话就相当于是它会有导致传输效率会稍微低一点嘛。那 e b 的 话其实就相当于是没有尾的,那这个 e e b 是 这样的,那我们再看一下 啊。第二种,第二种的话是这个是基于这个是基于这个转移的,它的头头尾都是固定的奇异, 然后呢的话 r d 的 话就相当于是没有头直接有尾,那同样,那第三的话,三种的话是需这个需 ask 的, ask 的 话,他这边的话就是说啊,仅能仅能传 ask, 那 这边的话再去选择这个头尾的话就要去注意了。那如果说我传的是 ask 吗?那就要保证我传的这个啊,我选择的这个头尾一定不能是这个 和一定不能是这个 ask, 这个中间中间的数据它和这个头尾撞上去,那其实零二零三在这个阿斯玛标里面,它其实是两个不可见字母,一个是一个是这个 start, 就是 一个真标准的一个 start 头一个尾,按这个的话其实都是可以自定义的代码中,到时候自己去改,那这边的话,三的话就相当于是没有头只有尾, 那推送的话,它这个阿斯卡的话,它的 crc 十六就变成了这个四个其实是是 azk, 这样的话我就可以改成这样的话,就是说方便在串口调试上去发这些数据,让这些阿斯卡马它都能去可见。 然后第四种的话呢,就是说这种属于 azk, azk 的 话,它这边的话啊,就是说这个头可以选这个,尾可以选这个,那它这边传输的话就就只能是这个, 可能是这个,呃,零到零到九, a 到 f 的 一个阿斯克字母,它各有各的特点,下面的话有去去解释 crc 十六和另统一为小端,除了 r 和 b 类型,所有的头尾长度都是可以自定义的, 下面是详细的一些解释啊,基于时间间隔,基于时间间隔特点,然后我这边点典型的应用就是 motbus r t u 嘛,那我这边做了一个这个,呃,这个 可以通过的这个数据,这个原始数据是一二三四五六七八,然后后面附了他的这个 crc, 大家在用这个代码时候一直检查自己一直有没有出错的话,就可以通过去把对对这个协议去发这个数据, 发这一包数据,那么他其实应该就能正确的解析出来。一包是一二三四五六七八。那这个是第一种与时间间隔, 那这个是 e a e b 啊,有头有尾带长度的,这种的话用用的应该是应该是用的是非常广泛,用的是非常广非常广泛,这种的话之前我见过很多这种啊, 网上都是有人都有人基本上都是这种,只是说头尾取的可能有些是什么 a a 五五,有的是五五 a a, 那 这边的话就是这个 e a 有 头有尾的,那这个的特点 就是说在串口通信自定义协议中是用的,是啊,最广泛的,最广泛的还有这个,是啊 i, 那 基于转移,那转移的话就是 是这样的,头是七亿,尾是七亿,那数据那数据中间的话是转移的规则是如果说数据中有有真正的应用,数据就是七亿,那么的话他会按七 d 零二去发,那如果说数据中要有这个七 d 呢?那他一定是七 d 零,一定要发。 这种的典型的应用是在这个 t g 这个呃 j t 八零八这里面,那它这里面只是说它这里面的这个 crc, 或者说它的胶液是用的 x o r 胶液啊,我这里面统一都给它改成 cr c 十六了,那这个的话 相当于 c r c 十六,我觉得这个呃胶烟呢,这个强度会更强一点啊,这个是它的一个特点的一个说明,然后的话这个三 a, 呃,三三三 a 的 话,这边三 a 三 b 的 话,这边的话就是这个啊,这个阿斯纯阿斯个传的。那, 那,那这边的话,呃,比方说我,呃我这边,我这边的话,当然了这个 c r c 也有,也也有要求,这个 c r c 的 话一定是这个 ask, 这样的话就是为了方便窗口,窗口有时候看的话,其实这个也都是可见字符了。然后的话这边的话还举了一个典型的这个数据,那其实我原始的话发的是这个, 发的是这个 hello world, 那 这边的话最终转成这个,呃 hex 的 话,那其实就是这一段数据就是零二零三,零二零三的头,这个都可以自定义改了。然后的话这一种的话就是这个 纯纯 ask, 纯 ask hex, 那 这边的话,呃,特点的话 头是这个,然后尾是这个都是可以自定义的。然后这边的话,比方说原是想发零 x 零零幺幺,那那最终发的话,其实这边是两个数据,到这边其实就变成了 四四个四个数据了,那零对应的话是六进的,原始的 rox 是 零 x 三零零,字母一的话是零 x 三一,那就是说三零三零三幺三幺,那其实就是四个。那这边的这个特点,是啊,仅能传出偶数过这个 能传出偶偶数过这个啊?零到九,这不是 a 到 z, 这边打错了,是 a 到 f, 然后字节必须为这个字节的个数必须为这个偶数,那其实就是必须两个字母嘛。 然后典型的应用编程,这个的话就是说,呃,我之前用过这个,这个 三零的 f x 系列的那个 plc, 它里面其实就是用的类似于这种,只是说它这边的话是零二是开始,然后零三结束。它的这个艾特萨摩,它是用的萨摩,萨摩切克。那它这边的传输的话,当时汉口其实配的是这个七比特, 因为它相当于是用一个一个字节去描述一个字体呢,其实用它用七比特传输的话,它这个效率会更高一点。就是这个我之前用过的这个我 典型的一个应用,那这边比方说要想发这个的话,那这边都是阿阿阿斯个码了,那这边的话就是就一二三四五六七八这两个是这个较验 c c 十六算法,然后内部的一些错误技术去方便这个呃 bug 去或者说去去评估这个通讯质量。 下面呢是一些啊应用,应用建议选择,那这边的话一个软件加高的图,这边应用前面 ppt 可能也讲过了啊应用的话,然后这是这个有模块 u r t p, 然后串口,然后这边的话是框架图, 那这边应用层去想发数据包的话,由这边去自己想发,比方说一二三四到打发到这边这个 u r 的 t p 层的话去给它去呃组包,组包完然后往硬件窗口调,那反之硬件每收到一个字节字节,它会往这里面它会自己解析,解析完组成一包,然后通呃回给应用。 好,那这个是一个这个模块的一个内部图,内部的图它需要呃依赖的啊,绿色的话是这个呃串口提供的一些接口,这边的话我这边主要其实大部分用的是一些这种回调,回调, 然后的话一个典型的应用,然后内部的话用了一些,用了一些这种啊双接收,双接收,这个双缓存,接收双缓存,这个效率比较高。然后下面呢是一些配置,配置 啊,配置的话,这边的话啊快速的过一下吧,快速的过一下吧,那这边的话对于每一个实力的话,他需要啊可以配置这些类型,这个这边的话每局上面是有的,这个是基于时间间隔的,那就是其实就是我们我们这上面的几种类型, 然后的话这边是串口 m c、 r d, 这是接收,就是就是这个 串口,这个串口的这个中断中断 buff, 中断接收的 buff, 然后这边的话是这个接收针的一个 buff, 这边是一个发送针的一个 buff, 那 这边对应的话有一些超时啊, 这边注视里面代码里面注视写的还是比较比较那个的,然后想去用的话就啊直接去调就好了,然后这边使用也说了,这个先调不说话,内部会注册这个慢,然后 发送。那这边的话直接看,直接看这个,看这个这个代码好了, 看看代码好了,那其实看一个模块的话,其实直接先看这个。呃点 h 我 这边的话用用 vs code 打开好了 啊,这边第一个是这个 ur 的 tp initial, 然后然后这个是 ur 的 tp, 前面看过了,看过这个我的那之前分享的那个呃 q 代码框架,那这边的话, 呃那这边的话,这边的话是一个慢,然后的话这边是呃这这两组其其实呃一组就是发送的时候它需要先去掉这个去获取这个 buff, 其实可以理解,申请这个 buff, 申请完的话可以调这个同步发送, 同步发送就意味着是堵塞的,他内部必须发完你这个函数才会返回。那异步的话,那其实就相当于是你这边直接把这个这个接口一调,其实就退出了他内部异步发的,那这个接口的话就相当于是 相当于是这个你可以可以离眼,这个就直接放到终端里面就好了,每收到一个数据调这个接口就好了,每收到这个数据调这个接口就好,那这边是他的这个模块的这个应用接口, 应用接口,然后的话我们看一下这个去想去用的话,我这边做了一个 demo, 想去用怎么去用?那这边的话, 那这边就是刚才那上面说的这个直接调这个函数,那这个函数内部会首先会会组织这些配置结构体,那这个的话其实就是我之前说过的,我之前分享的那个 q 代码框架,就不做过多的解释了。那这边他需要提供一些这种串口的一些接口, 那获取即可的啊畅口出石化啊,畅口发送到这边发送的话,他可以是同步发送,也可以是异步发送,如果是同步的话,那就直接调这个,如果是异步的发发送的话,那么的话,他再去查这个有没有发完, 他也会调这个函数,那就意味着你如果说是同步的话,你从想用同步的话,那就只需要给这个函数注册就好了。如果说是异步的话,那你除了提供一个发送函数,还要提供一个发送爬碗爬忙的一个函数。 一层串口需要提供的,那这边的话就相当于是直接调这个数化,把这个配置结构器给它传进去 u r t p 卡这个,然后的话 周期的把它的这个慢慢函数处理函数给它挂上去。我这边挂的是一个这个零毫秒的一个周期,其实就相当于啊频率比较快,因为这个这个这个 尤其像你用低于这种低于这种时间间隔的话,你对这个时间要求比较严,所以我就周期就是这个非常快的一个周期, 那那这边的话就是它的一个啊,呃,出手画,那出手画其实就直接调这个结构好了,然后的话那这边的话就直接那个 直接,大家到时候如果想用的话,就直接按照我这上面配就好了。那这边它和应用之间的结构是怎样的?那这边的话 我没看我这个是支持多实力的,那如果说我可以同时,比方说这一路串口是基于时间间隔的,另一路串口是基于于 e a 或 e b 的, 那这个都是可以的,那就多多个配就好了。那对于这个的话,每一个这个的话, 我们想去配的话,就相当于是,呃需要注册一个他收到一包完整的数据帧,他通知的一个回调,那我这边的话,比方说是这个,呃应用,比方说基于这个 ip, 那我这边就注册这个函数,我这边待会给大家演示,我这边就直接注册了一个这个函数,那这个函数是在这边实现,那这个函数干了什么呢?相当于是一个 echo 测试,搜到搜到你这边一包数据,那我就直接呃给他发出去,同时把再发出去的时候会把这个 一个字节让它加加上,待会儿能看出来,那这个发的话就这样。哎。申请这个 buff, 那 这个 size, 就是 收到了 size, 然后把这个申请完之后,然后把这个收到的数据直接往这里靠,然后然后再把这个数据一加加, 让它发生一点点变化,不然的话,那就待会可能看不是很好看,就调这个 so 就 发送了 啊,里面比较简单,然后这里面具体每一个字段的详细含义,其实其实只要我们跳,跳到这边这边的话,呃, 里面注视的话,我觉得还是比较小,比较比较详细的,那有些东西其实其实啊没有注视的话,其实应该一看就能看懂,这就接受真的 buff, 接受真的 buff size, 那 这个东西的一些取值, 呃取值的大小就是说取决于你实际应用中我发送最大的针是多少,是比方说一百个字节,五百个字节子,呃两 k, 那 就根据你实际的需求需求就好了。那这个的话就是说啊,如果说你实际 啊资源比较大,那你就可以开的很大,但有些单片机的资源其实没那么大,那这个的话还是要根据实际触发的数据真的大小去去配置啊。除此之外还有一个需要特别注意的,就是啊,这边的话,对于这个, 对于这个 r a r b 四 a 四 b 这种数据类型,呃,这种这个协议是需要 我们看一下,直接看一下这个表,四 a 四 b, 注意看 r a r b 是 转译,四 s b 是, 呃,四 s b 是 基于这个 ask, 那 这边的话就相当于是它需要一个,因为它解析转译的时候,比方说 它发了一包应用数据,里面如果没有歧义,那这边的话就是实际用,呃那个 frame buff 其实就够了,但是如果说它发了大量的歧义, 大数据中有大量的七亿,那么就要去转移,那转移的话就是一个七亿的话会变成两个字节,那就导致这个啊 buff 会变得比较大,所以需要额外的去开一个 buff, 需要额外的开一个 buff, 那 总之那这个 buff 的 话就相当于我这边放了一个静态的数值,那这边的话就是说取决于 比如你实际这个呃就会不会用到 r a r b 这种方式,如果用的话你就配,如果不用的话你就不配,也可以的,可以的,那这边的话就呃讲完了,然后的话最后再呃再讲一下这个, 这里面头头的话我就暂时就没有给放出来,直接在呃在里面听一听一点 static。 哎,这测的参数我的理解它其实 改的不是那么频繁,如果说大家需要想改的话,我这边为了让这个呃那个我是每一种类型我给他定义一个这个,有的话就有比如说对于 e a 的 话,那这个 e a 的 头, e a 的 头, e a 的 尾, 然后的话 e b e b 的 这个 e b 的 头,因为 e b 是 没有尾,那这边有的话我就直接在这边定义了,他这个是因为定义的是一个这个数值,其实可以一次定义的,你根据实际的需求,你可以很多数据都行,我这边内部是自己自己根据这个长度计算的,如果想改的话,大家在这边改就好了 啊,代码的话就大概就讲这个了,这个说呃感兴趣的话可以看一下原码,如果不感兴趣的话只是拿过来用,我觉得我这些讲的应该就够了,因为会用会用就可以了。然后最后的话我实际给大家去啊演示一下 啊,我这边演示的平台是用的这个 t i 的 这个 d s p 啊 t m s 三二零 f 二八三七七 s 是 用了一款这个单核的这个。然后这边的话演示的代码的话其实就前面讲过了,那这边就是说我目前我先用这个一给大家用这个基于时间间隔给大家演示一下,那基于时间间隔的话,那这边超时时间是三,也就是说数据和字节和字节之间的间隔超过三毫秒, 三毫秒,那这边的话他就会掐断去去认为是一一根数据,是一根数据的话,那这边他就会去组这个调研,调研通过的话他就会缩到一毛,数据的话他就会通知他的回调,那调他的这调他这个回调,那这个回调我现在注册的是这个 iq 测试收啥,然后发啥, 然后的话我们这边打开一个啊串口测试收啥,然后发啥,然后的话我们这边啊打开一个啊串口测试收啥,然后的话 打开,然后的话那我这边做了一些快捷快,快捷键,一二三四五六七八,我直接去发。哎,这边是发的,我发的这个数据,他这边收到之后,他会其实其实在这边这个回调里面,他其实这个 size 其实长度是四个, 是一二三四五六七八。那我们在串股这边抓的话,其实因为这个是底层的一个抓的嘛,他会把这个 crc 也会提升在上面。 他这边他回的话之前是一二,他这边会把第输到数据的第零个加加,那就是一三一三三四五六七八。那这边 c r c 他 自动算,那这边是基于时间间隔的,那我给再给大家。呃,基于这几种都给大家演示一下 啊,这边的话我改完,然后编辑好了,那这边我改了什么呢?我就把这个东西换成换成了 e a, 其实这边我已经把这个真的类型在这边啊做了这个注示说明。 那这边的话我们一我们再试一下我们的全速跑,然后的话,那我现在直接再去发这个,之前呢这个间隔他应该是肯定不回了,因为其实这边他这边解析这个东西他就直接报错了,那我现在应该是要发这种清除一下。 哎,那这边的话,那这边我其实实际发的还是这个一二三四五六七八。一二三四五六七八,那对应在这个应用收到了这个 size, 其实还是四,对应的数据还是一二三四五六七八。那那收到完之后它会把这个数据 这收到这四个数据,它会,它会先去给它原封不动给它拷过来,然后的话把这个特意把这个第零个字也加加,那就变成一三了嘛, 然后的话它调这个函数去发的时候,它去内部就会就给你,哎呀,按照这个协议的这个啊规定,它会去加头加长度,然后的话给你算 crc, 再给你加一个尾,那这边的话就相当于是这个以这两个都是 raw hash 的。 呃,这一次的话我给大家演示的是这个三 a 三 a 类型的话,是这个用于传输这个阿斯顿码,传输阿斯顿码,我当年这个这个这个代码的一个代码的这个 例例子中我,我改的,我改的是这个,我的这个实际头尾是,就刚才讲我实际这个头尾是零二和零三,零二和零三,那零二零三,其实那其实这边的话, 那其实这边的话,因为这边的话其实是阿已经是这个阿斯玛了,那我其实这样的话是石榴金子发的,石榴金子发的,但其实我这边传的是 hello world, 我 们用阿斯玛显示,或者说我们把这个这段数据给它, 这段数据给它复制下来,复制下来在下面我们用用,先用 hex s 的 话,那我们因为零二零三其实是不可见字母,不可见字母的话,那这边的话如果说用阿斯图码的话,它这边其实就是一个这个叫啥东西?因为它是不可见字母,那这边第一个前面是零二,那其实也是一个不可见字母 hello word, 这是我要发的这个应用数据,就是 hello world, 那 这边的话五 c 八 a, 那 这边是 ask 码, ask hex 的 这个它的校验,那最后也是一个那个,那其实 在关于这个阿斯哥玛这个选择合适的头尾的话,其实我觉得看看你在哪,那哪边传,在哪边调试了,如果说基于串口的话,那我建议选给他选成可见字体,但是呢,这个可见字体在你实际的这个传输的这个内容中,又 不会和这个可见字符和你选的头尾去碰撞上去,那,那那样的话,我觉得这样在这边全都用阿斯格玛的话,这样可能会会好好看一点,那这样其实发言也是可以的 啊,是因为是哈喽 h h, 他的阿兹玛加一,那就是变成 i 了,那就 e i 了,那这边的话也是符合的,也是符合的,那就是关于这个选择合适的这个头尾还是要取决于啊,大家实际的应用应用 啊,由于这个时间的关系啊,这个其他的几种的话,我这边反正都测过了啊,大家可以直接用,我就不一一给大家演示了。然后最后的话就是说啊,啊,啰嗦两句,就是说啊,现在的话,大家也都啊发现了,现在这个 ai ai 爆发了啊,这个 比较厉害的这些代码,这个东西怎么说呢啊,有些人还是有点焦虑的啊,说这个东西会被 ai 代替的啊,我觉得就是说 啊,就是说啊,我们现在就是说啊,有些东西确实啊,我们不需啊,不需要具备造轮子能力,但是说我们需要去了解的知识面还要尽量的广。那比方说就拿这个模块来说 啊,你看了我今天的这个视频,你只需要知道,哎,有这么一个在在这个 get 上面,哎,有这么一个模块,哎, 那些细节你都可以不需要了解,你只要只要知道有这么一个模块,哎,刚好以后,哎,有时候哪天突然需要用到这个,用到这个功能,哎,你就不需要自己去那个了,你就直接去直接去到到这边去找。我觉得就是说,哎呀,这边,呃 a r 这边的话,他这边的话啊,对这个我们的这个冲击,我觉得还是这个对我们程序员的这个冲击,我觉得还是啊有限的,应该还是说很难去完全去去代替这个这个谁,所以这个的话 我觉得大家还是不要去焦虑的,就是说还是要去提高,或者说这个,呃,这个,这个丰富自己的这个知识面,这个信信息面就是说,哎, 不需要具备造造轮能力,但是那我需要知道,哎,哎,有这么一个模块,那我当当有时候如果说,哎,我刚好用到,那我就知道这个东西,然后知道之后我再去深入的去研究这个,哎,这些细节细节。 当然如果说用不到的话,那你就不需要说我把所有东西去研究透,因为怎么说呢?人的精力是有限的,不可能说我把所有的东西都学透,我觉得更多的还是说等,哎,我刚好用到,哎,我知道有这个模块,我刚好需要用到这个模块,那我再去深入的去去研究 啊,好了。呃,这个这个模块的话介绍就到这里,大家在使用的过程,如果说啊有什么 bug 啊,到时候也可以啊,反反馈给我,反正这个模块反正我在在用的过程中,反正到时候我我也会持续的去啊,去维护迭代的。好了,今天的分享就到这里啊,感谢大家收看,再见。

看好了,你要的塞尔号动态背景图无水印获取教程来了,三秒教会你!方法很简单,先戳着,接着上方放大镜搜神图壁纸,输入口令 a 幺七八搜索,选动态背景,然后选你喜欢的去获取就行了。

今天我们来拆童年回忆赛后卡牌, 我们看一下,第一张就出镜了,杰西卡 后面,后面没出镜哎,这一包就出镜了一个,大家可以看一下,我们看一下下面的 什么鲁伊斯,鲁伊斯还可以哦,出镜了, 还有混沌天使草,还有奥克梦,这一包出镜的不少哦,大家可以看一下。 再拆,再拆,看一下,再拆这一包,看一下什么传奇明峰人鱼鸡咖喱哦, 神布莱克出镜了哦,这一包非常可以的。好,就这样。