利用STM32对接收的数据进行拆帧组码——以STM32单片机串口通信为例

目的:
串口通信发送的数据是以ASCII码形式,对数据进行处理需要将ASCII码转换成数值,对数值转换成二进制,再根据帧格式对其拆帧。
流程;
1、接收串口发送的数据(串口中断服务函数)
2、将串口发送的数据转换为数值。
3、将数值转换成二进制
4、对二进制根据帧格式进行拆帧,并发送给串口显示。

STM32学习 第一次动手编程:
主函数:

int main(void)
{ 
    u16 num_r;
	u16 num_t;
	u8 t;
	u8 len;	
	u16 times=0;
    u8 b[16]={0};
	int y=0;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);		//延时初始化 
	uart_init(115200);	//串口初始化波特率为115200
	LED_Init();		  		//初始化与LED连接的硬件接口  
	while(1)
	{
    	//赋初值 不然会出错
		for(t=0;t<15;t++)
        { b[t]=0;}
	     y=0;  
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
	
			for(t=0;t<len;t++)
			{
			b[t]=USART_RX_BUF[t];//将发送的数存到数组中
			}
		
        num_r=atoi(b);  //将数组转成数值
		printf("num_r=%d\r\n",num_r); 
      //将十进制数转换成二进制			
		while(num_r!=0)  
		{
     	b[15-y]=num_r%2;
		num_r=num_r/2;
		y++;
		}
//-------以下为解码--------
		
		printf("UID=");
		for(t=0;t<4;t++)
      {  printf("%d",b[t]); 
	  }
        printf("\r\n");
	    printf("pre=");
		for(t=4;t<8;t++)
      {  printf("%d",b[t]); 
	  }
	  
	   printf("\r\n");
	   printf("type=");
	  for(t=8;t<10;t++)
      {  printf("%d",b[t]); 
	  }
	  
	   printf("\r\n");
	   printf("sub_type=");
	  for(t=10;t<14;t++)
      {  printf("%d",b[t]); 
	  }
//-------解码完成--------
	  
	  
		USART_RX_STA=0;
	}
    else
		{
			times++; 
			if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
			delay_ms(10);   
		}
	
}

}

备注:
1、atoi()为ASCII码转换为二进制函数;

u16 atoi(u8 s[])
{
	u16 i,n;
	n=0;
	for(i=0;s[i]>='0'&&s[i]<='9';i++)
	{
	n=10*n+(s[i]-'0');         
	}
	 return n;
}

2、以正点原子STM32探索者开发板为实验平台。串口发送数据会触发串口中断服务函数(此时会将USART_RX_STA赋值0x8000)

2019-08-01

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页