使用STM32F4读取RS485通信传感器数据

一.目的

    最近在基于stm32f407的项目中应用了很多使用RS485进行通信的传感器设备,连接成485组网后需要进行数据的读写,在这里将一些过程写下,希望有需要的人能有个借鉴。

二.传感器说明

  本次使用rs485通信的高度计作为实验目标,我使用的是如图所示高度计:

共有四根线,两根电源线和两根rs485的线。

首先,根据高度计的说明书,使用485转串口将高度计连接到电脑上,然后使用串口调试助手将高度计设置为定时自动发送。

    比如:定时发送指令格式:

     我们可以使用串口发送AA A2 00 00 00 08来进行定时发送的设置,高度计也会返回特定 的字符表示设置成功。还可以根据需要进行返回频率等的设置。设置完成后高度计就会以特定速率一直返回数据,我们看一下数据格式:

测深仪返回的测量数据共 17 个字节,每个字节的含意如下:

字节 1:固定为 AB;

字节 2:固定为 A0;

字节 3:固定为 0D;

字节 4:测深仪的机号;

字节 5~6:第一个目标距离(最近目标距离),第一个目标距离=字节 5

×256+字节 6,单位为 1mm(SF0010 或 SF0011),单位为 10mm(其他型号);

字节 7~8:第一个目标强度(回波电平),回波电平=字节 7×256+字

节 8,数值越大表示回波信号越强;

字节 9~10:最强目标距离,最强目标距离=字节 9×256+字节 10,单

位为 1mm(SF0010 或 SF0011),单位为 10mm(其他型号);

字节 11~12:最强目标强度(回波电平),回波电平=字节 11×256+字

节 12,数值越大表示回波信号越强;

字节 13~14:最后一个目标距离(最远目标距离),最后一个目标距离=

字节 13×256+字节 14,单位为 1mm(SF0010 或 SF0011),单位为 10mm(其

他型号);

字节 15~16:最后一个目标强度(回波电平),回波电平=字节 15×256

+字节 16,数值越大表示回波信号越强;

字节 17:本条指令前 16 个字节的异或校验结果。

三.程序实现

  然后我们的主要工作就是对返回数据进行识别、校验和储存。

  

void USART2_IRQHandler(void)
{
	static uint8_t state_machine2,lencnt2,Rx_Buffer2[84];
	u8 Res;
	if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)  
  {
		Res =USART_ReceiveData(UART4); 
		if(state_machine2 == 0)// 状态机判断 
		{     
			
			if(Res== 0xAB )//高度计第一个帧头
			{
				Rx_Buffer2[lencnt2++] = Res; //写入第一帧
				state_machine2 = 1; 
				 
			}			
			else         
			{state_machine2 = 0;
			 lencnt2=0;}// ״̬»ú¸´Î»
		} 
		
		else if(state_machine2 == 1)
	  {     
				   if(Res==0xA0)// 高度计第二个帧头
				   {   
						 state_machine2 = 2;     
						 Rx_Buffer2[lencnt2++] = Res;
				   }
				   else         
					     {state_machine2 = 0;
								lencnt2=0;}
			 } 	 
		
		else if(state_machine2 == 2)
		{     
						 	Rx_Buffer2[lencnt2++] = Res; 
						    if(lencnt2>=17) //Êý¾Ý½ÓÊÕÍê±Ï
							{ 
								state_machine2 = 0;
								lencnt2=0;
								HTS_read(Rx_Buffer2);
					        }
					  }						 
	
	}	  
} 

    我们使用485通信所在的串口中断来进行判断,在这里,我们设置了一个状态机变量state_machine2,当检测到第一个帧头后变成1,进入检测第二个帧头的变量,检测成功后才会进行这一组数据的存储。完成了这一组数据的获取,我们使用一个函数HTS_read(Rx_Buffer2),这是我们自己写的,对获取的该组数据进行校验并读取到相应的数值。

void HTS_read(u8 * buf ){
	u16 high;
	u16 check=buf[0];
	for(int i=1;i<16;i++){
		check =check^buf[i];
	                   }
	if(buf[0]==0xAB&&buf[16]==check){	
		
		high  = buf[4]<<8|buf[5];
		sensors.HTS = high ;
		

	}
	
}

    对获取的一组数据进行校验位判断,因为数据是两个八位表示高度数据,所以直接将他写在了一个16位数据里。

    对于多个485传感器来说,只需要相应的设置状态机判断帧头存储,并书写相关的函数进行校验和读取就行。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32F4读取RS485通信传感器数据

发表评论