《STM32中的通信协议.docx》由会员分享,可在线阅读,更多相关《STM32中的通信协议.docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、STM32中的通信协议STM32中的通信协议通讯协议是指在嵌入式开发中不同的硬件系统或操作系统之间进展数据交换的方式是一种数据通讯的规约。通讯协议有很多种而我今天要讲的是串口通讯协议而且是基于STM32来讲的。首先讲串口通信串口是单片机最常见的外设。常见的UART串口主要有两个线一个线是发送、一个是接收。至于串口发送数据的时候数据线上的上下电平是怎么变化的这个大众可以自行查阅相关知识我们常见的单片机自带的串口已经把这个最底层的电平级别的协议做好了我们使用的时候收发都是以一个字节为单位来进展的。举个例子:(1)我们想使用串口连接STM32的串口1到PC机然后通过PC上位机给STM32发送一个字节
2、0x01然后在STM32接收到之后判断一下是不是0x01假如是的话点亮一个小灯假如不是的话就不点亮灯。这个很多人都可以理解而且实现起来非常容易根本上几行代码就实现了。 (2)那么把刚刚的例子扩展一下假设STM32连接了很多很多灯然后我们要使用串口发送一个指令来控制所有灯这时候应该怎么操作 (3)把问题再扩展一下假设我们要控制或者通信的不是一个灯而是一个更复杂的东西比方是一个电机控制模块、是一个GPS模块、是一个物联网模块呢这些东西在数据交互的时候都有很大的数据量不可能一个一个字节去发送数据。这时候我们就可以联想一下人类是怎么交互的首先经过上万年度的潜移默化人类形成了很多种语言同一个国家的人讲话
3、根本上都可以听懂而不同国家的人讲话的时候假如不懂外语是听不懂的。这是为什么呢因为同一个国家的人讲话的时候使用的协议是一样的你讲桌子我就知道是桌子。而不同国家的人通讯协议是不一样的所以讲话的时候不能理解比方你讲apple我假如没有学过英语我就不知道你讲的是苹果。但是我学习了你的语言也就是协议。就可以听懂你讲的是苹果了。所以STM32以及PC通讯或扩展到更多的场景STM32以及GPS,其他单片机以及WIFI等等这样的通讯都需要通讯双方执行同样的协议。那么对于刚接触单片机的人而言就产生了几个问题协议是什么样的怎样执行协议还是以最简单的场景来举例子。以使用PC机发指令来控制STM32点亮8个小灯中的假
4、设干个小灯固定时长一秒到255秒之间然后关闭这样一个实际小工程为例我们如今明白了假如只发一个指令是没方法完成以上任务的。所以我们需要制定一个简单的协议。比方我STM32的程序这么写当串口收到0xAA然后又收到0x55的时候我就开场不断采集并把采集到的所有数据都放在一个数字中直到收到0xA5x5A这两个的时候就停顿采集。接下来我把采集到的数组里面的第一个拿出来使用if进展判断假如是0x01的话就点亮第一个小灯假如是0x00或其他的话就不点亮灯然后看看数组的第二个字节是多少是多少就给延时多少。相当于通过前两个字节来控制第一个灯亮灭固定时间长度。*同样的接下来的两个字节是第二个灯的亮灭以及时间长度。
5、按这样的节奏来要控制这8个灯需要16个字节。*那么我们是否可以优化一下这个协议呢假设把8个灯的亮灭信息只用一个字节来表示后面加8个字节分别用来表示每个灯的亮灭时间长度这样的话就可以用9个字节来完成这个任务。如今我们再想想假设在这个数据传输的经过中出了一点小错误其中有一个电平在跳变的时候受到了干扰没有按照发送方的数据跳变这时候接收方接收到的数据就是错误的假设这个错误发生在第一个灯的亮灭位上那这个灯就会发生错误的反响这不是发送方想要的结果。那怎样防止这种情况发生呢使用校验位校验位是什么意思呢就是我在给你发的时候我把9个字节的数据做一个运算。运算有很多种方式以求以及为例子把9个字节的数据求以及然后拿
6、出里面低八位的数据放在我要发送的9个字节后面。这样发送的内容除了0xAA,0x55,0xA5以及x5A之外还多了一个位我们把多出来的这个通过数据位运算得到的这一字节称为校验位。当发送出去之后接收方在接收完这些数据之后也对数据位做一个求以及然后取出低八位以及发送方发送过来的那个校验位做比拟假如相等讲明数据发送经过中没有出错假如不相等讲明数据发送经过中有地方出错了那么我们整个不要这一包数据了然后给发送方通知一下告诉他让他重新发送一下刚刚的数据。如今回到数据收发PC端发数据STM32端接收这时候STM32也就要每过一会儿很短暂的时间就去看看串口是否有数据收到这种方式称为扫描。扫描有一个缺点就是需要不
7、断的去看结果可能去看了一百次才有一次有数据收到这样效率太低了老板cpu肯定不快乐就给串口讲以后你自己处理有数据来了给我讲一下我去处理就行别让我自己去看手里事情多着呢。所以就有了中断中断就是当串口上有数据接了就会产生一个接收中断这时候串口就去通知老板来处理。本来要不断过来看看有没有数据如今他有数据了才通知老板老板开场还感觉不错比以前扫描的时候轻松了点。过了一段时间老板想这样每来一包数据我得去拿几十次呀太累于是扔给串口一个仓库数组然后讲我给你一个特殊的通道DMA你以后收完一包数据直接通过这个通道把数据放在这个仓库里放完了再通知我来处理别让我来一次处理一个手里事情多着呢。然后就有了串口空闲中断串口每
8、次收到一帧数据之后才会产生一个中断通知cpu处理。串口空闲中断DMA的方式简直是处理串口通讯的神器没有之二。接下来我们再想想假如我们有一天突然觉得只控制8个灯不够用了需要扩展几个呢这时候灯加上去之后协议上还要有很大的改动比方要把灯的控制位插在数据位的后面就要把校验位往后挪挪这样程序就需要改改那么有没有一种方式可以允许你在一定范围之内随意改灯的数量而不需要修改协议呢这就需要设计一个不定长的通讯协议了。既然不定长那也就意味着发送方每次都可能发送出不同长度的数据给接收方这也就要求发送方在发送数据的时候在这个数据包的前面要加上数据有几个字节这样接收方才好根据这个数量去接收串口空闲中断dma的方式不需要
9、根据这个数量去接收并且根据这个数量去解析进而控制灯。按照数据传送方式分串行通信一条数据线、合适远间隔传输并行通信多条数据线、本钱高、抗干扰性差按照通信的数据同步方式分异步通信以1个字符为1帧、发送与接收时钟不一致同步通信位同步、时钟一致按照数据的传输方向分单工只能往一个方向传播半双工数据传输可以沿两个方向但是需要分时全双工同时双向传输通信速率通常以比特率来表示单位是位/秒bps即每秒传输二进制代码的位数。之后会遇到一个波特率的概念它表示每秒传输多少个码元。一般情况下码元都是表示两种状态即比特率波特率。串口通信串口按位bit发送以及接收字节。尽管比按字节byte的并行通信慢但是串口可以在使用一根
10、线发送数据的同时用另一根线接收数据。它很简单并且可以实现远间隔通信。串口通信的接口标准有很多有RS-232、RS-232C、RS-422A、RS-485等。比拟常用的就是RS-232以及RS-485。串口通信也是仪表仪器设备常用的通信协议。I2C通信集成电路总线是两线式串行总线接口少、控制简单、通信速率较高。I2C总线只有两根双向信号线一根是数据线SDA另一根是时钟线SCL。常用在多个集成电路间的通信。SPI通信串行外围设备接口是一种高速的全双工同步的通信总线并且在芯片的管脚上只占用四根线因其硬件功能很强与SPI有关的软件就相当简单使MCU有更多的时间处理其他事务。用在通信速率较高的场合例如A
11、DC、LCD、MCU间。串口外围设备接口SPI是一种低本钱易使用的接口主要用于微控制器与外围设备芯片之间的连接。SPI接口可以用来连接存储器、A/D转换器、D/A转换器、实时时钟日历、LCD驱动、传感器、音频芯片等。SPI是一个四线接口主机输出/从机输入MOSI、主机输入/从机输出MISO、串行SCLK或者SCK、外设芯片CS/。SPI是一个同步协议接口所有的传输都参照一个共同的时钟这个时钟信号由主机产生。SPI允许芯片与外部设备以半/全双工、同步、串行方式通信。根据时钟极性以及时钟相位的不同SPI有4种工作形式如图。CAN通信控制器局域网络ControllerAreaNetwork是ISO国
12、际标准化的串行通信协议。具有已经被大众认可的高性能以及可靠性。CAN总线是半双工的固然没有单独的时钟线但是其采用位时序的方法进展同步传输。广泛应用于汽车、船舶等分布式控制系统。I2S通信集成电路内置音频总线是专门用于音频设备之间的数据传输广泛应用于各种多媒体系统。USB通信通用串行总线(UniversalSerialBus)是PC体系中的一套较新的工业标准USB具有传输速度快、使用方便、支持热插拔、连接灵敏、独立供电等优点可以连接键盘、鼠标、大容量存储设备等多种外设该接口也被广泛用于智能手机中。计算机等智能设备与外界数据的交互主要以网络以及USB接口为主。串口知识笔记1.串行接口简称串口也称串
13、行通信接口或者串行通讯接口通常指COM接口是采用串行通信方式的扩展接口。串行接口SerialInterface是指数据一位一位地顺序传送。其特点是通信线路简单只要一对传输线就可以实现双向通信可以直接利用线作为传输线进而大大降低了本钱十分适用于远间隔通信但传送速度较慢。一般是电脑后面的9针梯形接口通常采用RS232信号。2.RS-232也称标准串口最常用的一种串行通讯接口。传统的RS-232-C接口标准有22根线采用标准25芯D型插头座DB25后来使用简化为9芯D型插座DB9。RS-232采取不平衡传输方式即所谓单端通讯。由于其发送电平与接收电平的差仅为2V至3V左右所以其共模抑制才能差再加上双
14、绞线上的分布电容其传送间隔最大为约15米最高速率为20kb/s。RS-232是为点对点即只用一对收、发设备通讯而设计的其驱动器负载为37k。所以RS-232合适本地设备之间的通信。3.RS-485是从RS-422根底上开展而来的所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式二线制可实现真正的多点双向通信而采用四线连接时与RS-422一样只能实现点对多的通信即只能有一个主Master设备其余为从设备但它比RS-422有改良无论四线还是二线连接方式总线上可多接到32个设备。4.串口与并口串口形容一下就是一条车道
15、而并口就是有8个车道同一时刻能传送8位一个字节数据。但是并不是讲并口快由于8位通道之间的相互干扰串扰传输时速度就受到了限制传输容易出错。串口没有相互干扰。并口同时发送的数据量大但要比串口慢。串口硬盘就是这样被人们重视的。5.TTL电平TTL电平信号规定5V等价于逻辑“10V等价于逻辑“0(采用二进制来表示数据时)。这样的数据通信及电平规定方式被称做TTL晶体管-晶体管逻辑电平信号系统。这是计算机处理器控制的设备内部各局部之间通信的标准技术。6.串口、COM口是指的物理接口形式(硬件)TTL、RS232以及RS485是指电平标准电器信号它们电平不同需要转换以及调整。转换的芯片如MAX3485、M
16、AX3490。7.USB转TTLUSB接口以及TTL串口无法直接通信因为接口不匹配电平也不匹配需要借助外围的设备来实现接口与电平的转换。常规操作是使用CH340、CP2102这种芯片。讲讲异同点以及使用场景吧。首先I2C以及SPI都是同步协议都有时钟信号在一条总线上也都可以挂多个从设备但是I2C的从设备是通过地址来区分的SPI的从设备是通过片选线来区分的所以SPI总线上每多挂一个从设备就要多用一个线作为片选线而I2C那么不用只要地址不冲突可以随意挂设备。但是I2C总线速度一般普遍慢于SPII2C一般的速度是100kbs、400kbps以及1Mbps而SPI的速度可以在几Mbps可以以10Mbps。所以看使用场合低速的话I2C就挺适宜的假如速度快一些那么一般都要选用SPI。另外I2C总线的管脚都是开漏输出必须外接上拉电阻阻值可以根据总线速度来推算一般我们常用400kbps传输速率上拉电阻选用2.2K。UART以及SPI、I2C不同他是异步传输的一般来讲传输速度比拟慢传统的传输速度一般在115200bps或者以下不过如今大局部UART控制器也能支持到4Mbps或8Mbps了。UART目前最常用的就是调试接口因为UART比拟简单所以CPU输出log一般都通过一个UART口来输出。