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

STM32--USART串口通信的应用(第一节串口通信的概念)

咱们今天呢给大家讲解咱们 stm32 开发当中的串口的应用啊  串口这个专题呢啊是我们那 个学习上必须要掌握的一个外设

串口有什么作用呢,其实在我们以后的这个开发程序当中,咱们可能经常需要用到一些调试 信息,对吧? 啊,咱们可能今天要去调试我们的程序,那调试程序怎么了? 我们肯定是需要 有一些调试信息输出的

现在可能调试你的这些 c 语言啊之类的时候 ,咱们经常用 printf,但是呢啊在我们裸机开发 当中,我们的裸机又没有带操作系统,也没有屏幕,对不对?有很多情况下都是这样的,那 么这个时候你想看到一些调试信息 ,你怎么去做呢?这个时候你就要用到我们的串口啊

uart 它的最大的作用其实就是用来调试,那么除此之外呢,串口也是我们最基本的通信方式 之一

如果说我们两个板子或者说我们有啊我们的板子和我们的电脑需要做一些数据的通信,那么 这个时候呢啊串口也是我们经常用的这个通信的手段之一

所以说咱们学习这个串口了啊 ,对于我们以后的这个程序开发它是有很大的这个作用的。 那么呃我们本节的专题呢给大家呢啊分为4 个章节给大家进行一个讲解啊

首先呢第一个章节呢给大家讲一下串行通信的一些概念,包括我们串口的一些硬件啊电路怎 么去链接,然后呢呃它的这个通信协议是什么样的,我们都会在这个第一节给大家进行一个 介绍。

然后呢我们着重的再去给大家讲解咱们串口相关的一些寄存器啊,因为咱们可以通过这些寄 存器去了解啊咱们最底层究竟是怎么去操作这些硬件的,那么啊对于我们知道这个底层的这 些技术细节是有非常的大的好处,虽然说咱们在实际的这个开发过程当中啊,咱们很少直接 去操作这个寄存器啊。

第三节和第四节呢,咱们分别从这个呃寄存器去操作我们的串口,还有我们的库函数去操作  我们的串口啊,两方面给大家进行讲解啊,讲解咱们这个串口的数据收发啊,怎么用我们的  寄存器去实现 ,然后呢就是怎么样去? 需要用我们那个库函数去实现我们串口数据的收发, 那么我相信啊通过我们这个原理,寄存器还有两个实例的介绍,那么大家肯定是能够把这个  串口呢给掌握好,那好,那么我们现在呢就开始给大家讲解咱们串行通信的一些基本的概念。 那么说到通信啊,说的通信,那么我们肯定要给大家讲解我们通信的一些最基本的概念,对  吧?那么我们通信怎么进行分类的啊,然后呢我们这个创新通信当中呢,我们还会给大家介  绍咱们的这个 uart,就是它的一个啊串行通信啊外设。然后呢我们就给大家介绍这个串口的  电路链接以及我们的通讯协议

 ,这个串行通信当中呢 ,我们还会给大家介绍咱们的这个就是它的一个串行通信啊外设, 然后呢我们给大家介绍这个串口的电路链接啊,以及我们的这个通信协议,对吧?那么我们  接下来就来看一下咱们的这个通信的基本概念。

提到通信,那么我们知道,你如果说要和另外一个人进行通信,首先必须要保证的是要有两  个人 ,没有两个人 ,那你单方面一个人在那儿吼 ,那怎么叫做通信呢?你只能叫做广播啊, 我们这个通信啊肯定也是一样的,它必须要有两个对象,一个用来收取数据,一个来发送数   ,那么啊根据我们这个数据通信。

两者之间是否同步,我们把它分为这个同步通信和异步通信,那么我们这个地方呢啊就给大 家首先给大家讲一讲这个同步通信和异步通信它有什么区别啊

同步通信其实说白了就是说通信的双方它可以根据一个同步信号来进行一个数据的收发,也    就是说他们有一个共同的同步信号,这个同步信号往往就是时钟,往往就是时钟,也就是说    你看到我 a b 两个对象要进行通信 ,他们呢中间会有一个共同的同步信号 ,这个同步信    号呢往往我们都是在他们两者之间接一根信号线,这根信号线呢用于传播一个什么呢?用于    传播一个时钟啊,其实就是一个时钟线,其实就是一根时钟线。所以说以后你凡是看到啊两    个对象来进行通信的时候,他们之间连接了一根时钟线,那么一般他们的通信就是同步通信    啊,因为这个时钟啊是他们这个通信速率的一个参考他们两个参考的标准是同样的完全一致, 所以说这种情况下他们就是同步通信啊,他们都会有一个共同的时钟信号啊,共同的时钟信    号,那么他会他们就会根据他们连接的这个时钟信号来进行数据的采样和收发,所以说他们    的这个呃收发的速率完全是同步的 ,那么呃完全是同步的就可以导致他们的这个通信速率   通信效率会比较高,通信效率就会比较高,当然了他们的付出的代价肯定就是啊要多花一个    管角去连接一个使用线 ,那么这是我们的这个同步通信与此对应的啊,

