关于嵌入式学习随笔->8《UART串行通信原理》

1、什么是串口

串口是MCU(Microcontroller Unit;微控制单元)重要的外部接口,同时也是软件开发重要的调试手段,现如今基本上所有的MCU都会带有串口。以STM32F767为例,它的串口资源相当丰富,功能也十分强大,STM32F767IGT6最多可以提供8路串口,支持8/16倍过采样、支持自动波特率检测、支持Modbus通信、支持同步单线通信和半双工单线通信、支持LIN、支持调制解调器操作、智能卡协议和IrDA SIR ENDEC规范、具有DMA等。

处理器与外部设备通信的两种方式:

--》并行通信

-传输原理:数据各个位同时传输。
    -优点:速度快
    -缺点:占用引脚资源多

--》串行通信

-传输原理:数据按位顺序传输。
    -优点:占用引脚资源少
    -缺点:速度相对较慢

2、串行通信

按照数据传送方向,分为:

--》单工:数据传输只支持数据在一个方向上传输

--》半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;

--》全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

串行通信的通信方式:

--》同步通信:带时钟同步信号传输(SPI,IIC通信 )

--》异步通信:不带时钟同步信号(UART串口通信(通用异步收发器),单总线通信)

常见的串行通信接口:

通信标准 引脚说明 通信方式 通信方向
UART
TXD:发送端

RXD:接收端

GND:公共地

异步通信 全双工
单总线 DQ:发送/接收端 异步通信 半双工
SPI
SCK:同步时钟

MISO:主机输入,从机输出

MOSI:主机输出,从机输入

同步通信 全双工
IIC
SCL:同步时钟

SDA:数据输入/输出端

同步通信 半双工

3、异步串口通信UART

--》物理层(电气层:接口决定):通信接口(RS232,RS485,RS422,TTL)

-RXD:数据输入引脚。接收数据。

-TXD:数据发送引脚。发送数据。

TTL串口  &  RS232  & RS485  & RS422通信接口:

接口类型 逻辑1典型值 逻辑0典型值 说明 优缺点
TTL +5/3.3V 0V 一般的MCU串口引脚都支持TTL
优点:接口简单

缺点:距离在1.5米以内

RS232 -3V~-15V 3V~15V 三线,全双工
优点:距离在1.5~30米

缺点:最高传输速率20kb/s

RS485 -3V~-15V 3V~15V 两线,利用压差传输
优点:距离可达1219米,

最大传输速率10Mb/s(12米内)

RS422 -3V~-15V 3V~15V
不用共地,两线,

平衡驱动差分接收,两组电源独立


优点:隔离抗干扰性能强,

距离可达1219米,最大传输速率10Mb/s

--》 数据格式(数据层:芯片决定)

STM32串口异步通信数据格式:

-->起始位:1个逻辑0数据位开始
      -->数据位(8位或者9位)
      -->奇偶校验位(第9位)
      -->停止位(1,1.5,2位)
      -->波特率设置

STM32串口通信过程:

--》通信协议(协议层:程序决定)

