精华内容
下载资源
问答
  • STM32串口接收数据处理方法

    千次阅读 2021-03-31 09:16:44
    STM32串口接收数据处理方法 STM32串口接收定长数据处理方法 STM32串口接收定长数据的处理方法非常简单,我目前做项目都是用的这个,也可用做处理MODBUS协议,直接上代码。 void USART1_IRQHandler(void) //串口1...

    STM32串口接收数据处理方法

    STM32串口接收定长数据处理方法

    STM32串口接收定长数据的处理方法非常简单,我目前做项目都是用的这个,也可用做处理MODBUS协议,直接上代码。

    void USART1_IRQHandler(void)                	//串口1中断服务程序
    {
    	u8 Res;
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
    	{
    		USART_ClearITPendingBit(USART1,USART_IT_RXNE);     //清中断
    		Res =USART_ReceiveData(USART1);	//读取接收到的数据
    		switch(USARTReceIn)
    		{
    			case 0:
    				if((Res==SW_ID)||(Res==255))
    					USARTReceBuff[USARTReceIn++] = Res;
    				else
    					USARTReceIn = 0;
    				break;
    		
    			default:
    				USARTReceBuff[USARTReceIn++] = Res;
    				break;
    		}
    		if(USARTReceIn >= 8)
    		{
    			USARTReceFullFlag = 1;	 
    		}
         }
    } 
    

    执行逻辑解释

    首先定义一个全局变量接收完成标志位USARTReceFullFlag,假如我需要接收数据长度是8,那么在串口中断接收到数据长度>=8时,就让这个标志位置1,也可在串口中断函数中判断接收到的数据头。
    然后在其他地方执行时,直接判断标志位,进行处理相关内容,注意:需要把标志位和接收序列清零。

    if(USARTReceFullFlag)
    {
    	if((USARTReceBuff[2] == 0x01)&&(USARTReceBuff[6] == 0xcc)&&(USARTReceBuff[7] == 0xdd))
    	{
    		Play_Choice_voice(0x01);
    	}
    	USARTReceFullFlag = 0;
    	USARTReceIn = 0;
    }
    
    展开全文
  • 记录应用STM32串口收发数据时出现的问题 在使用stm32数据收发功能时出现了bug,数据发送到PC机时PC机无法正确接收。 发送数据为:sf1233445a。 sf,a,为起始与末尾校验位。 显示结果如下: 既接收数组为空。 串口...

    记录应用STM32串口收发数据时出现的问题

    在使用stm32数据收发功能时出现了bug,数据发送到PC机时PC机无法正确接收。

    发送数据为:sf1233445a。

    sf,a,为起始与末尾校验位。

    显示结果如下:
    在这里插入图片描述

    既接收数组为空。

    串口中断代码如下:

    void USART1_IRQHandler(void)			   //串口1全局中断服务函数
    {
    	u8 temp;
    	if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET )
    	{
    		USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志
    		temp = USART_ReceiveData(USART1);
    		Data_processing(temp);//数据处理函数        
      }
    }
    
    void Data_processing(int16_t data)//接收传过来的数据
    {                                     //数据处理通用
    	static u8 state = 0;	   //初始化定义过一次之后再进来不会再改
    	if(state==0&&data=='s')  
    	{
    		state=1;
    	}
    	else if(state==1&&data=='f')
    	{
    		state=2;
    		RxCounter1=0; //记录数组内数据个数
    	}
    	else if(state==2)
    	{
    		if(RxCounter1>19||data == 'a') state=3;	//the last of char is openmv[19]
    		else 		
    			{
    				RxBuffer1[RxCounter1]=data;
    				RxCounter1++;
    			}
    	}
    	else if(state==3)		//state == 3  检测是否接受到结束标志
    	{
    //		LED1 = 0, LED0 = 0;
            state = 0;
    	    RxFlag1 = 1;
    	}
      else	//wrong
    	{
    		state = 0;
    		RxCounter1=0;
    	}
    }
    

    发现问题1:

    后来经过检查发现在完成第一次接收时,将state置零,此时

    state = 0,且date != ‘s’

    既进入else状态,也就是wrong状态。

    解决问题1:

    方法:注释掉else状态后发送数据串口可以正常收发数据。

    代码存在的问题:

    其实这个算法本身并不完善,或者说有一个奇怪的特性。

    只要满足开始位为sf,截止位为a时,不论分几次发送字符串,都能发送完成。

    例如:

    第一次发送sf,第二次发送ssacc,第三次发送a时。PC机会在第三次发送结束时返回数据ssacc。但对前两次发送无反应。

    展开全文
  • stm32串口接收数据的几种方式

    千次阅读 2021-01-26 11:12:09
    stm32串口接收数据的几种方式 转载自:http://bbs.elecfans.com/jishu_357017_1_1.html 本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。 实例一...

     

    转载自:http://bbs.elecfans.com/jishu_357017_1_1.html

     

    本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。

     

    实例一:

    void USART1_IRQHandler(u8 GetData)

    {

    u8 BackData;

    if(USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) //中断产生

    {  

    USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志.

                GetData = UART1_GetByte(BackData);   //也行GetData=USART1->DR;   

    USART1_SendByte(GetData);      //发送数据

    GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED闪烁,接收成功发送完成

    delay(1000);

    GPIO_ResetBits(GPIOE, GPIO_Pin_8 );

    }

    }  

    这是最基本的,将数据接收完成后又发送出去,接收和发送在中断函数里执行,main函数里无其他要处理的。

    优点:简单,适合很少量数据传输

    缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。

     

     

    实例二:

    void USART2_IRQHandler()  

    {

    if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

    {  

    USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志

    Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2);

    Uart2_Rx_Num++;

    }

     

    if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5))  //判断最后接收的数据是否为设定值,确定数据正确性

    Uart2_Sta=1;

    if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

    {

    USART_CleaRFlag(USART2,USART_FLAG_ORE);  //读SR

    USART_ReceiveData(USART2); //读DR  

    }     

    }

       

    if( Uart2_Sta )

    {

    for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++)

    USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //发送数据

     

    Uart2_Rx_Num = 0; //初始化

    Uart2_Tx_Num = 0;

    Uart2_Sta = 0;

    }

    这是加了数据头和数据尾的接收方式,数据头和尾的个数可增加,此处只用于调试之用。中断函数用于接收数据以及判断数据的头尾,第二个函数在main函数里按照查询方式执行。

    优点:较简单,采用缓存区接收,对提高数据的正确行有一定的改善 。

    缺点:要是第一次数据接收错误,回不到初始化状态,必须复位操作 。

     

    实例三:

    vvoid USART2_IRQHandler()

    {

         if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

         {

            USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志.

            Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);

            Uart2_Rx++;

            Uart2_Rx &= 0x3F; //判断是否计数到最大

          }

          if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

          {

              USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR

              USART_ReceiveData(USART2); //读DR

           }

    }

      

    if( Uart2_Tx != Uart2_Rx )

    {

        USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据

        Uart2_Tx++;

        Uart2_Tx &= 0x3F; //判断是否计数到最大

    }  

    采用FIFO方式接收数据,由0x3F可知此处最大接收量为64个,可变,中断函数只负责收,另一函数在main函数里执行,FIFO方式发送。

    优点:发送和接收都很自由,中断占用时间少,有利于MCU处理其它。

    缺点:对数据的正确性没有判断,一概全部接收。

     

    实例四:

    void USART2_IRQHandler()

    {

         if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

         {

            USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志

            Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);

            Uart2_Rx++;

            Uart2_Rx &= 0xFF;

         }

         if(Uart2_Buffer[Uart2_Rx-1] == 0x5A) //头

            Uart2_Tx = Uart2_Rx-1;

         if((Uart2_Buffer[Uart2_Tx] == 0x5A)&&(Uart2_Buffer[Uart2_Rx-1] == 0xA5)) //检测到头的情况下检测到尾

         {

                Uart2_Len = Uart2_Rx-1- Uart2_Tx; //长度

                Uart2_Sta=1; //标志位

         }

         if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

         {

                USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR

                USART_ReceiveData(USART2); //读DR

         }

    }

     

    if( Uart2_Sta )

    {

            for(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++)

                    USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据

            Uart2_Rx = 0; //初始化

            Uart2_Tx = 0;

            Uart2_Sta = 0;

    }

     

    数据采用数据包的形式接收,接收后存放于缓存区,通过判断数据头和数据尾(可变)来判断数据的“包”及有效性,中断函数用于接收数据和判断头尾以及数据包长度,另一函数在main函数里执行,负责发送该段数据。

    优点:适合打包传输,稳定性和可靠性很有保证,可随意发送,自动挑选有效数据。

    缺点:缓存区数据长度要根据“包裹”长度设定, 要是多次接收后无头无尾,到有头有尾的那一段数据恰好跨越缓存区最前和最后位置时,可能导致本次数据丢失,不过这种情况几乎没有可能。

    展开全文
  • STM32串口接收一帧数据的写法,数据包括帧头,功能帧,数据帧,校验位!
  • 我是用一个全局变量来把串口接收到的数据传递给main.c文件处理的。 具体步骤: 1.在包含接收中断函数的.c文件(例如usart.c)中声明一个变量(u8 flag;) 2.在main.c文件中声明(extern u8 flag;),之后便可以在...

    包括两部分:接收数据和处理数据(一般是条件判断)
    首先是接收数据:
    我是用一个全局变量来把串口接收到的数据传递给main.c文件处理的。
    具体步骤:
    1.在包含接收中断函数的.c文件(例如usart.c)中声明一个变量(u8 flag;)
    2.在main.c文件中声明(extern u8 flag;),之后便可以在main函数中根据flag值条件判断,做出相应功能。

    其次是数据处理:
    需要注意的是,串口通信是二进制位的通信,也可以说是16进制通信。我们通过串口发送给单片机芯片的数据或者是单片机通过串口发送给我们的数据都是以16进制传送的,在进行条件判断时也必须以16进制(hex)来判断。
    例如
    在这里插入图片描述
    串口助手截图

    串口助手发送(hex发送):01
    单片机接收:0x01

    串口助手发送(字符发送):1
    单片机接收:0x31

    可知:当我们选择“字符发送”时,发送的不是数字,条件判断不能用1或者0x01去匹配,只能用它转换的16进制数0x31去匹配
    或者如果觉得输入16进制太麻烦,可以在串口助手接收区选择“hex显示”,就可以看到输入某个字符时它的16进制编码是多少,条件判断时匹配他的这个16进制编码就可以。

    展开全文
  • STM32串口发送数据接收数据方式总结

    万次阅读 多人点赞 2018-05-13 20:34:22
    之前写了篇关于ESP8266使用AT指令进行互相通讯的实验,在写STM32串口接发数据的程序中,觉得有必要将之前学的有关于串口方面的使用经历加以总结。 串口发送数据: 1. 串口发送数据最直接的方式就是标准调用...
  • stm32串口1串口2 DMA方式收发数据

    热门讨论 2014-08-15 22:58:24
    stm32串口1串口2,DMA方式收发数据。使用定时器定时查询DMA接收到的数据,当串口的数据空闲中断,将数据拷贝到缓冲区,交由其他程序处理。可以接收任意大小的数据包。本方法占用CPU时间极少,尤其是波特率很高时,...
  • STM32串口接收不定长数据程序,并进行处理,非常方便而且注释明确
  • 利用STM32F103ZET6的串口3接收ESP8266的数据,通过串口1打印出来。
  • 本文针对STM32串口第一个字节丢失问题进行了分析说明。
  • STM32串口自定义数据接收协议

    千次阅读 2021-09-10 16:20:16
    最近使用STM32串口数据收发,遇到了一些问题。折腾了一番,在此记录一下。
  • STM32串口接收数据

    千次阅读 2018-07-15 13:33:28
    参考:STM32串口接收粉尘传感器数据
  • 关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行相应赋值。 1 关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行响应赋值。 对于STM32而言,串口这个外设是十分重要的,如果彻底搞懂这个...
  • 串口接收 串口接收流程 编程USARTx_CR1的M位来定义字长。 编程USARTx_CR2的STOP位来定义停止位位数。 编程USARTx_BRR寄存器确定波特率。...当串口接收数据时 USARTx_SR(ISR)的RXNE位置1。表明移
  • 在MCU系统负载较重、串口收发数据频率很高、多个中断存在(如同时有定时器更新中断、外部中断、DMA中断、串口接收中断)的情况下,容易出现串口溢出错误(ORE)。该错误的主要显现形式是:程序莫名卡死在串口中断之...
  • 基于STM32F103 处理器的串口发送数据程序,使用输入输出重定向,在程序中可以使用 printf scanf
  • 关于STM32串口3的使用,接收并解析一帧数据

    千次阅读 多人点赞 2020-06-03 10:21:38
    关于STM32串口3的使用,接收并解析一帧数据stm32串口1被使用时,我们可以使用其他串口来使用。 步骤: 串口3定义、初始化; 串口3中断服务函数(接收的一帧数据并判断是否正确); 主函数使用; 首先,我们要将...
  • 因此在stm32串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据! 原文链接:...
  • stm32串口接收完整的数据包

    千次阅读 2019-07-18 17:04:30
    本文由来源昵称:太阳上乘凉 原文:... 参考了文章:《stm32串口中断接收方式详细比较》 ... 借鉴了第四种中断方式 ...串口的配置这里不做说明,仅对stm32接收中断中的数据进行解析。 数据...
  • STM32 DMA+空闲中断实现不定长数据接收STM32CubeMX配置1. 将串口设置为异步通信,波特率根据个人情况而定2. 设置串口DMA接收3. 打开串口中断代码添加1. 使能中断并开启接收2. 编写中断服务函数实验结果代码链接: ...
  • STM32串口收发数据方式总结

    千次阅读 2019-11-07 12:46:24
    最近做项目发现自己的32串口使用学的太烂了(只是懂了串口的实现原理,但是使用上-空白),就有集中学习了一下串口接收数据的方式:在ProcessOn上整理了思维导图分享如下:(主要整理接受不定长数据的方法,目前整理...
  • STM32串口数据接收 --环形缓冲区

    千次阅读 2021-02-01 11:35:57
    STM32串口数据接收 --环形缓冲区 环形缓冲区简介   在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。   在通信程序中,...
  • STM32f0HAL库,STM32CubeMX创建,串口DMA空闲中断接收fifo数据处理程序,实测可用
  • STM32串口接收不定长数据的几种方法

    千次阅读 2020-05-19 23:13:13
    在使用串口接收其他设备的数据时,应该针对数据的特点,譬如单字节与多字节、数据量大小、速度等,采用不同的接收方式。下面针对接收一帧含有多个字节的不定长数据接收方式进行讨论。 1、第一种方法:采用标志位...
  • 一文加深了解stm32串口通信接收代码

    多人点赞 2020-10-15 19:37:42
    stm32串口通信代码详解 最近在做电赛,发现一些同学在解决STM32和OpenMV通信或者其他模块串口通信时,不会写串口通信的数据处理代码,我今天就分享一下我常用的串口通信数据处理代码(主要是思路) 串口通信第一步--...
  • 串口发送数据1、串口发送数据最直接的方式就是标准调用库函数 。voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData); 第一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,996
精华内容 3,198
关键字:

stm32串口接收数据处理