与此对应的就是我们的这个异步通信 ,我们异步通信呢它刚好没有这个时钟线 ,看到没有, 两者通信之间他们并没有按照一个统一的这个信号去进行一个数据的收发,那么我们就就在  想了,对吧?你们不按照同样的这个数据去收发,那么我一方收的快,一方收的一方发送的  快,一方收的慢,那岂不是造成一个这个啊通信的这个误差吗? 啊,对的,肯定是有的,他  们呢呃不是说没有这个时钟线,他们的这个速率啊就不能匹配啊,不是的。一般来说我们每  一个外设它内部都会有一个时钟啊,都会有一个时钟,那么他们完全可以参考他自己内部的  这个时钟呢去设置它的这个通信速率,然后呢比如说我们两个都有一块表,对吧? 我们都看  着按照自己的这个表的这个时间来调整我们的这个收发数据的快慢,但是我们两者之间的表  可能这个有一点点误差,对吧?可能两者之间的表它并不是完全同步的,所以说他们两者之  间虽然说他们是按照他内部的这个时钟来设置它的这个收发速率,但是毕竟两者并不是完全  同步的,所以说他们是异步的啊,这种情况下我们就把它叫做异步,异步呢啊,他们呢一般  在收到的时候还是会去设置他们的收发速率,就相当于咱们的这个串口啊,我们的这个串口  它是典型的一个异步通信,他们呢一般都会设置他自己的一个波特率啊,两边儿来一定要设  置为一样,这样的话他们的这个数据收发才会呢啊一致,那么由于他们的这个两边的这个时  钟啊可能精确度的一些问题,两边不可能完全一致,那么就可能会导致他们在数据收发过程  当中啊每发数一个位。这个的时候就可能会有一点点的这个误差,所以说对于我们异步通信  来说,它一次性通信的速率一般都不会很大 。因为你要是一次性通气的速率很大,就可能导  致你的这个啊通信的这个数据啊收发的误差会变得越来越大啊,那么这显然不是我们愿意见  到的,所以说他们的这个通信速率一次性传输的这个数据一般都不是很多项目的串口,可能  就是 8 位,9 位这个样子。那么我们后面呢给大家讲解这个呃通信的这个协议的时候呢,啊, 还会给大家提那么异步通信他们的好处呢就是咱们没有这个时钟线,比如说减少了很多方便  啊,没有这个是中线,那么省略了很多一些资源啊,他们在通信的时候只要约定好这个通讯  速度就可以了。

那么省略了很多一些资源啊,他们在通信的时候只要约定好这个通信速度就可以了,参照着 他们自己内部的时钟 ,就是大家以后看到是凡是这两个 a b 之间进行通信的时候 ,他们

并没有共同的时钟 ,那么他们就是异步通信

好,那么嗯大家了解到这里之后肯定应该明白同步通信和异步通信的一个区别,说白了你就 直接看有没有这根时钟线,对吧?那么没有呢就是异步通信,有就是同步通信啊,可以这样 去理解,那么这是从这个数据的这个收发是否同步去对我们这个通信来进行一个划分,然后 划分为同步通信和异步通信。

我们还可以从在某一时刻你是发送一个未来还是同时发送很多个位去进行一个划分,我们把 这种通信呢啊把它划分为这个呃串行通信和并行通信

串行通信指的就是在同一时刻你只能搜或者是发送一个位一个位的信息,那么那么很显然你  在同一时刻只能发送一个位,那么我们只需要用到的是一根信号线就可以了,不管是你是收  是发,我们只需要用一根信号线啊,我发送的时候我就用这根信号线,很显然我要发送大量  的数据的时候,由于我只有一根信号线,那么我同一时刻我就只能发一个位,只能发送一个  位,我接收的时候也是我接收的时候也只用一根信号线,那么我接收的时候呢也是同一时刻  只能收一个数据位,那么我要接受很很多很多数据的时候,我只能一个位一个位慢慢的接收。 像这种串行通信呢,啊,它的缺点很明显,就是它同一是个只能收发一位,那么就会导致了  他的这个收发数据的速率。啊,收发数据的数据量是不是比较小啊? 啊,通信的速度比较慢, 通信的速度比较慢 ,但是它的优点是非常明显的 ,就是它非常节约 io 口资源 。那么我发送  数据和接收数据我只需要用一根信号线就可以了 ,那么相对来说它的这个 io 口的资源是不  是非常的节约下来?如果说你的芯片 ,那么你的 io 口资源非常的有限 ,那么你又想和其他  人进行数据的通信,那么你就完全可以选择我们串行通信的一些方式啊,串行通信的一些方  式。缺点就是什么呀?速率相对较慢啊,叫的较慢,然后它的优点呢就是占用资源的较少啊, 这个管理的资源较少