通信协议往往由用户自己根据需要来编写。

  1 void bbsapp_data_cheak(void)
  2 {
  3   			switch(rxState)
  4 			{
  5 				  case waitForStart:
  6 							if(aRxBuffer2[0]  == 0x66)				           	/*起始符正确*/
  7 							{
  8 								USART2_RX_STA=1;
  9 								USART2_RX_BUF[0] = aRxBuffer2[0];
 10 								rxState = waitForData;
 11 							} else							                         /*起始符错误*/
 12 							{
 13 								rxState = waitForStart;
 14 							}
 15 					    break;
 16 				  case waitForData:
 17 							USART2_RX_BUF[USART2_RX_STA] = aRxBuffer2[0];
 18 							USART2_RX_STA++;
 19 							if (USART2_RX_STA == 6)				               /*数据接收完成,校验*/
 20 							{
 21 								rxState = waitForChksum;
 22 							}
 23 							break;
 24 				case waitForChksum:
 25 							USART2_RX_BUF[6] = aRxBuffer2[0];
 26 							if (wifi_cheak(USART2_RX_BUF))	              /*校验正确,判断结束符*/
 27 							{
 28 								rxState = waitForEnd;
 29 							} else
 30 							{
 31 								rxState = waitForStart;		                 /*校验错误*/
 32 							}
 33 							break;
 34 				case waitForEnd:
 35 							if (aRxBuffer2[0] == 0x99)				          	/*结束符正确*/
 36 							{
 37 								USART2_RX_BUF[7] = aRxBuffer2[0];
 38 								printf("USART3_RX_BUF is %d  %d  %d  %d  %d  %d  %d  %d  \r\n",USART2_RX_BUF[0],USART2_RX_BUF[1],USART2_RX_BUF[2],USART2_RX_BUF[3],USART2_RX_BUF[4],USART2_RX_BUF[5],USART2_RX_BUF[6],USART2_RX_BUF[7]);
 39                 wifiDataHandle();
 40 								app_ok=1;
 41 //                LCD_ShowNum(0,0,app_flap,10,8);
 42 							} else
 43 							{
 44 								rxState = waitForStart;		                  /*结束符错误*/
 45
 46 							}
 47 							rxState = waitForStart;
 48 							break;
 49 				default:
 50 							break;
 51 			}
 52
 53 }

串口接收数据解析

  1 void wifiDataHandle(void)
  2 {
  3 	  app_flap      =   USART2_RX_BUF[1];  //副翼      横向
  4 	  app_elevator  =   USART2_RX_BUF[2];  //升降舵    前后
  5     app_pwm       =   USART2_RX_BUF[3];  //油门
  6 	  app_rudder    =   USART2_RX_BUF[4];  //方向舵
  7 	  if((USART2_RX_BUF[5]&0x01)==0){ keyFlight=0; }else {keyFlight=1;}   //一键起飞  先置1,1秒后置0
  8 		if((USART2_RX_BUF[5]&0x02)==0){ keyLand=0; }else {keyLand=1;}       //一键降落   先置1,1秒后置0
  9 		if((USART2_RX_BUF[5]&0x04)==0){ emerStop=0; }else {emerStop=1;}     //紧急停机   每次取反
 10 		if((USART2_RX_BUF[5]&0x08)==0){ flipOne=0; }else {flipOne=1;}       //固定翻转
 11     if((USART2_RX_BUF[5]&0x10)==0){ flightMode=0; }else {flightMode=1;} //1无头  0有头
 12 		if((USART2_RX_BUF[5]&0x20)==0){ flipFour=0; }else {flipFour=1;} 		//一键翻转    点击后置1,当方向键移动过一半时清0
 13 		if((USART2_RX_BUF[5]&0x40)==0){ ledControl=0; }else {ledControl=1;} //光控制
 14 		if((USART2_RX_BUF[5]&0x80)==0){ gyroCalib=0; }else {gyroCalib=1;}   //陀螺仪校准    先置1,1秒后置0
 15
 16 		printf("app_flap app_elevator %d   %d ",app_flap,app_elevator);
 17 }

通信协议

原文地址:https://www.cnblogs.com/vcan123/p/10447860.html

时间: 2024-08-29 17:43:14

关于嵌入式学习随笔->8《UART串行通信原理》的相关文章

关于嵌入式学习随笔->4《F7系统时钟》

1.STM32有5个时钟源:HSI.HSE.LSI.LSE.PLL. -->HSI是高速内部时钟,RC振荡器,频率为16MHz,精度不高.可以直接作为系统时钟或者用作PLL时钟输入. -->HSE是告诉外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz. -->LSI是低速内部时钟,RC振荡器,频率为32KHz,提供低功耗时钟.LSI主要可以作为IWDG独立看门狗时钟,LPTimer低功耗定时器时钟以及RTC时钟. -->LSE是低速外部时钟,接频率为

