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传感器来说,只需要相应的设置状态机判断帧头存储,并书写相关的函数进行校验和读取就行。

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32与RS485传感器通信的步骤如下: 1. 首先,配置STM32的串口通信功能。使用STM32的GPIO和USART模块,将其中一个USART配置为RS485模式。这可以通过设置USART的控制寄存器来实现,具体的设置可以参考STM32的官方文档和参考手册。 2. 确保RS485传感器的硬件连接正确。将RS485传感器数据线连接到STM32开发板的USART接口的RX(接收)和TX(发送)引脚。另外,还需要将RS485传感器的DE(数据使能)和RE(接收使能)引脚连接到STM32开发板上的GPIO引脚。 3. 在STM32的代码中,使用串口通信的相关函数来实现与RS485传感器通信。首先,使用GPIO控制DE和RE引脚的状态,以控制数据的发送和接收。当需要发送数据时,将DE引脚置高,RE引脚置低;当需要接收数据时,将DE引脚置低,RE引脚置高。 4. 使用USART的发送函数发送需要传输的数据到RS485传感器。可以使用STM32的HAL库或者直接操作USART寄存器来实现数据的发送。 5. 等待RS485传感器返回数据。当需要接收数据时,使用USART的接收函数从USART接收缓冲区中读取数据。可以通过轮询或者中断方式来接收数据。 6. 根据RS485传感器通信协议,解析接收到的数据。根据具体的协议,可以使用相关的函数或者算法来解析数据,并提取出需要的信息。 需要注意的是,在使用STM32与RS485传感器通信时,要确保使用的波特率和数据格式(如数据位数、停止位数)与RS485传感器的设置相匹配。此外,还需确保电源供应稳定,保持良好的地线连接,以避免通信干扰和误差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值