那么我们这个并行通信啊刚好就是什么呀?也是和它对应的,我们并行通信是指的是同一时 刻可以或者发多个数据位,多个数据位,那么你要同一时刻要发送多个数据位,很显然你一 根信号线你就搞不定。对吧?那么你必须要什么呀? 多根信号线,比如说我同一时刻发送 8 个位过去 ,你看我一个 char 一个类型是不是 8 个位呀? 8 个位我就可以一次性就发送过 去了,而像我们这种串行东西的话我得发送 8 次,因为它一次性只能发出一个位,那么对于 我并行通信来说,很显然我的这个通信速率会变得非常的快。通信速率变得非常的快,那么 它的缺点也非常明显,就是我占用的管脚会非常的多。我要一次性发送 8 个位,那我就需要 8 个数据线呀,我要占用 8 个管脚呀,对不对?那么这缺点就是占用的资源设置太多了,像 我们的这个啊芯片它的这个拐角一般来说都是非常这个宝贵的,那么除非是在一些特殊的要 求下 ,我们才需要接很多很多根这个数据线。比如说对我们这个内存 ,我们的这个 CPU  我们的这个内存芯片进行数据交互的时候,那么肯定要用并行,因为我们要求我们的这个内 存呐收发数据啊一定要快,这样的话我这个整个程序跑起来才快,那么我们的内存芯片和我 们的这个 CPU 的之间的数据信号连接的话 ,那么很显然肯定是需要这个啊 ,一般呢都会用 这种并行的东西用这种大量的数据管理啊,很多根数据管脚来进行这个数据的收发啊,那么 啊对于一些其他的像我们的这个 stm32 和其他的这些外设

通信的时候呢,一般可能用的串型会比较多一点点啊,用串行比较短 。因为我们有一些外设 他的这个速率咱们可以要求他们不用达到像我们内存那样那么快,对不对啊? 它的这个通信 速率一般可能就比较慢的 ,可能几十 kb 几十兆几兆这种同一速度 ,对不对?像我们内存那

可以达到啊几百兆 ,甚至是上 G 的这种通讯速度啊 ,那么这就是我们这个串行通信和并行 通信的一个区别,包括他们的优缺点,对吧?那么我相信大家来一眼就能看出来,然后我们 在这里呢直接给大家啊进行一个说明。

然后我们可以从这个通信的方向来进行一个划分,然后我们可以划分为单工、半双工和全双 工 。我们看这个箭头大家都明白 。如果说我们是单供的这种方式,那么很显然,那么就只能 是一个对象单方向的跟另外一个对象进行通信。而另外一个对象不能够什么呀?给他进行通  ,那么这就是一个单方向的 ,你要么就是 a 发送数据给  b ,只能是一个方向 。或者说你 a  接收数据,对吧?只能是反过来的这种方向,只能是一个方向,不管是你是收还是发,那 么你只具有一个方向的这种通信的能力。

那么这种情况下就是你的单工,对吧?那么你只能做接收设备或者是发送设备,只能做其中 之一 ,那么这就是单工的

半双工,就是说你可以发送数据。也可以接收数据,但是你在同一时刻不能同时的发送和同  时的接收。你具备接收和发送的能力,但是你不能同时的发送和接收,这就是我们的半双工, 半双工、

全双工很显然它的功能就会更加强大。对吧?那么你既具备接收数据的能力,也具备发送数 据的能力 ,而且你可以同时的发送数据和接收数据 。这就是我们的全双工。

如果说以前学电子通信的这个同学的话,肯定对这些概念应该非常的了解,那么我们有一个 例子。就是非常清晰和他那个非常的那个得到我们的这个收音机,比如说它就是一个典型的 单工,像你收音机的话,你听的时候你只能听到我们远处的这个广播电视台给你传过来的这 些数据信号

那么你不能传输数据信号给远处的这个广播电视台,那么很明显你就是只能作为接收数据的 存在,那么你就是一个典型的单工数据通信,那么像我们的对讲机,它其实既可以说话,也 可以听到对方的说话,但是在同一时刻是只能是单方向的 。要么你说,要么别人说,像我们 的电话就不一样 ,电话就是一个全双工的,像我们的手机,对吧?你既可以说,也可以听到 对面的声音 ,就是这个典型的一个例子

