STM32串口中断接收一个完整的数据帧

发布者:DreamyMoon最新更新时间:2016-06-14 来源: eefocus关键字:STM32  串口中断接收  数据帧 手机看文章 扫描二维码
随时随地手机看文章
代码运行条件:

(1) 大端发送;
(2) 上位机发送一帧数据的时间间隔不能大于主循环周期;

(3)数据帧满足下面格式: 

 

帧头部(Head)

类型(Type)

长度(Length)

值(Value)

CRC校验

2字节

1字节

1字节

X字节

2字节

     0xaa  0x55

 

       X

 

 

 

void USART6_Init (void) 
{
	GPIO_InitTypeDef	GPIO_InitStructure;
	USART_InitTypeDef	USART_InitStructure;
	NVIC_InitTypeDef	NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); //修改

	GPIO_InitStructure.GPIO_Pin	= GPIO_Pin_6|GPIO_Pin_7;//修改
	GPIO_InitStructure.GPIO_Mode	= GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType	= GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd	= GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed	= GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);//修改
	
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_USART6);//修改
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_USART6);	//修改

	NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART6,&USART_InitStructure);
	
	USART_ITConfig(USART6,USART_IT_RXNE,ENABLE);//打开接收中断
	USART_Cmd(USART6,ENABLE);
}
void USART6_IRQHandler()
{
	unsigned char rCh;
	static char rCnt = 0;
	if(USART_GetITStatus(USART6,USART_IT_RXNE) != RESET)
	{
    	    rCh = USART_ReceiveData(USART6);
	    COM6_RecvBuf[rCnt] = rCh;
	    if(rCnt == 0)     //帧头0xAA    
	    {
       		rCnt = (0xAA != rCh)?0:rCnt+1;
	    }
	    else if(rCnt == 1) //帧头0x55  
	    {
		rCnt = (0x55 != rCh)?0:rCnt+1;
	    }
	    else if(rCnt == 2) //类型type
	    {
		//这里可以根据类型的范围进行如上的处理
		rCnt++;
            }
	    else if(rCnt == 3) //长度len
	    {
		rCnt++;
            }			
	    else if(rCnt > 3) //值value
	    {
		rCnt++;
		if(rCnt == 6+COM6_RecvBuf[3])
		{             
		    rCnt = 0;
		    memcpy(COM6_RecvBufBck,COM6_RecvBuf,RECV_BUF_SZ);//缓冲
		     COM6_RecvFin = 1;  //通知主循环处理
  		}
	     }
    }
}
int  main(void)
{
    int i;
    //代码段1
    while(1)//该循环不能太慢,否则数据缓冲区会被部分修改
    {
	//代码段2
        if(COM6_RecvFin == 1)
	{
	    COM6_RecvFin = 0;
	    CMD_Analysis();//分析接收到的这帧数据
	}
        //代码段3
    }
    return  0;
}
//在以后再仔细分析数据接收较快而处理较慢的问题吧,本课题主要讨论的是如何完整的接收一个数据帧,在数据源正确的情况下不丢帧


 

关键字:STM32  串口中断接收  数据帧 引用地址:STM32串口中断接收一个完整的数据帧

上一篇:stm32串口中断接收发送实验
下一篇:STM32串口发送中断

推荐阅读最新更新时间:2024-03-16 14:57

