粉丝5.8万获赞17.7万

串口通讯工作原理非常简单,他发送的是串行数据。那什么是串行数据呢?在计算机科学和数字电路中,数据以二进制信息单元零合一表示,一位就代表一个零或者一。在数据传输时,最小的单位是字节, 一个字节等于八位二进制数。如果要进行数据传输,可以采用两种方式,一种是一次性把所有位的数据传输出去,这就是并行数据,也叫做并口通讯。 另外一种是依次传输每一位数据,这就是串形数据,也叫做串口通讯。串口通讯怎么把数据发送出去呢?他只需要三根线,第一根线是微控制器的发送,连接着 电脑的接收。第二根线是电脑的发送,连接着微控制器的接收。第三根线是地线,微控制器给电脑发送数据,只要第一根线就可以完成,比如给电脑发送大写字母 a, 那么这一根线上到底发送了什么呢? 在数字电路中,所有数据都是以电瓶的形式来进行传输的,通过电瓶波形测试可以看到,为控制器发送的波形是这样的, 这是一帧完整的串形数据,他一共有十位,他是从左往右依次把数据给发送出去的。第一位是起始位,第十位是停止位, 然后中间的就是八个二进制数据。因为是二进制,所以第一位代表一,第二位代表二,第三位代表四,以此类 推,第八位代表一百二十八。按照这个规律,我们把收到的这个 a 的这个波形的每一位相加,最后的结果就是六十五。六十五和 a 之间又什么关系呢? 这得看阿斯卡代码对照表了,在这个对照表中可以看出,六五正好对应的就是大写的 a, 而我们要发送 b 的话,那微控制器就得发送六六了,可以看一下它的波形, 加起来就是六十六。我们想要发送什么数据,就按照阿斯卡表上的值,让微控制器去发送高低电瓶就可以了。 另外,如果微控制器发送数据,电脑忙着运算其他数据没有接收怎么办? 这就要事先约定好发送的时间间隔。波特率这个概念就出现了,常用波特率有九千六百、一万四千四百、一万九千两百、三万八千四百。 以九千六百为例表示,一秒之内发送九千六百位的数据,也就是每一位数据之间的间隔为一百零四点一六微秒。 按照这个规律,每隔一百零四点一六微秒给电脑发送一次高低电瓶。如果我们想要他发送更快的话, 可以选择更高的波特率。如果选择一万九千两百的波特率,则他在一秒之内可以发送一万九千两百个数据,比九千六百的波特率快了两倍,则他发送的时间间隔应调整为五十二点零八微秒。微秒 秒发送的时间间隔和波特率一定要严格对应上,如果对应不上,可能出现这样的情况,那我们把数据发送过去,接收放可能已经过了接收时间,这样就会导致数据错乱,这就是串口通讯的本质,你听懂了吗?

