当前位置:首页 > 单片机 > 单片机
[导读]//原帖http://bbs.elecfans.com/forum.php?mod=viewthread&tid=445463//在学习过程中发现几处编译错误,并改正;//主要贴出定义、和中断函数部分;uint8_t usart_rx_buf[5][40]; //接收缓冲,最大40个字节uint8_t us

//原帖http://bbs.elecfans.com/forum.php?mod=viewthread&tid=445463

//在学习过程中发现几处编译错误,并改正;

//主要贴出定义、和中断函数部分;

uint8_t usart_rx_buf[5][40]; //接收缓冲,最大40个字节
uint8_t usart_rx_temporary[40]; //数据保存暂存器,最多能够缓存40个字节
uint8_t usartrxbuf_pagebuf=0; //最上面接受缓存的页码(5)缓存
uint8_t usart_rd_len=0; //有用信息的数据长度
uint8_t usart_rd_lentemp=0; //用来记录已读取的数据长度
uint8_t usart_rx_enableflag=0; //接收状态标记
uint8_t usart_rx_lenrightflag=0;//数据长度校验位正确标志
uint8_t usart_rx_successflag=0; //成功接收到数据信息

//中断函数

/******************************************************************************************/
//USART2 自定义串口数据收发数据校验
//串口每次发送一个字节(一个八位二进制数),没接受一个字节,