那么大家了解一下咱们这个数据从方向来进行划分 。分为单工 、半双工和全双工。

那么这就是我们通信当中的一些比较基本的概念,我们在这里也给大家做了一个简单的总结。 对吧?那么比如说像我们后面要讲到的这个串口 ,那它就是一个典型的什么呀?异步通信   首先它是异步通信它中间没有这根时钟线,另外它是一个全双工的,它既可以发送数据。也    可以接收数据,另外它还是一个串行的,它是串行的通信方式,因为它的发送数据和接收数    据都是一根线 。那么我们后以后可能还会学习到什么 SPI I2c  之类的 ,它们其实就是同步    通信的 。那么有些是半双工,有些是全双工,那么以后我们讲到这些通信的时候,再给大家    进行一个介绍。

那么这里大家先有一个印象,

那么接下来我们给大家介绍咱们 STM32 的串口,以前我们可能学习单片机的同学也接触过  这种串口,对吧?那么我们通常把它叫做  UARTUART  就是咱们的这个同步的,大家注意,

对于我们这个地方 。我们以前的这个  UART  其实就是一个异步收发器  它对我们这个  STM32 来说它叫做  Usart  它其实中间加了一个同步 ,就是说对我们  STM32 它里边有一  个叫做  Usart  的东西 。它既可以支持同步的这种收发 ,也可以支持异步的收发 。但是实际  上我们在后边的这个使用过程当中 ,我们就把它当做这个普通的  UART  来使用 。那么就是  把它当作一普通的串口来使用 ,我们并没有使用它的同步通信 。就是它支持这种同步通信, 那么需要我们去把时钟线给它连上去。那么它就可以支持同步来进行通信了。但是我们其实  串口用的最多了,我们前面都说了,主要是用来进行一些打印调试的,对于我们来说,普通  的这种  UART  的这个功能就已经够用了。

UART  相对于  Usart  来说 ,其实就是裁剪掉了它的这个同步通信的能力 。它的这个功能给  它裁剪掉了 ,那么不管是  USART  还是  UART ,那么我们后边就把它当做是普通的  UART  来使用 。大家了解就可以了,因为其实在我们 STM32 的这个串口当中,其实它支持很多很  多的功能。但是我们都没有去使用到这些功能,其实还是有一些鸡肋,除非你是在这个特殊  的应用下,那么才可能会去使得用以外。平时我们都不怎么使用,我保证大家以后在开发当  中使用到串口的一些其他的功能也是比较少的。大部分你都是用来做调试的,所以说大家也  不用担心 ,你看我们在这里也给大家写了  因为  SAT  的在我们  STM3 上用最多的就是打  印一些程序的信息。帮助我们去调试,当然它也可以传输一些信息,我们也可以远端的通过  我们的串口去控制我们的这个板子 。这个也是可以的 ,另外  UART  这一个外设 ,这个就是  我们的这个  UART。在我们很多芯片和我们 STM32 进行链接的时候,进行数据传输的时候, 很多也是有这种  UART  来进行传输的 。比如说我们有一些  Wifi  芯片和我们的  STM32   个控制芯片要进行这种数据传输的时候。很多也是采用的这种串口来进行通信的。这里也给  大家进行一个说明,它除了应通过这些用于这个打印信息以外,还可以通过做一些这个数据  的传输

那么我们对 STM32 的这个串口简单的进行一个了解。下面我们就来给大家说一说咱们这个 STM3F407,它有它的一个串口的配置,对吧?那么对于我们 STM3F 407 来说,它有四个 USART  和两个  UART 。也就是说它有四个这个串口了 ,它除了支持异步通信以外 ,还可以 支持同步通信。

另外还有两个这个  UART  就是最简单的这种异步通信 ,那么我们可以看到它有  USART1  USART6USART2USART3  和  USART4 和  USART5。就是 4 个  USART  和两个  USART 那么其实我们主要关注的它的这个管脚主要是它的这什么呀?发送数据和接收数据的管脚  我们串口,一般来说它是串口串行通信的,对吧?那么它的发送数据和接收数据都是一根信  号线,所以说我们只关注它的发送数据管脚和接收数据管脚。那么对于同步通信的还支持这  个同步通信的这个串口来说的话,它肯定就有一些时钟管脚。包括还有一些管脚可以是用来  控制它的这个硬件数据流的

那么大家可以看到,那么这些拐角咱们暂时不用去关注,我们只需要关注上面就可以了,那 么我们在这里只是给大家整理出来了我们哪些管脚它可以支持这个  USART1  的功能  USART6 的功能,对吧? 比如说  USART1  的功能,我们的  PA9 和  PA10,包括  PB7   PB6 都可以去支持这个  USART1  的这个功能 。那么这些具体每一个拐角支持的功能 ,我们完全 可以从以前咱们那个数据手册当中那个管脚的功能分布图。大家可以去查,对吧?每一个管

脚可能支持很多个功能,那么对于我们串□来说,我们给大家整理在这里地方,那么大家可 以直接查 。当然了我们在后边的时候,你要去使用具体的一个串□的时候,你首先还是得去 看你的电机原理图。对吧?你要看看你的板子上是否用到了这个串□ , 那么并且这个串□是 连到哪一个管脚的? 因为我们有一些很多管脚都可以支持同一个串□ , 比如说像我们的这个 USART1 ,那么它除了  PA9 和  PA10 以外 PB6 和  PB7 也可以当作为  USART1  来使用。

那么你在使用的时候你一定得去看你的电器原理图 ,你用到的是  PA9 还是  PA10?还是说  你用的是  PB6 还是  PB7 ,对吧? 它们两个可能只能选择一个一套管脚来作为  USART1    使用,对吧?只能选择一套,其他的都是一样,我们可以看到大部分的这个串□都可能会支  持这个两套管脚 。它都可以配置为那种功能。那么我们后边对于我们的这个板子,我们也是  用到了串□的,那么我们先来看一下咱们这个串□的这个硬件。对于我们的板子,那么大家  拿到咱们这个  FSM4 来说 ,我们使用到的是两个串□ ,  一个就是  USART1 ,那么另外一个  用到的是  UART3 URAT3 ,大家看到它们的□是不一样的 ,这个□是公□ ,  那么这个□是  母□ ,  它们的插槽的这个指针方向是不一样的。那么你在链接的时候,你要看你是否有那个  串□线,那么像我们底下的这种串□线,那么我们给大家配的应该是配的这样的一根串□线。 这个串□线它可以直接插到我们这个  UART3 里面  它和这个插槽的方向刚好是相同的。

其实我们给大家配的一根应该是  USB  转串□线 ,为什么呢? 因为一头是我们的这个  DB9  的这种插槽 ,它的这种大的这种插□ ,  另外一□是我们的  USB   。因为我们普通的笔记本  现在已经很少有这种直接的这种串□了,所以说我们就不需要这边的这种串□线,而对于我  们以前的一些台式机来说 ,可能还有串□ 。对吧?那么如果说你要和你的这个台式机连接, 你可以直接用我们的两边都是这种  DB9 插槽的这种串□线连接我们的板子和连到我们的这  个台式机 。当然了,你的台式机仍然也有我们的  USB   ,  对吧? 直接插  USB  □也是可以   。那么一般来说,我们现在这种  USB  转串□的这种线用的会更多一点,但关于我们这个  UART1 。可能就是我们这个串□线,它的这个方向可能得去找另外一种,那么你得去找它另  外一种的串□线,是这边这个样子的,那么你才能够插得进去,我们这里使用到了两个串□  一个  UART  线 ,我们可以直接用我们的  USB  转串□线去进行连接 。一端连接到我们的板  子上,一端连接到我们的电脑里边。然后如果说你想使用  UART1 ,你又没有这根线怎么办?  那么我们在旁边还设计到了一个这个东西  它是一根  mini USB   ,  那么这一根  Mini USB

□我们可以把这个  USB  □当做串□一来使用 。仍然是串□一哈,大家注意,仍然是串□一  UART1 ,也就说它和它都是使用的是  UART1 ,那么这个,这一个小的这个  USB。这个  mini  USB   ,  我们可以通过这样的一根线 ,我们普通的这个电源充电线那么一端插进我们的这  个插槽里面。另外一端就是我们的标准  USB  □可以插到我们的电脑里面,我们可以使用这  一个 ,使用我们的串□一 。它也是串□一 ,那么两个都是串□一 ,对吧? 两个都是串□一, 我们两个不能同时使用它,只能使用一个,那么怎么去选择这个地方?那么我们在这个地方  有一个选择开关,你拨向这一边,就是我们的这个使用的这一个,对吧?公□ ,  那么你使拨  向另外一边 ,就使用的是我们这一个小的这个  USB  串□ ,  USB  转串□来使用的 。它是这  样的,它内部就是这样的,他这个地方可以通过我们的这个开关去进行选择。那么另外我们  从我们的电器原理图里边也可以看到

对于我们后期来说,我们就使用这样一根线,其实都够用了,就是我们这个普通的电源充电 线。对吧?那么这根充电线你就是一头插我们的板子,一头插在我们这个上面,那么另外一 头是我们的标准  USB   ,  插进我们的电脑 ,然后我们把这个选择开关把它拨到这个  USB 转串□的这一侧,那么我们就可以使用这一个  UART1  了。这个  UART1   了,这是解决咱们 这个没有相应的串□线 ,这样的标准的这种串□线。

咱们可以使用这样的一种方式,当然了使用这样的一种方式,我们可能需要装一些驱动,需 要装我们的  CH340 的驱动,大家注意,如果说你插进去之后连接到我们的电脑,你的电脑 的设备管理器没有反应 。那么你应该把这个  CH340 的驱动给装上啊。这样的话它才能去识 别我们  CH 340 的驱动 ,在我们的资料里面有 ,希望大家可以提前安装好。

这就是我们的硬件,大家看一看我串口长什么样子,那么这就是我们的这个硬件的一个部分, 然后我们再来看一下它的这个电路的链接,其实对于我们串口来说它是串行通信。也就是说  它的发送数据和接收数据都是用的一根信号线 。那么比如说我的这个  STM 32  ,或者是  其他的这些微控制器要和我的  PC  的串口进行通信。它怎么进行链接的?一般来说我这个  STM32 的发送管脚,它可以直接连到这个  PC  的接收管脚。然后 stm32 的接收管脚端连接  的是我们电脑端的发送管脚端 。刚好就是发送 、连 、接收,接收 、连接发送就是这样的一  种连接关系。

但是对于我们普通的微控制器 ,还有我们的这个电脑 PC ,他们是不能这样直接连接的, 因为他们的这个电瓶不一样。对于我们的这个微控制器,像这种板子来说 。它内部的这个电 瓶是我们普通的 TTL  电瓶,那么对我们这个电脑来说 ,它的这个电瓶是我们的 。这个可能 就是我们的  RS232 的电瓶了 ,它两者这个电瓶关于逻辑 1  和逻辑 0 的定义是不一样的 。具 体他们是怎么定义的 ,大家可以下来查查资料。

那么我在这里只告诉大家,他们是不能那个完全不一样,那么不一样的话就导致了你这个电 平不能直接连接。否则别人就识别不了,那么所以说它中间一般都会有一个转换器,把这个 电瓶转换过来。我们在发送的数据的时候,比如说我们的微控制器往外发送的时候,通过这 个转换器就可以把这个 TTL  电平转换成  RS232 的电平 然后发送到我的这个  PC   。发 过来的时候它就可以把这个  RS232 的电平转化为 TTL  电平 ,然后我的这个微控制器可以 识别了 。就是一般都会有一个转换器 。像我们板子可能用的比较多的就是什么  MAX232  类的东西,大家可以找一找,我们板子上也有这种芯 。那么对于我们,如果说你是普通的 这种微控制器和其他的微控制器进行一个连接的时候,那么由于电平是一样的。对吧?你就 可以不用中间的那个转换器

一般来说我们串口通信的管脚,大家可以看到,我们基本上用发送数据管脚,接收数据管脚  和再加一根地线。三根线一般都够了,地线主要是用于这个平衡它们之间的电压,对吧?   衡它们之间的电压,好,这就是我们这个硬件的链接,大家要了解,那么对于我们是,虽然  说我们主要是编程。但是我们要以后要去看懂我们的电气原理图,看起要看清这些电气原理  图,我们肯定也是知道。那么对于我们这一个外设,它的基本的这个电路是怎么进行连接的, 那么我们这个电路的连接就给大家讲到这里 ,那么下面我们再给大家讲讲咱们这个串口。

那么我给你发送数据,你那边接收数据,咱们究竟是怎么去约定这个数据收发当中的一些细  节的部分?约定这些数据收发的这些细节的一些东西,就是我们的一个通信协议,那因为我  给你发送一大堆数据发送给你。那么你要怎么去解析? 们之间是不是要有一个约定,如果  说我们没有这个约定 ,我就不知道怎么去解析你的数据 。所以说不管是任意一种通信方式, 它们都会有它自己的一个通信协议 ,那么通信协议就约定了。

我如何去解析你的数据?如何去那个根据你的这个发送速度来进行接收,来给你进行匹配等 等的一些内容,我们来看一下。那么串口自然也有串口的这个通信协议了,串口的通信协议 我们来看一下  比如说我的发送方  a  要给接收方  b  发送数据 。那么我们发送的管脚  TX 连到了对方的  RX,管脚上面去发送管脚,连到对方的接收管脚上面去,正常情况下中间连 接的这根信号线,它们是保持高电平。就是说我在默认情况下,不发送数据的情况下保持的 是高电平。那么一旦我要发送数据的时候,我会把这根信号线电瓶给它拉低,给它发送一个