关于嵌入式学习随笔->5《Systick定时器》

1.什么是Systick定时器? --->Systick定时器是一个简单的滴答定时器,对于ST的M3.M4.M7内核芯片,都有滴答定时器. --->Systick滴答定时器常常用来做延迟,或者时时操作系统的心跳时钟.这样可以节省MCU的资源,不用另外浪费一个定时器.比如UCOS系统中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick滴答定时器做UCOS的心跳时钟. --->Systick定时器就是一个系统滴答定时器,一个24位的倒计数定时器,记到0时

关于嵌入式学习随笔->6《NVIC中断优先级管理》

1.中断技术概述 在单片机应用系统中,中断技术主要用于时时检测与控制,也就是要求单片机能感及时地响应中断请求源提出的服务请求,进行快速响应并及时处理,这些工作是由单片机片内的中断系统来实现的.当中断请求源发出中断请求时,如果中断请求得到允许,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断请求,处理完中断服务请求后,再回到原来被中止的程序处(断点),继续执行被中断的主程序. 中断响应和处理过程如下图所示: 2.中断源 -->M4/M7内核支持256个中断,其中包含了16个内核中断

关于嵌入式学习随笔->13《STM32CubeMX应用4-FreeRTOS的配置》

使用FreeRTOS配置led闪烁 设置创建任务的名字和对应的弱函数名字 生成代码,在弱函数中写入相应的函数,刚生成的函授都在main.c中.点add可以添加任务. 原文地址:https://www.cnblogs.com/vcan123/p/12249995.html

关于嵌入式学习随笔->14《STM32CubeMX应用5-CAN总线的配置》

STM32CubeMX-CAN总线的配置 配置好后生成代码 关于HAL库中相关文件代码 1.HAL库滤波器设置c文件 #include "bsp_can.h" #include "main.h" extern CAN_HandleTypeDef hcan1; extern CAN_HandleTypeDef hcan2; void can_filter_init(void) { CAN_FilterTypeDef can_filter_st; can_filter_

STM32F407-串口学习1(UART协议简介)

一.前言 1.简介 写的这篇博客,是为了学习UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F407开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作的),如有不足请多多指教. 2.UART简介 嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART.I2C.SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmi

JavaWeb学习随笔

Servlet学习随笔 1.HttpServlet init(ServletConfig)------Servlet生命周期中的初始方法,默认情况是服务器创建后第一次访问这个Servlet时调用,可以修改配置信息,使其在服务器一创建时就被调用; 修改配置信息的方法-----在web.xml的<servlet>下添加<load-on-startup>x<load-on-startup>,x是正整数,越小表示优先级越高 url路径的配置,完全匹配>目录匹配>(.

嵌入式学习笔记008-裸奔篇之串口

串口是个好东西,前几篇裸奔程序由于没有串口,自己调试都是有led等来表示的,比较"苦逼",终于可以用串口了~~~,这里主要采用上一篇博文(嵌入式学习笔记007-裸奔篇之定时器),也就是串口也是用中断实现的,而且也只是在前一篇博文增加串口的初始化uart0_init(),以及在中断处理函数增加对串口的处理.只要稍微改造前一篇博文就是一个通用的中断处理程序! 这里主要实现在串口输入一个字符,接受后+2再发送到串口,所以在串口输入a 会返回c---. 由于code都有相应的注释,读者自行查看

嵌入式学习汇总

[转载]嵌入式学习网学习资料下载 (2010-07-23 15:50:15) 转载▼ 标签: 转载   网络资源 原文地址:嵌入式学习网学习资料下载作者:潇楚一生 刚才发现一个论坛上贴的一个帖子,有很多学习资料可以下载,特转发. 学习经验 1.嵌入式Linux操作系统学习规划 http://www.embedstudy.com/?action-viewnews-itemid-342 2.学习ARM嵌入式Linux开发的学习过程 http://www.embedstudy.com/?action-