//串口中断一次,就执行一次串口中断函数。
//串口数据校验 (包头0xee)(数据长度)(...数据...)(数据长度反码)(包尾0xef)
// 每一个括号代表一个字节,而数据括号待变N个字?
/******************************************************************************************/
void USART2_IRQHandler(void) //串口2中断服务程序
{
uint8_t i,res,check_temp;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断,每接收一个字节(8位二进制数据),中断一次,每次中断(即每接收一个数据)都执行一次下列程序
{
res=USART_ReceiveData(USART2);//读取接收到的数据
if(usart_rx_enableflag==1)//到接受数据标志置位时,接受数据
{
res=USART_ReceiveData(USART2);//读取串口标志
if(usart_rd_lentemp==0)//包头后第一个数据为需要传输的数据的长度
{
usart_rd_len=res;//读取数据的长度 !!
if(usart_rd_len>=40)
{
usart_rx_lenrightflag=0;//数据长度校验清零
usart_rx_successflag=0;//数据接收成功标志清零
usart_rx_enableflag=0;//数据接收完成,数据接收启动标志清零
usart_rd_len=0; //数据长度清零
usart_rd_lentemp=0;//数据长度暂存器清零
}
}

else if(usart_rd_lentemp==usart_rd_len+1)//当读取到第usart_rd_lentemp+1个数据时,校验是否是长度信息的反码
{
check_temp=~usart_rd_len;//取数据长度校验位的反码
if(res==check_temp)//当数据长度校验正确时
usart_rx_lenrightflag=1;//数据长度校验标志置一
else
{ //当数据长度校验错误时
usart_rx_lenrightflag=0;//数据长度校验清零
usart_rx_successflag=0;//数据接收成功标志清零
usart_rx_enableflag=0;//当数据长度校验错误时,数据接收启动标志清零
usart_rd_len=0;//数据长度清零
usart_rd_lentemp=0; //数据长度暂存器清零
}
}
else if(usart_rd_lentemp==usart_rd_len+2)//当读取到第usart_rd_lentemp+2个数据时,校验包尾是否正确
{
if((res==0xef)&&(usart_rx_lenrightflag==1))//如果包尾数据与长度校验都正确
{
usart_rx_lenrightflag=0;//数据长度校验清零
usart_rx_successflag=1; //数据接收成功标志置一
usart_rx_enableflag=0;//数据接收完成,数据接收启动标志清零
//usart_rd_len=0; //数据长度清零
usart_rd_lentemp=0;//数据长度暂存器清零
}
else
{ //当包尾数据校验错误时
usart_rx_lenrightflag=0;//数据长度校验清零
usart_rx_successflag=0;//数据接收成功标志清零
usart_rx_enableflag=0;//数据接收完成,数据接收启动标志清零
usart_rd_len=0;//数据长度清零
usart_rd_lentemp=0;//数据长度暂存器清零
}
}
else usart_rx_temporary[usart_rd_lentemp-1]=res; //当usart_rd_lentemp为数据段时,将数据存到串口数据接收寄存器中

usart_rd_lentemp++;//每次记录数据,数据长度暂存器自加
if(usart_rx_successflag==1)//如果成功接收到信息数据,将缓存usart_rx_temporary[]内的数据传递给usart_rx_buf[][]
{
for(i=0;iusart_rx_buf[usartrxbuf_pagebuf][i]=usart_rx_temporary[i];
usartrxbuf_pagebuf++;//接受缓存的页码缓存自加
if(usartrxbuf_pagebuf==5) usartrxbuf_pagebuf=0;//接受缓存的页码缓存最大数为5


usart_rx_lenrightflag=0;//数据长度校验清零
usart_rx_successflag=0;//数据接收成功标志清零
usart_rx_enableflag=0;//数据接收完成,数据接收启动标志清零
usart_rd_len=0; //数据长度清零
usart_rd_lentemp=0;//数据长度暂存器清零
// USART2_SendData("successed rx!rn");
}
}
if((res==0xee)&&(usart_rx_enableflag==0))//当接受到包头(0xee)数据并且还没有成功接收完数据信息
usart_rx_enableflag=1;//说明这是包头,启动接收数据标志,进入数据接收阶段
}
USART_ClearITPendingBit(USART2, USART_IT_RXNE);//中断清除
}


//标红的地方,是和原文中不同的地方。

//首先usart_rd_len=0;这句如果存在,则在成功标志为1条件中无法给rx_buf赋值,因为i<0一直循环直接跳出;

//后面那两句如果在头则会直接进入下一个if,使数据长度也为0xEE,就错啦。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式开发中,STM32的时钟系统因其灵活性和复杂性成为开发者关注的焦点。然而,看似简单的时钟配置背后,隐藏着诸多易被忽视的陷阱,轻则导致系统不稳定,重则引发硬件损坏。本文从时钟源选择、PLL配置、总线时钟分配等关键环...

关键字: STM32 时钟系统

在嵌入式系统开发中,STM32系列微控制器的内部温度传感器因其低成本、高集成度特性,广泛应用于设备自检、环境监测等场景。然而,受芯片工艺差异和电源噪声影响,其原始数据存在±1.5℃的固有误差。本文从硬件配置、校准算法、软...

关键字: STM32 温度传感器

在能源效率与智能化需求双重驱动下,AC-DC转换器的数字控制技术正经历从传统模拟方案向全数字架构的深刻变革。基于STM32微控制器的PFM(脉冲频率调制)+PWM(脉冲宽度调制)混合调制策略,结合动态电压调整(Dynam...

关键字: AC-DC STM32

在当今数字化与智能化飞速发展的时代,数据量呈爆发式增长,对数据处理的实时性、高效性以及安全性提出了前所未有的挑战。AI 边缘计算网关,作为融合了人工智能(AI)与边缘计算技术的创新产物,正逐渐崭露头角,成为推动各行业迈向...

关键字: 数据处理 边缘计算 人工智能

当前智能家居产品需求不断增长 ,在这一背景下 ,对现有浇花装置缺陷进行了改进 ,设计出基于STM32单片机的全 自动家用浇花机器人。该设计主要由机械结构和控制系统构成 ,机械结构通过麦克纳姆轮底盘与喷洒装置的结合实现机器...

关键字: STM32 麦克纳姆轮 安全可靠 通过性强

用c++编程似乎是让你的Arduino项目起步的障碍吗?您想要一种更直观的微控制器编程方式吗?那你需要了解一下Visuino!这个图形化编程平台将复杂电子项目的创建变成了拖动和连接块的简单任务。在本文中,我们将带您完成使...

关键字: Visuino Arduino ESP32 STM32

基于STM32与LoRa技术的无线传感网络凭借其低功耗、广覆盖、抗干扰等特性,成为环境监测、工业自动化等场景的核心解决方案。然而,如何在复杂电磁环境中实现高效休眠调度与动态信道优化,成为提升网络能效与可靠性的关键挑战。本...

关键字: STM32 LoRa

在实时控制系统、高速通信协议处理及高精度数据采集等对时间敏感的应用场景中,中断响应延迟的优化直接决定了系统的可靠性与性能上限。STM32系列微控制器凭借其灵活的嵌套向量中断控制器(NVIC)、多通道直接内存访问(DMA)...

关键字: STM32 DMA

数字电源技术向高功率密度、高效率与高动态响应方向加速演进,STM32微控制器凭借其基于DSP库的算法加速能力与对LLC谐振变换器的精准控制架构,成为优化电源动态性能的核心平台。相较于传统模拟控制或通用型数字控制器,STM...

关键字: STM32 数字电源

STM32微控制器凭借其针对电机控制场景的深度优化,成为高精度、高可靠性驱动系统的核心选择。相较于通用型MCU,STM32在电机控制领域的核心优势集中体现在FOC(磁场定向控制)算法的硬件加速引擎与PWM死区时间的动态补...

关键字: STM32 电机控制
关闭