精华内容
下载资源
问答
  • stm32接收一帧数据
    千次阅读
    2021-01-03 22:52:57

    STM32串口中断接收一帧数据

    IDLE即串口空闲中断,串口收到一帧数据后,发生的中断。比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。STM32单片机带IDLE中断,一帧数据结束后,产生IDLE中断,利用这个中断来接收不定长的数。(产生IDLE中断后 以帧为单位进行判断)

    如何配置IDLE中断?

    RXNE中断和IDLE中断的区别

    当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。
    下面我们就配置好串口IDLE中断吧。

    /* 使能接收中断*/  
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  
    /* 使能空闲中断*/  
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);  
    USART_Cmd(USART1, ENABLE);  
    char i = 0;  
    void USART1_IRQHandler(void)  
    {  
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到一个字节  
            {      
                ch[i++] = USART_ReceiveData(USART1);   
            }   
    
     else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)//接收到一帧数据  
        { 
           USART1->SR;//先读SR  
           USART1->DR;//再读DR  
            i = 0;  
            printf("%s",ch);  
        }  
    }  
    更多相关内容
  • STM8S003F3P接收一帧数据,以#为帧头,|为帧尾,数组长度是200,可根据芯片型号和数据大小来调整,开发环境:STVD
  • STM32串口接收一帧数据的写法,数据包括帧头,功能帧,数据帧,校验位!
  • stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个...

    stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据!

    原文链接:https://blog.csdn.net/qq_35341807/article/details/79157437

    1、配置串口中断

    void USART1_Configuration(void)
    {
    	USART_InitTypeDef USART_InitStructure;
    	GPIO_InitTypeDef GPIO_InitStructure;
    	/* Configure USART1 Rx (PA.10) as input floating */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		  //¸¡¿ÕÊäÈëģʽ	   
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	/* Configure USART1 Tx (PA.09) as alternate function push-pull */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;			  //¸
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	USART_InitStructure.USART_BaudRate = 9600;						//
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;		//
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;			//
    	USART_InitStructure.USART_Parity = USART_Parity_No;				//
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;					
    	/* Configure USART1 */
    	USART_Init(USART1, &USART_InitStructure);							
    	/* Enable USART1 Receive and Transmit interrupts */
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //
    	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//
    	/* Enable the USART1 */
    	USART_Cmd(USART1, ENABLE);	                  //
    }
    

    关键

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//没收到一个字节进入一次中断
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开启串口空闲中断,每收到一帧数据进入一次中断
    

    2、串口中断函数

    处理一帧数据中所需要的内容

    一帧数据原始内容:
    在这里插入图片描述
    我要提取出这帧数据中的31.93

    char rece_buffer[BUFSIZ];
    int RxCounter;
    
    void USART1_IRQHandler(void)	
    {
    	 u8 clear=clear;
    	 USART_ClearFlag(USART1,USART_FLAG_TC);
     //接收一帧数据
    	 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)        
    	   {
     
               rece_buffer[RxCounter++]=USART1->DR;
    	   }
    		 
    	 else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
    	        {					
                    clear=USART1->SR;
                    clear=USART1->DR;						
    	              RxCounter=0;
    						
    						//温度传感器的一帧数据,对需要的内容进行提取
    						if((rece_buffer[0]=='o')&&(rece_buffer[1]=='b')&&(rece_buffer[2]=='j'))
    						{
    								if(rece_buffer[9]=='-')  //¸ºÊý
    								{
    								;
    								}
    						else
                {
    								if(rece_buffer[10]=='.')   //x.xx
    								{
    								obj=(rece_buffer[9]-0x30)*100+(rece_buffer[11]-0x30)*10+(rece_buffer[2]-0x30);
    								}
    								if(rece_buffer[11]=='.')   //xx.xx
    								{
    								obj=(rece_buffer[9]-0x30)*1000+(rece_buffer[10]-0x30)*100+(rece_buffer[12]-0x30)*10+(rece_buffer[13]-0x30);
    								}
    								if(rece_buffer[12]=='.')   //xxx.xx
    								{
    								obj=(rece_buffer[9]-0x30)*10000+(rece_buffer[10]-0x30)*1000+(rece_buffer[11]-0x30)*100+(rece_buffer[13]-0x30)*10+(rece_buffer[14]-0x30)*10;
    								}
    								
    						    obj_T=obj/100;
    						}
    						printf("目标温度:%f",obj_T);
    						}
    						//printf("%s",rece_buffer);
                    }	
    					
    }
    

    最终获得需要是数据
    在这里插入图片描述

    展开全文
  • 关于STM32串口3的使用,接收并解析一帧数据

    万次阅读 多人点赞 2020-06-03 10:21:38
    关于STM32串口3的使用,接收并解析一帧数据stm32的串口1被使用时,我们可以使用其他串口来使用。 步骤: 串口3定义、初始化; 串口3中断服务函数(接收一帧数据并判断是否正确); 主函数使用; 首先,我们要将...

    关于STM32串口3的使用,接收并解析一帧数据

    当stm32的串口1被使用时,我们可以使用其他串口来使用。

    步骤:

    1. 串口3定义、初始化;
    2. 串口3中断服务函数(接收的一帧数据并判断是否正确);
    3. 主函数使用;

    首先,我们要将串口3初始化并加上中断:

    1. 我这里使用的是STM32F103C8T6的芯片,串口3对应的引脚是PB10、PB11
      引脚

    2. 程序如下:

    /**********************************************************************************
      *函数名              :USART3_Config
      *函数功能            :USART3初始化
      *输入                :无
      *输出                :无   
    
    *******************************************************************************/
    void USART3_Config(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;     //GPIO初始化结构体声明
    USART_InitTypeDef USART_InitStructure;   //串口初始化结构体声明
    NVIC_InitTypeDef    NVIC_InitStructure;  //NVIC初始化结构体声明
    	
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);      //使能PB端口时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);    //USART3时钟
    
    	
    //USART3的Tx---GPIO----PA.10----复用推挽输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    	
    //USART3的Rx---GPIO----PA.11----浮空输入
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    	
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;             //中断通道为USART3_IRQn
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;     //设置抢占优先级2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;            //设置响应优先级2 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //通道使能
    NVIC_Init(&NVIC_InitStructure);                      //调用NVIC_Init()函数完成端口初始化
    	
    USART_InitStructure.USART_BaudRate=9600;             //设置波特率为9600
    USART_InitStructure.USART_WordLength=USART_WordLength_8b;                      //数据位8位
    USART_InitStructure.USART_StopBits=USART_StopBits_1;                           //停止位1位
    USART_InitStructure.USART_Parity=USART_Parity_No;                              //无校验位
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  //无硬件流控
    USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;   //接受和发送模式都打开
    USART_Init(USART3,&USART_InitStructure);	        //调用USART_Init()函数完成端口初始化
    
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);      //使能接收中断
    
    USART_Cmd(USART3,ENABLE);                           //使能串口3
    
    }
    
    

    注意:

    上面程序中使能时钟函数要分开,毕竟RCC_APB2Periph_GPIOB与RCC_APB1Periph_USART3是不一样的,

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);      //使能PB端口时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);    //USART3时钟
    

    而在串口1使能时钟时,却可以放在一起,比如:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
    //使能PA端口时钟、USART1时钟
    

    这个一定要注意,不然程序编译是检测不出的。

    接下来,我们就要码串口中断函数了

    1. 在中断函数里,我们可以接收到数据,并进行处理。我这里是用串口助手的hex来发送数据给STM32,故STM32接收到的数据是一个字节一个字节的。

    下面的函数是接收到数据(一个字节),并判断帧头(0xFF)是否正确,再存放在数组data(十六进制)中,继续接收数据(一个字节)存放在数组data中,接收满四个字节就结束,重新循环判断。其中COM3_RecvFin 是接收一帧数据成功的标志,主函数可以用这个来检验是否接收成功,再进行数据处理。

    void USART3_IRQHandler(void) //串口1中断服务程序
    {
    	u8 shujv;
    	if(USART_GetFlagStatus(USART3,USART_IT_RXNE) != RESET)  //接收到数据
    	{			
    		shujv=USART_ReceiveData(USART3);
    		
    		if((shujv == 0xFF)  &&  (h == 0)){h=1; data[0]=shujv; }
    		else if(h == 1){h=2; data[1]=shujv; }
    		else if(h == 2){h=3; data[2]=shujv; }
    		else if(h == 3){ COM3_RecvFin = 1;  h=0;data[3]=shujv; }
    		else h=0;
    	
    		USART_ClearITPendingBit(USART3,USART_IT_RXNE);        //清除接收标志位,每次接收完成都需要清除一下
    		while(USART_GetFlagStatus(USART3,USART_FLAG_TC) ==RESET);	  //用于检查串口UART1是否发送完成,完成时,TC中断标志置位,退出轮询等待!	
    	}
    }
    
    

    上面的方法是接收到固定长度的数据,当我们不知道数据有多长,只有帧头0xFF、帧尾0xEE,应该怎么办呢?下面就是另一种方法:

    如果检测数据的帧头是0xFF,就将Start_Receiving置1,到后面判断Start_Receiving,再将数据存在数组data中;检测到数据的帧尾是0xEE时就结束并将COM3_RecvFin置1。

    这种方法虽然可以接收不定长度的数据,但是我们的数据(不包括帧头、帧尾)出现0xEE时,数据接收就会提前结束。

    void USART3_IRQHandler(void)
    {  	     
      if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET);//接收到数据		
      {
    		shujv = USART_ReceiveData(USART3);			
    		if(shujv==0xFF)
    		{
    			Start_Receiving=1;
    		}
    		else if(shujv == 0xEE)
    		{
    			COM3_RecvFin=1;
    			Start_Receiving=0;
    			i=0;
    		}
    				
    		if(Start_Receiving==1)
    		{
    			data[i]=shujv;
    			i++;
    		}
    		USART_ClearITPendingBit(USART3,USART_IT_RXNE);        //清除接收标志位,每次接收完成都需要清除一下
    		while(USART_GetFlagStatus(USART3,USART_FLAG_TC) ==RESET);	  //用于检查串口UART1是否发送完成,完成时,TC中断标志置位,退出轮询等待!				
    	}										
    }
    

    有利有弊,两种方法你会选什么呢?

    最后,我们来码主函数了

    主函数,我这里只是码简单的,易于理解,后期能理解的天才可以添加的其他程序,使之更完美!

    int main(void)
    {
    	USART3_Config();                       //USART初始化函数
    	while(1)                               //死循环,永为真。所以用中断函数来中断
    	{
    		if(COM3_RecvFin==1)               //判断到COM3_RecvFin标志为1,表示接收成功 
        	{
                COM3_RecvFin=0;                //COM3_RecvFin标志清零,防止死循环
                USART_SendData(USART3,data[1]);//发送数组data的第2个字节,这里简单发送,可以添加自己需要的程序   
            }		
    	}
    }
    
    

    手痒的,想要试试的,记得开头添加下面的头文件、函数声明、变量定义

    /*---------头文件---------*/
    #include "stm32f10x.h"
    
    /*---------函数声明---------*/
    void USART3_Config(void);
    void USART3_IRQHandler(void);
    u8 COM3_RecvFin=0;
    u8 Start_Receiving=0;
    u8 i=0;
    unsigned  char data[10];
    

    有什么遗漏、错误,请在下面的评论写,一起交流交流。

    展开全文
  • stm32串口中断接收一帧数据

    万次阅读 多人点赞 2017-02-18 17:11:53
    最近用到stm32的串口,中断个字符个字符接收好心累,网上度了一下发现了篇好的帖子,和大家分享一下,原贴地址:http://www.51hei.com/bbs/dpj-39885-1.html 再次感谢原贴楼主的分享,为了方便大家,我把原文...

    最近用到stm32的串口,中断一个字符一个字符接收好心累,网上度了一下发现了一篇好的帖子,和大家分享一下,原贴地址:http://www.51hei.com/bbs/dpj-39885-1.html

    再次感谢原贴楼主的分享,为了方便大家,我把原文复制过来》

     

    今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。
    IDLE中断什么时候发生?
    IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。
    如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。
    看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。这个中断真是太TMD有用了。省去了好多判断的麻烦。
    如何配置好IDLE中断?
    下面我们就配置好串口IDLE中断吧。

    这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)
    (RXNE中断和IDLE中断的区别?
    当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)

     

    这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.
    需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。

     

    	/* 使能接收中断*/
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    	/* 使能空闲中断*/
    	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
    	USART_Cmd(USART1, ENABLE);

    重点是使能空闲中断。

     

     

     

    uint8_t ch[20];
    char i = 0;
    void USART1_IRQHandler(void)
    {
    
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到一个字节
    	{ 	
    	    //ch = USART1->DR;
    			ch[i++] = USART_ReceiveData(USART1);
    	
    	} 
    	else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)//接收到一帧数据
    	{
    		USART1->SR;//先读SR
    		USART1->DR;//再读DR
    		i = 0;
    		printf("%s",ch);//只是测试,所以直接在中断里调用printf
    	}
    	 
    }

     

     

     

     

     

     

     

    展开全文
  • 需求:波特率19200,接收不定长的数据,有其他单片机按字节发送,但是一帧数据有1.7ms间隔。有上位机通过VS的串口接口发送,一帧数据有200ms间隔,最后两个byte都是crc校验。同一时间只会存在一种发送方式。原方案:...
  • DMA是种不使用CPU而将数据从一片地址空间复制到另一片地址空间的总线,这样就减少了CPU的负担,使其能够更加专注于数据运算。为了能够减少CPU的负担,DMA应该采取中断方式而非查询模式。但是非常不幸的是,STM32...
  • 教你使用stm32接收串口的一帧数据

    万次阅读 多人点赞 2018-01-25 08:47:39
    stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个...
  • RX_frame_size:接收一帧数据的长度 UART_RXDATASENDBACK :为1时开启数据回传,将数据接收到的数据返回 /* USER CODE BEGIN Private defines */ #define TX_LEN 50 #define RX_LEN 50 #define UART_...
  • STM32串口通信可以分为查询,中断,DMA三种方式进行通讯,本文主要就中断的方式进行...而本文将要讨论先将其他设备发送来的数据全部接收完成,再将数据发送出去的通讯方法。(串口通讯原理图如下) 方法
  • 如下图所示为设备通信指令解析 当发送启动测距指令“01 10 00 28 00 01 ... 串口接收数据格式为 “次回复指令+n次测距数据帧” 我使用了中断和IDLE中断,结合判断头为 “01 03 2A”的方法没能成功,请教各位实现。
  • stm8s003单片机串口接收任意长度数据,并通过串口发送出去。通过定时器计时判断数据是否发生完成。若超过5ms未接收数据,认为数据接收完成,将接收到的数据发送出去。
  • stm32的串口每次接收一个字符,当我们做任务的时候,可能需要上下位机之间相互通信。并且通信数据严谨的时候,就需要严格的收发每一帧数据来保证可靠性。 本人自己写了一个简单协议,其核心思路如下: 先来说说发送...
  • 通过串口接受一帧数据请参考的我博客中的文章——教你如何使用stm32接收一帧数据! 一:在.h首先定义一个结构体。 typedef struct { uint8_t H1; uint8_t F1; uint8_t A[7]; uint8_t AN;
  • 接收一帧数据产生空闲中断,在空闲中断中将保存的数据发送出去(我是发送到串口调试助手显示)实验操作:下载程序,串口调试助手会显示预先用数组保存好的发送数据,而后通过串口调试助手上发送一串数据,程序会...
  • STM32串口接收不定长数据帧->链表数据帧说明二级目录三级目录 数据帧说明 STM32数据寄存器为USARTx->DR寄存器 二级目录 三级目录
  • DMA:开启DMA,DMA发送完一帧数据后产生发送完成中断,在DMA发送完成中断中,开启USART接收中断(字节), 在USART接收中断中保存接收到的数据。注: 本程序额外开启了USART空闲中断,在空闲中断中将 USART接收中断...
  • 代码】stm32 串口中断接收数据个字节为0。
  • [STM32] 串口数据帧处理(第弹)

    千次阅读 2021-09-06 19:10:08
    文章目录1 串口使用的常用场景2 字节处理总结 1 串口使用的常用场景 使用串口的主要目的是实现数据的交互,数据的交互的方法脱身于常用的场景。这里描述个比较典型的场景: MCU作为主控制器通过串口和外部的...
  • 写的比较垃圾,将就着用。欢迎各位大佬指导, 我这里要用串口中断接收两种帧头的数据,1. 以0x0D 0x0A为帧头的数据。... //接收标志,用于判断串口是否正在接收一帧数据 uint8_t rxBuff[20]; //用于存放接收...
  • 串口空闲中断(UART_IT_IDLE):STM32的IDLE的中断在串口无数据接收的情况下,是不会一直产生的,当清除IDLE标志位后,必须有接收到第数据后,才开始触发,接收数据断流,没有接收数据,即产生IDLE中断...
  • STM32串口按照格式接收数据,比如头为0x7E,尾为0x7F,那么程序可以接收这两个数据间的所有数据,本程序增加了数据传输超时检测功能,也就是在同一内两个数据之间的时间间隔如果超出预定的时间则接收数据状态...
  • STM32G474 FDCAN的经典CAN使用 波特率250k 接收滤波0x207 0x607 0x601 0.5s发送数据 发送内容: ID:0x222 数据帧 标准 数据长度8 内容 78 56 34 12 00 00 00 00 接收数据以中断形势接收,存放到buffer中
  • 接收采用串口的空闲中断来判断接收完成,程序下进去启动后第接收正常,往后就不行了,数据维持不变,不往缓存区写数据了,看了网上许多例程都差不多。 //启动DMA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_...
  • 测试开发板:正点原子STM32F407最小系统板子 软件:CubeMx keil 本例程针对CubeMx LL库使用过程串口接收数据丢包的问题进行...串口发送一帧数据: void USART1_Tx(uint8_t *data,uint8_t len) { int i; for(i=0;i&l
  • stm32f4双串口调试解析
  • STM32F407ZG 串口通信+固定尾传输数据帧
  • 个参数是发送的串口号,第二个参数是要发送的数据了。但是用过的朋友应该觉得不好用,次只能发送单个字符,所以我们有必要根据这个函数加以扩展: void Send_data(u8 *s) { while(*s!='\0') { while(USART...
  • stm32_cjson测试.zip

    2021-03-15 21:28:20
    该资源用于测试stm32f103c8t6使用cjson解析串口数据,并通过分析得到的键值控制led灯变化。

空空如也

空空如也

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

stm32接收一帧数据