低电平 0 。那么对方此时感受到了我接收管脚电平的变化,变成了一个低电平 。对方就知道  你要给我发送信号了,你要给我发送数据了,那么很显然这个 0 就是我的一个起始信号。就  是我发送数据的一个起始信号,我们的这个 0 就是我们整个数据通信当中的起始位。好,对  方感知到你要发送数据了,收到一个 0 的低电平,那么接下来他就要做好接收数据的准备了。 那么同时我们发送方就可以去发送数据了。

那么一般来说我们的 ,在我们  STM  三人当中 ,我们可以发送八个数据位或者是 9 个数据  。发送一堆  data ,发送一堆  data ,这就是你发送的数据可能就是 8~9 个位的数据 。那 么你在约定通信之前 ,你一定要约定好你究竟的你的数据位究竟要发送 8 个位还是发送 9 个位 。我们两边都要约定好 。一般来说我们就选择 8   因为我们一个  QR  发送一个字符 刚好就是 8 个位 ,所以说一般我们都是选择 8  。那么数据发送完成之后 ,我们可能还会 发送一个校验位 ,可能还会有一个校验位。

那么看你需不需要这个校验,这个校验位是什么意思? 嗯,我们可选的校验有奇偶校验和偶  校验 ,那么我们的这个校验位目的就是为了验证一下我们前边的这个数据它发送是否成功。 或者是发送是否有丢失

它是怎么去进行校验的? 比如说我们发送一个数据 ,我们发送一个八位数的数据  比如说  0X05 。大家先把它换算成二进制  因为我们这一个发送是一个位的进行发送的 ,对吧?   么我们拆成二进制 ,它就变成了 00000101 ,对吧?那么这样的 8 个数据位,我在发送了起  始位之后,那么我紧接着要发送数据位,我怎么去发送的? 我是从低位到高位一个位的发送, 我先发送一 ,再发送 0 ,再发送一 ,再发送 0 ,这样由低到高一次性依次发送 然后我看我  需不需要校验,那么我有两种校验方式,可能是奇校验,可能是偶校验 。如果说我选择奇校  验,那么我就要去核对一下我发送的数据里边一的个数里边一的个数是否为奇数个。如果说  我一的个数它是偶数个位  它不是奇数个位 ,那么我显然就要在我的校验位上面补一个一, 因为我校验是一个位,那么补一个一的目的是为了让我数据位加上我的校验位总共一的个数  为奇数个一。这样的话我发送给对方,对方把这个数据接收到了之后,他会去检验他收到的  数据和他的校验位一的个数是否为奇数个 。如果为奇数个一的话 OK  它就认为你发送成  功。如果它收到的数据变成了偶数个一,那么很抱歉,它就认为你在数据传输的过程当中可  能出错了 。它就要求你重发,这就是我们的这个校验 。它去核对一下我的这个数据是否一的  个数是否有偶数个,那么如果为偶数个的话,它的这个校验位上面它就什么呀? 不做任何的  改变 ,就填写一个 0 就可以了。

那么如果说它发现你的这个发送的数据是奇数个一 ,那么它就会在这个校验位上补一个一, 保证你的这个数据位加上我的这个校验位的总共一的个数为偶数个一 。这样的话往外发送, 那么对面也会按照的这种偶数的校验来校验你的这个数据位和校验位,它也会去核实一下你  的这个数据位加校验位是否为偶数个一。如果为偶数个一,它就认为你发送正确,那么如果  为奇数个一,它就认为你发送错误,对吧?那么这种校验方式,它是一种比较简单的这种校  验方式,它肯定校验也不是非常的准确,有一些错误肯定是那个校验不出来的,但是它能够  大概减少 50%的一个误差 ,可以减少 50%的一个误差。

这种校验是最简单的一种校验,就是我们串口当中使用的一种奇偶校验,其实咱们在发送数 据的时候有很多种校验方式的。包括一些什么  CRC  的一些校验,可能会更加的复杂 。它校 验起来也会更加的准确 。那么本身我们这个串口它在发送数据的过程当中 ,你就只是发送 8~9 个数据位一次性就传输这么多,所以说它的这个出错的概率其实是非常低的,那么大家 不用担心这个问题。一般来说都很少出错,极少出错。所以说一般来说我们也并没有去使用 它的校验位。

好,如果说你这个校验位你配置好了之后,那么我们这整个数据也就发送完毕了,发送完毕 之后我们需要有一个结束信号,那么就是我们的这个停止位 。它会把整个信号线再拉高,发 1  2 个高电平 ,发送 1  2 个高电平 OK ,对面收到之后也就知道了你整个数据的传 输已经结束了。

数据的传输已经结束了,这就是我们整个发送由我们起始到我们的停止,一般我们都采用的 8N1  的这种方式 。就是说这个我们发送 8 个数据位,

n  就表示的是没有既有校验 。然后一就表示的是咱们只选择一个停止位就可以了  因为咱 们的这个数据传输多半都是用于调试的。基本上不会有一些太多的这个错误,因为我们串口 还是比较稳定的 ,所以说它的运用才会这么广

好,那么这就是我们这个串口通信协议的介绍,我们给大家说了这个串口是如何进行发起始 发送 。如何发送这个起始信号?如何传输数据 ,如何去校验以及如何去停止?

那么我们还有一个东西没给大家提 ,就是我  a  以多快的速率给你发 ,你  b  必须就要有多 快的速率来接收。我要保证我发送的速率和你接收的速率要匹配,咱们这个发送和接收才能 perfect 。才能完整 ,那么这个地方我们就提到会有一个速率的问题 ,这个速率的问题对于 我们串口来说  它一定要约定好。

两边都要约定好这个相同的这个速率才可以我们在串行通信当中我们会有专门的一个标准, 对,速率的一个标准就是我们的波特率,它就是用来描述咱们数据传输的这个速率。特别是  在我们串行通信当中它用的非常的多。那么我们在串行通信当中我们就是用波特率来进行一  个描述的,波特率它的单位就是  BPS 。就是说我每秒传输多少个位? BPS  每秒传输多少个  位,那么它是衡量咱们数据通信的一个重要的指标。那么这个  BPS  一般来说我们会有一些  标准,我们国际上的标准就是这些,什么 1 10 300 600 120 。可能我们用的比较多的就  1152009600,我们以后可能会用的比较多一些 。一般来说我们这个波特率对我们串口  来说它传输的数据是有限的 。所以说对我们 stM32 来说 ,它可能说理论能够达到什6   之类的 ,咱们很少使用到这么高的这个速度一般可能就 几十  KB   。这么多 。这里还有  一个例子 ,就是说如果说我是给你设置的 1 15200BPS ,就是这样的一个波特 。其实它指  的就是每秒钟传输 115200 位,并不是说我数据就每秒钟传输这么多个数据 。因为整个位里  边还包含了咱们的一些起始信号、校验位、结束信号等等,所以说它的这个真正的这个数据  位并没有这么多 。那么大家一定要注意。

那么我们以后在这个设置串口通信的时候,就要去配置好它的这个波特率,两边都要配置为  相等的这个波特率,那么表明它们传输的数据和接收的数据一定要匹配好,那么我们本节课  主要是给大家介绍了一些通信的基本概念。还有咱们初始通信的协议。包括波特率这些东西, 包括咱们硬件的一个电路接口给大家进行了一个介绍。那么我们后边再给大家介绍创口的一  些其他的东西 ,我们本节课就到这里 ,感谢大家的收听 。再见!

http://www.lryc.cn/news/586198.html

相关文章:

  • stack和queue的使用和模拟实现以及了解deque
  • Kafka——聊聊Kafka的版本号
  • React 组件中怎么做事件代理?它的原理是什么?
  • 【6.1.0 漫画数据库技术选型】
  • LRU缓存机制完全实战:链表的工程落地与面试通关
  • 复现永恒之蓝
  • 网络配置综合实验全攻略(对之前学习的总结)
  • 脉冲神经网络膜电位泄漏系数学习:开启时空动态特征提取的新篇章
  • docker配置
  • 【android bluetooth 协议分析 07】【SDP详解 2】【SDP 初始化】
  • 使用FastAdmin框架开发二
  • 算法魅力-BFS解决最短路问题
  • 【Elasticsearch】function_score与rescore
  • MS Azure Eventhub 发送 AD log 到cribl
  • 定长子串中元音的最大数目
  • PyQt5布局管理(QBoxLayout(框布局))
  • OSPFv3-一二类LSA
  • Java 之字符串 --- String 类
  • 机器学习(ML)、深度学习(DL)、强化学习(RL)关系和区别
  • 箭头函数(Arrow Functions)和普通函数(Regular Functions)
  • 虚拟现实的镜廊:当技术成为存在之茧
  • 云端docker小知识
  • Java 大视界:基于 Java 的大数据可视化在智慧城市能源消耗动态监测与优化决策中的应用(2025 实战全景)
  • YOLO家族内战!v5/v8/v10谁才是你的真命天子?(附保姆级选择指南)
  • CCS-MSPM0G3507-2-定时器中断
  • 傅里叶方法求解正方形区域拉普拉斯方程
  • LeetCode经典题解:3、无重复字符的最长子串
  • jenkins自动化部署前端vue+docker项目
  • 洛谷 P11961 [GESP202503 五级] 原根判断-提高+/省选-
  • 【设计模式】单例模式 饿汉式单例与懒汉式单例