好,那今天跟大家分享一下阿迪鲁中的这个 siri 内裤啊,那 siri 内裤功能啊,它主要是用于对创口数据流的一个读写。我们看一下这个 siri begun, 他是用来干什么?他是用来创口波特率的一个定义函数啊,它里面有个参数叫 speed, speed 就是我们的波特率,波特率呢,就是有效数据讯号调制载波的速率,一般我们选为九六零零啊,再看一下我们下面这个啊, siri 普日特兰和我们这个 print, 他这两个不一样啊,第一个 print 来按时换行的,第二个这个 print 是不换行的啊,里面也有两个参数,第一个参数是 vo, 嗯,第二个参数是 format, 然后是输出到创口监视器内容,也就是说你把什么东西想,嗯,输出在这个传统监控器,传统监控器上 啊,这个 vivo 就是我们的这个内容。那紧接着看一下这个方马特,方马特就是我们指定输出的一个格式了,当我们这个 vivo 为整数的时候,那方马特他的参数呢?就为这个 b i n o c t d e c h e x, 它分别代表我们的二进制、八进制、十进制啊, 考十六进制。当我们这个 vr 为辅点数时,那我们方码头就代表我们辅点数的一个小数位数。嗯,例子可以看一下这个,下一个葡萄 print line, 它里面有个三点一五五点二, 那我们看一下这个三点一五五,就是我们这个 vr, 是吧? vr 他现在是一个福点数,那么方瓦特就代表他福福点数的这个小微位数,那我们写个二,也就是说保留两位小数,那输出结果四舍五入以后就是三点二零啊,那么可以接下来通过实际来了解一下啊。 好,那可以看一下今天我带来是什么,今天我带来是一块耳钉的主板,一根这个多光线,还有一个这个我们说的天微信啊, 那今天实验什么功能?也很简单,只要把这个电位器的这个数值变化输出在我们商务健身器上就可以了。好吧,这里,嗯,银角我们连的是一个 a 零啊, 那么首先来,我们先定一个边量, 请紧接着我们定义我们的演讲拼搏斗,是吧,这是我们的 a 零, a 零就是我们的 input。 那么紧接着我们就要使用这个内裤了,手速猛要大些, 这里面的波特波特力我们设为九六零零啊,那紧接着我们就可以给我们这个变量扶持了啊, 这样等于多少呢?等于我们这个按 lug i love read 这里面直的一个变化,紧接着我们可以让他说出了啊,说出我们还是用这个 siri, 我们先用 print 输出一个这个自助串 尖位置,然后紧接着我们使用这个跨行的 siri 葡萄干 输出我们这个电位置就可以了,电位置就是我们这个 变亮, 检查没问题,我们就可以烧路了。 那好了,我们打开这个传统监视器,这时候我们就能看到我们这里啊,这里太快了,我们使用个得力吧, 那一秒钟真的有变化。哦, 好,我们现在看就好了, 比如看这个,我转到这个底了,他就是零了,你看现在宿舍电位置一直是零啊, 看,我现在旋转一下,他电位置就进行变化了,可以看一下。


小新经常收到私信问怎么接串口线,今天就用一分钟教会大家拿来吧你安卓屏绿色端子就是我们今天的主角。放大看一下,每个接口都标有符号。首先了解六 p、 i、 m 端子的构成, 一共六个接线口,称为六 p、 i、 n 符号分别为 v、 i、 x 三、 tx 三 rx 二 tx 二 g 四个符号,两个数字。 这些符号和数字有什么意义呢? v 级 vcc 指电压二 x 级 ready 指接收 tx 级川 s mat 指发送 g 级 g、 m、 e 指定线。数字序号又代表什么意思呢?线有序号,零二三四 s 加 零三四指的 ls 二三二二 s 加 s 指的四八五。 ls 二三二 rs 四八五接几根线? rs 二三二接三根线, rs 四八五接两根线。区别在于地线 都需要接 rx 接收 tx 发送线,然后需判断对应的序号数字。以六 p im 端子为例,接 rs 四八五二根线, 对照序号二指的 ls 四八五,所以我们选择接 rx 二,与 tx 二 同理。怎么接 rs 二三二的三根线?三代表 rs 二三二,所以我们选择 rx 三 tx 三 g, 这样就接好了。 拿个实物给大家演示一下。准备端子,母头线 rs 二三二线接第二 lx 三第三 tx 三第六 g。 调整螺丝,松紧接线, 固定螺丝,要注意线另外一端的顺序哦。 接好了是不是很简单?