关于stm32的USB学习笔记之USB_HW.c
#include stm32f10x_lib.h #include stm32f10x_map.h #include usbreg.h #include usbuser.h #include usbcore.h #include usb_hw.h #define _DEBUG_ #include debug.h #define USB_EP_NUM 4 /*端点缓冲区的开始地址 *因为每个缓冲块都需要一个端点描术表 *而所有的端点描述表放在,USB缓冲区的首部 *此地址是相对于USB缓冲区的地址,我认为加上Offset更好些 *这里使用2个端点 *端点0与端点1 *此时EP_BU
[单片机]
基于STM32的智能学习空调项目的定时器捕获驱动
/************************************************************************************************************************* * 函数 : TIM3.C * 功能 : 红外信号捕获和发射 * 参数 : 无 * 返回 : 无 * 依赖 : 底层读写函数 *************************************************************************************************************************/ voidIRDA
[单片机]
STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)
1.实验目的 使用高级定时器,输出两路互补的PWM输出,需要有带死区和不带死区两种情况 2.实验效果 图1:不带死区的两路互补的PWM输出 图2 :带死区的两路互补的PWM输出 3.理论部分 3.1时钟源 内部时钟(基本定时器,通用定时器时钟源来自PCLK1,但高级定时器的时钟源来自PCLK2(72M)) 实践中几乎无需使用:外部时钟模式1、外部时钟模式2 3.2时基单元 组成: 16bit预分频PSC 16bit计数器CNT 8bit重复计数器RCR(高级定时器独有) 16bit自动重装载寄存器ARR 3.3输入捕获 作用:对输入信号的上升沿/下降沿/双边沿进行捕获,测量输入信号的脉宽,和
[单片机]
<font color='red'>STM32</font>学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)
STM32 USART串口DMA 接收和发送的源码详解!
硬件平台:STM32F103ZET6; 开发环境:KEIL 4; 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。 串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1. 在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。 2. 将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道) 3. 开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是
[单片机]
STM32中关于高电平有效,低电平有效的一点理解
在学习STM32中的过程中,经常会遇到“高电平有效”,“低电平有效”等字眼,初看时很多时候就会从字面上理解,认为高电平有效的意思就是有效电平是高电平,低电平有效的意思就是有效电平是低电平的意思。而实际上,这样的理解是有误的。下面咱们以STM32的定时器中输出比较通道为例: 这幅图实际上就是一个pwm波产生的过程,对定时器不了解的可以去查阅相关手册,现在我们先看图中标号1的输出模式控制器,这里模式是指pwm模式,他的意思就是可以通过配置寄存器TIMx_CCMR1的OC1M两位,来选择pwm的模式,但是关于模式选择,手册中有这样一句话:在向下计数时,一旦TIMx_CNT TIMx_CCR1时通道1为无效电平(OC1REF=0
[单片机]
<font color='red'>STM32</font>中关于高电平有效,低电平有效的一点理解
STM32+BH1750光敏传感器获取光照强度
一、环境介绍 MCU: STM32F103ZET6 光敏传感器: BH1750数字传感器(IIC接口) 开发软件: Keil5 代码说明:使用IIC模拟时序驱动,方便移植到其他平台,采集的光照度比较灵敏. 合成的光照度返回值范围是 0~255。 0表示全黑 255表示很亮。 实测: 手机闪光灯照着的状态返回值是245左右,手捂着的状态返回值是10左右. 完整工程代码下载: https://download.csdn.net/download/xiaolong1126626497/18500653 二、BH1750介绍 三、核心代码 BH1750说明: ADDR引脚接地,地址就是0x46 3
[单片机]
STM32+BH1750光敏传感器获取光照强度
贸泽率先独家备货STMicroelectronics的STM32 LoRaWAN 探索板
最新半导体和电子元件的全球授权分销商贸泽电子(Mouser Electronics) 即日起率先备货STMicroelectronics (ST)的STM32 LoRaWAN™ 探索板。这款新型探索套件与可从贸泽电子订购的Arduino兼容I-NUCLEO-LRWAN1 STM32 LoRa™扩展板一起作为一个平台,用于了解和评估基于LoRa和FSK/OOK 射频 (RF) 通信的解决方案。         贸泽电子独家备货的 ST STM32 LoRaWAN探索套件基于一体化开放式 Murata Type ABZ模块,支持低功率广域网(LPWAN) 和LoRaWAN 远程无线协议。Type ABZ模块包含一个具有192 KB 闪
[单片机]
基于STM32的FreeRTOS开发(1)----FreeRTOS简介
为什么使用freertos FreeRTOS 是一个免费和开源的实时操作系统,它主要用于嵌入式系统。它非常轻量级,可以在很小的硬件资源上运行,因此非常适合在限制硬件资源的嵌入式系统中使用。 FreeRTOS提供了一组简单的任务管理功能,可以让您在嵌入式系统中实现多任务环境,这对于涉及多个独立功能的系统是非常重要的。它还提供了一些高级功能,如事件组、信号量、邮箱等,可用于实现任务之间的同步和通信。 FreeRTOS还提供了许多可移植性,可以在各种不同的硬件平台上运行,并且有大量的文档和示例代码可以帮助您快速上手。 总之,FreeRTOS是一个非常受欢迎的嵌入式实时操作系统,因为它简单易用,资源占用小,功能丰富,可移植性好,对于嵌入式
[单片机]
基于<font color='red'>STM32</font>的FreeRTOS开发(1)----FreeRTOS简介
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved