咱们今天呢给大家讲解咱们 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.pswp.cn/news/914194.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914194.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914194.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F407ZGT6天气时钟+实时温湿度显示(附源码)

文章目录实现功能:项目展示:代码解析:实现功能: 1.主要功能:通过485通信获取传感器温湿度,温湿度数据显示、实时时钟显示与用户交互。使用LVGL在显示屏上展示传感器温湿度数据,并提供UI设置温度…

和鲸社区深度学习基础训练营2025年关卡4

使用 pytorch 构建一个简单的卷积神经网络(CNN)模型,完成对 CIFAR-10 数据集的图像分类任务。 直接使用 CNN 进行分类的模型性能。 提示: 数据集:CIFAR-10 网络结构:可以使用 2-3 层卷积层,ReLU…

前端性能优化全攻略:从加载到渲染

目录 前言网络请求优化资源加载优化JavaScript执行优化渲染优化用户体验优化性能监控与分析总结 前言 随着Web应用复杂度不断提升,前端性能优化变得尤为重要。本文将系统性地介绍从资源加载到页面渲染的全链路性能优化策略,帮助开发者构建高效、流畅的…

hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库

目录 1.简介 2.安装和配置 2.1.源码编译安装(通用方法) 2.2.包管理器安装(特定系统) 2.3.Windows 安装 3.常用的函数及功能 3.1.连接管理函数 3.2.命令执行函数 3.3.异步操作函数 3.4.回复处理函数 3.5.错误处理 3.6.…

TCP套接字

1.概念套接字是专门进行网络间数据通信的一种文件类型,可以实现不同主机之间双向通信,包含了需要交换的数据和通信双方的IP地址和port端口号。2.套接字文件的创建int socket(int domain, int type, int protocol); 功能:该函数用来创建各种各…

Go语言高并发聊天室(一):架构设计与核心概念

Go语言高并发聊天室(一):架构设计与核心概念 🚀 引言 在当今互联网时代,实时通信已成为各类应用的核心功能。从微信、QQ到各种在线协作工具,高并发聊天系统的需求无处不在。本系列文章将手把手教你使用Go语…

Java基础:泛型

什么是泛型? 简单来说,Java泛型是JDK 5引入的一种特性,它允许你在定义类、接口和方法时使用类型参数(Type Parameters)。这些类型参数可以在编译时被具体的类型(如 String, Integer, MyCustomClass 等&…

RMSNorm实现

当前Qwen、Llama等系列RMSNorm实现源码均一致。具体现实如下: class RMSNorm(nn.Module):def __init__(self, hidden_size, eps1e-6):super().__init__()self.weight nn.Parameter(torch.ones(hidden_size))self.variance_epsilon epsdef forward(self, hidden_s…

智能Agent场景实战指南 Day 11:财务分析Agent系统开发

【智能Agent场景实战指南 Day 11】财务分析Agent系统开发 文章标签 AI Agent,财务分析,LLM应用,智能财务,Python开发 文章简述 本文是"智能Agent场景实战指南"系列第11篇,聚焦财务分析Agent系统的开发。文章深入解析如何构建一个能够自动处理财务报表…

人工智能安全基础复习用:可解释性

一、可解释性的核心作用1. 错误检测与模型改进发现模型的异常行为(如过拟合、偏见),优化性能。例:医疗模型中,可解释性帮助识别误诊原因。2. 安全与可信性关键领域(医疗、军事)需透明决策&#…

Qt:QCustomPlot类介绍

QCustomPlot的核心类就是QCustomPlot类。这个类继承自QWidget,因此可以像其他QWidget一样使用,比如放入布局中。QCustomPlot类基本结构一个QCustomPlot对象可以包含多个图层(通过QCPLayer表示),通常使用默认图层。它包…

Visual Studio 2022 上使用ffmpeg

目录 1. 添加包含目录 2. 添加库目录 3. 添加依赖项 4. 添加动态库目录 5. 测试 在解决方案中右击项目名称,弹出的窗口中选择 "属性"。 1. 添加包含目录 "C/C" -> "常规" -> "附加包含目录"中添加 ffmpeg中的…

Elasticsearch 线程池

Elasticsearch 线程池「每个线程池到底采用哪种实现策略」:Elasticsearch 线程池(ThreadPool)中 **所有内置线程池名称的常量定义**。 每个字符串常量对应一个 **线程池的名字(name)**,也就是你在 Thread…

深入理解 Next.js API 路由:构建全栈应用的终极指南

Next.js 是一个强大的 React 框架,不仅支持服务端渲染(SSR)和静态站点生成(SSG),还提供了内置的 API 路由功能,使开发者能够轻松构建全栈应用。传统的全栈开发通常需要单独搭建后端服务&#xf…

【6.1.2 漫画分布式事务技术选型】

漫画分布式事务技术选型 🎯 学习目标:掌握架构师核心技能——分布式事务技术选型与一致性解决方案,构建高可靠的分布式系统 🎭 第一章:分布式事务模式对比 🤔 2PC vs 3PC vs TCC vs Saga 想象分布式事务就…

液冷智算数据中心崛起,AI算力联动PC Farm与云智算开拓新蓝海(二)

从算法革新到基础设施升级,从行业渗透到地域布局,人工智能算力正以 “规模扩张 效率提升”双轮驱动中国数字经济转型。中国智能算力规模将在 2025 年突破 1000 EFLOPS,2028 年达到 2781.9 EFLOPS,五年复合增长率 46.2%&#xff0…

《QtPy:Python与Qt的完美桥梁》

QtPy 是什么 在 Python 的广袤编程宇宙中,当涉及到图形用户界面(GUI)开发,Qt 框架宛如一颗璀璨的明星,散发着独特的魅力。而 QtPy,作为 Python 与 Qt 生态系统交互中的关键角色,更是为开发者们开…

ubuntu环境下调试 RT-Thread

调试 RT-Thread 下载源码 github 搜索 RT-Thread 下载源码 安装 python scons 环境 你已经安装了 kconfiglib,但 scons --menuconfig 仍然提示找不到它。这种情况通常是由于 Python 环境不一致 导致的:你在一个 Python 环境中安装了 kconfiglib&#xff…

【数据结构初阶】--顺序表(二)

🔥个人主页:草莓熊Lotso 🎬作者简介:C研发方向学习者 📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言:生活是默默的坚持,毅力是永久的…

Java中的方法传参机制

1. 概述Java中的方法传参机制分为两种:值传递(Pass by Value) 和 引用传递(Pass by Reference)。然而,Java中所有的参数传递都是值传递,只不过对于对象来说,传递的是对象的引用地址的…