哈喽,大家好,这里是白话商微机做商微机开发久了呢,很多新手朋友经常会问我一个问题啊,他说,老师,我在 c 叉吧里面写了一句, zero point 点 write hello 这样一行代码,那这行代码到底是怎么让几百米外的机器动起来的呢? 很多教程上,呃呃,可能大概就是教你怎么调库,怎么携带嘛。但是呢,很少有人告诉你这根网线或者是创口线里面到底发生了什么。 今天呢,我们这期视频呢,呃,不讲些复杂的语法,主要是把计算机通信呃相关的知识点给给扒一下。 所以说我们今天呢,要从最底层的电压开始,一路讲到二进制,再到讲到编码,最后再到 modbus 协议啊。所以说听完本期视频呢,你就不再只是一个写代码的程序员了, 而而你将理解自己真正的身份就是相当于,呃连接一些人类的一些指令和机器员的一个翻译官,类似这样的一个角色。那么我们现在就开始吧。首先我们先来看一下物理层啊, 物理层呢,就是呃,大家先来看这样一个示波器吧,这个呢就是真实世界里边的电信号,其实呢,你会发现它是不稳定的,对吧?歪歪扭扭的,甚至呢还有很多噪点。如果这个时候,比如说我想传达一些数字,例如我规定 一幅代表数字一,二幅代表数字二,那么问题来了,如果我想发一个数字五,但是呢,最后接收方 那边收到了是四点八伏,也就是说因为信号在路上衰减了,我发的五伏,但是接收方实际变成了四点八伏。那这个时候是不是就出现了一个问题,对面的机器那到底是应该把四点八看成五还是看成四呢?这里是不是就很容易出错了? 所以说呢,这个就是模拟信号最大的弱点啊,就是怕干扰。那么为了解决这个问题呢,呃,一些聪明的工程师呢,呃,决定对这种相当于嗯 模拟信号的怕干扰的一些特点进行了一个降维打击,就是我们可以不用搞那么复杂的电压,这里呢只有两种状态,要么有电,要么没电, 哪怕我发出的五伏电瓶啊,即使路上你衰减到了三伏,只要它还大于一个预值,比如说大于二点五伏,机器就认为这个是有电的,就给他一个一的一个数值,如果电压掉到了零伏或者是很低,就认为它是零。 所以说呢,这个就是计算机为什么只认零和一,不是因为他喜欢二进制啊,而是因为在就是充满干扰的物理世界里边吧。嗯,相当于只有这样的零和一,这样的二元对立啊,才是最抗干扰最稳定的一个传输方式啊。 所以说这点大家理解一下,就是并不是呃计算机喜欢二进制啊,而是因为这样的方式才是最适合最抗干扰最稳定的传输方式啊。 嗯,举个例子呢,其实零合一这种呢,就像是古代的烽火台一样,对吧?当你狼烟升起的时候就认为有敌人,那没有升起的时候就认为是平安了,即使隔着十公里也能看得清啊,绝对是不会看错的。 好了,那么我们,呃,有了这个零合一呢,这还不够啊,我们再来看第二个数据层, 其实呢,一个开关的 beat, 它只能表示两种状态,比如说我要是想表示今天的温度是二十五度,那怎么办?就像去超市买鸡蛋一样,大家可能觉得一个一个拿太麻烦,会习惯说给我来一沓, 其实计算机界呢,也有一个行话吧,我认为啊,就是叫给我来一字节,就是来一比特,大家看我们这里呢,把八个开关相当于把八个开关捆绑在了一起啊,这个就叫一个字节,如果这八个开关全为一的话,代表的就是二五五, 看到没,这里是二五五啊,因为他们呢,只用了一个字节来存数据。 但是呢,作为程序员的话,我们比如说有的时候在调试窗口的时候,如果让你背这个,比如说幺幺零零幺零幺零,你肯定会疯,对吧?因为这些,呃, 数字太多了,太长了,人类的大脑呢,其实对一些长串的,比如说零一零,这也是不敏感的。于是呢,在这种情况背景下,十六进至就是 hex 就 诞生了, 很多新手呢,其实担心十六进尺,就是比较恐惧十六进尺,其实不要怕,他没有什么高深的数学原理的,他纯粹就是二进尺的缩写,就是你把十六进尺看作是二进尺的缩写。 然后呢,大家来可以来看一下这个屏幕啊,就是你的二帧制的幺幺幺幺,看它代表什么,它代表的是不是就 f 啊?在十六帧制里面,当你的是幺零幺零的话,你看它代表什么?是不是在十六帧制里面就代表的是 a。 所以 说,如果以后各位小伙伴,如果你们以后看到 modbus 豹纹里边的 f、 f, 是 不是脑子里就立刻反应过来,这八个字节是不是全开了?全为 f、 f, 如果你看到全部为零的话,像这种就是开关全关了啊,全为一的话,那相当于开关全开了。所以说呢,这个十六禁制 hex 呢,它只是为了让你在看日制的时候呢,我觉得眼睛更舒服一点,其他没什么特别大的作用啊。 我们再来看第三个啊,就是编码层,当你有了数字之后呢,我们这个时候可以开始传递信息了, 但是呢,你内存里边存的永远是数字,对不对?比如说零、 x、 一 四这些,那这个数字代表是什么呢?是代表数字二二八,还是代表一些汉字的一半呢? 这个时候呢,就需要一个字典了,其实也就是我们说的编码机。最早的时候呢,我记得是美国人发明了一本第一本字典叫 x 码,他们的很霸道,只用了这个一百二十八个位置。 然后呢,把一些 a、 b、 c、 d 啊,数字啊,标点符号,相当于标了个号啊,比如说你的六十五号,他就代表 a, 然后呢九十七号就代表 a, 其实呢,这个字典很小,甚至连一个字节都装不满。最后呢,因为计算机普及到了中国, 呃,日本这些国家地区,我们发现啊,一百二十八个号根本不够用啊,因为我们以我们中国为例,我们的汉字其实就有几万个,对吧? 最少几万个汉字。那所以说呢,中国人发发明了这个 g、 b、 k 的 一个字典啊,然后日本人呢,搞了一个叫 g、 i、 s 的 字典,这个时候呢,惨案其实就发生了乱码, 为什么会出现乱码呢?其实并不是因为你的数据坏了乱码,其实呢就像是比如说我举个例子,我用这个 g b k 字典给你写了一封信, 信里写了这个 c 四 e 三,对吧?这个是 g b k 里边的你的这个意思,但是呢,是啊,这个收到这个信息的这一方,他是个老外, 他拿着一本阿拉丁的字典去翻译,去查这两个数,然后查出来是这种什么这两个比较奇怪的编码,那这个时候是不是就是有一种现象,你的数据其实发的是对的,数据没有变,但是因为在接收方他们,他们查字典的人拿错书了, 所以说呢,为了这个解决这个问题啊,其实相当于最后呢,全世界坐下来开了一个会,大家的意思就是说我们不要各自为政了,搞一本比较通用的这个地球上都通用的字典吧,这个就是 unico 的, 也就是我们大名鼎鼎的万国马。 好了,那么因为 unico 的 他同意了制服啊,但是他怎么存的这个呢?就引出了今天最重要的一个知识点,也就是上外机,呃,开发比较大的一个坑啊, utf 八, 相信我们好多小伙伴都听过 utf 八编码,对吧?我们可以在屏幕上做个实验,这里呢我输入一个 a 啊, 大家看一下,我这里呢输入一个 a 下面的内存数据,它其实呢是四十一。 utf 八呢,它其实是很聪明的一个编码,它为了兼容一些老美的 x 码呢,在存英文的时候啊,非常省空间,只用了一个字节, 然后再看一下,我比如说我输入一个,你可以看啊,这颗非常关键啊,当我输入汉字你的时候,下面的内存数据是不是,是不是就变成了三个 e 四 b d a 零,也就是说三个字节,对吧?啊,不是三个比特,三个比特。 然后呢,很多新手呢,很多新手呢?其实在写上机通讯的时候呢,如果你给 plc 发送这个字母串的时候呢,如果你不知道它是变长的,还在按一个字呃占两个字节来计算长度的话,那么你的通讯肯定会错位的啊, 所以说呢,请大家记住一点,在 utf 八的世界里面,英文是比较廉价的,也就说一个字节,它占用的字节数是比较少的。中文呢,因为它有些汉字的原因,它是比较昂贵的,占,一般来说是占三个字节,占占的这个字节是比较多的。 然后呢,呃,我们再来看一下,这一页就是转折点, 现在呢,我们其实能发光了,对吧?也能发数字了,也能发文字了,但是呢,我如果只把数据发到网线上,那么会发生什么呢? 大家可以看一下,像这样一连串的流动的这个,嗯,数字啊,就是数据,他像河流一样源源不断的流过来,对吧?什么 a 四啊,零一,零三, f f 零二这些,那么作为一个接收设备呢,这个时候呢,你会面临几个问题啊? 第一个,你给我发这么长的数据,而且一直在流动,这句话从哪里开始呢?第二,这句话是谁发的?是你说的吗?还是对我说的?第三个就是如果这么长的数据还在不断的,还在不断的这个流动,如果他中间混,呃,混,就是混杂了一些干扰的噪音,怎么办呢? 所以说呢,如果只有字母柳呢,机器是没法工作的,我们呢其实就是类似需要一把刀,比如说把这条河切成一段一段的,每段是代表具体的这个意义啊,那这把刀呢,就可以称作为协议,这个就是协议的作用, 可以看一下,我们呢通过这个 modbus 协议啊,把上面的一些数据流分成了这样的一些格式啊,那么这样的话通过协议秩序呢?是不是就诞生了?好了,那么接下来就看我们这个协议层 modbus, modbus 呢是我们工业界最通用的一个协议啊,你不要觉得这个协议比较高深莫测的,其实呢 modbus 它就是一张标准的快递单啊,嗯, 比如说商务机给 plc 派活,必须按照这个格式填单子,对吧?红色的盒子,像这个是地址码的,地址码它相当于这里呢,比如说我们填零一的话,意思就是比如说零一号员工开会,你出来听令啊, 然后呢其他员工听到不是叫自己就继续睡觉,也就说这个零一代表的是地址,就是要给谁发?相当于 然后呢这个黄色盒子,这个零三它是功能吧?它代表什么呢?如果我们这里填零三的话,就相当于我要读取你的数据,假如说如果是零四啊,或者零六这些,如果是零六就是我要修改你的数据,那第一个是地址,就像你收发快递一样,第一个是地址,那第二个就是我要干嘛, 发的什么东西啊?大概发的什么格式的内容,这个是功能吧,那下面蓝色盒子呢?它是呃,数据码, 这里面呢你要填具体的参数,比如说从呃呃第零个柜子开始吧,这种的读一个数。然后呢最后面这个是校验位啊,它是一个灰色盒子,这个 crc 校验这个是最重要的,它是因为它是其实就是一个方位的印章。 所以说呢,其实呢,呃,我只要修改了,比如说前面的任意一个数字,像地址码、功能码的话,那么你后边的这个教验它它绝对会就会失败了,它教验就会失败了。 然后呢,其实呢,发送方在发数据之前呢?呃,它其实就好似要先做一道数学题一样,它把结果写到最后边了, 然后接收方呢,在接到接收到数据之后呢,也会做一道数学题啊,如果算出来的结果和最后的这两个字就对不上,那说明了什么?说明你教验失败了,同时也说明了你的信号在路上被干扰了, 或者说你的数据被篡改了。那这个时候呢,像 plc 呢,他就会做一个非常高冷的一个操作啊,就直接丢弃掉了,认为你这个数据是假的或者是错的数据, 就直接丢弃不回话了,就当做没有收到听到一样。所以说通过这个例子呢,也能解释了,为什么我们上一期界面有的时候会显示一些通讯超时,往往就是因为校验没有通过。那么我们再来做一下总结啊, 通过以上的这个六个,嗯,六个层面呢,我们其实已经完成了从你的这个物理世界到软件世界的全过程。我们再来总结一下, 物理层的,它用电压的这个高低确定了零和一的一些物理基础数据层的,它用这个十六金质的 hex 缩写,让我们可以看懂而精致。 那么第三个呢,就是编码层的,它用这个 utf 八的字典啊,把一些冰冷的数字变成了人类的文字啊。 那么第五个呢,就是第五个和第六个就是协议层了,像协议层呢,就是像比如说 model bus 这样的规矩,把你的一些混乱的笔,而且一直在发的数据里啊,变成一些可执行可解析到的指令,这个呢就是上位机, 呃,通信层面开发的底层逻辑啊,当你理解了这些之后呢,下次如果你再遇到窗口连不上乱码呀,什么 crc 胶原包错,这个时候你就大概不会慌了,因为在你的脑海里面呢,已经拥有了这样一张完整的地图啊。 那么我们今天的视频呢,就到这里了,如果大家有什么疑问的话呢,也可以呃,打在评论区啊,嗯,那么谢谢大家。