STM32F103 485通信开发实例(二):与HMI建立初步通信

本文探讨了如何使用STM32与威纶通TK6071iP触摸屏通过RS-485进行ModbusRTU通信。在半双工通信模式下,主机和从机实现了数据交互。通过对触摸屏配置和从机中断代码的分析,理解了数据发送机制,并识别了数值元件通信时可能出现的问题。为了完成完整通信,需要在STM32中实现ModbusRTU协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         上一篇文章研究了两个stm32芯片之间如何利用485进行数据交互,本文在此基础上,进一步研究stm32如何与嵌入式触摸屏建立通信联系。选取威纶通TK6071iP作为主机,通过其COM2上的RS-485接口,与作为从机的一块TM32F103开发板连接。

        主机与从机之间的485通信线路采用半双工形式,威纶通TK6071iP触摸屏配置采用Modbus RTU通信规约。作为从机,stm32开发板需要开发相应的Modbus RTU协议。本文首先直接采用上一篇文章中的基本程序,尝试接收上位机基于Modbus RTU通信规约发送的数据,分析数据发送机制的特点,为后续开发下位机的协议做铺垫。

一、威纶通触摸屏配置

        建立基本工程,用相应元件搭建指令/数据发送界面,进行相应配置。搭建过程可直接参考威纶通官方例程,几个主要的配置过程如下:

1、系统参数设置

2、元件设置

        首先采用多状态设置元件,然后采用数值元件,分别测试两种常用元件能不能将数据发送到从机上。

二、通信测试

 1、多状态设置元件

        从机接收中断代码:

void USART2_IRQHandler(void)
{
	u8 readd;
	u8 error;
	u8 check_temp = 0;
	u8 i;

	if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
	{
        //检测噪音、帧错误或校验错误		
        if(USART_GetFlagStatus(USART2,USART_FLAG_NE|USART_FLAG_FE|USART_FLAG_PE))
        {
            error = 1;
        }

		else
        {
            error = 0;
        }
			
		//读取接收字节
		readd = USART_ReceiveData(USART2); 
		
        //逐个读取各字节
		if((RS485_RX_CNT < 8)&&(error == 0))
		{
			RS485_RX_BUFF[RS485_RX_CNT]=res;
			RS485_RX_CNT++;			
		}
		
        //8字节读取完毕,进行数据整理,及返回数据发送
		if(RS485_RX_CNT == 8)
		{
			RS485_RX_CNT = 0;

			//首先进行数据校验
			for(i=0;i<7;i++)
			{
				check_temp += RS485_RX_BUFF[i];
			}

            //若校验通过,返回一组数据
			if(check_temp == RS485_RX_BUFF[7])
			{
				//组织返回数据
                RS485_TX_BUFF[0] = 0x10;
				RS485_TX_BUFF[1] = 0x10;
				RS485_TX_BUFF[2] = 0x10;
				RS485_TX_BUFF[3] = 0x10;
				RS485_TX_BUFF[4] = 0x10;
				RS485_TX_BUFF[5] = 0x10;
				RS485_TX_BUFF[6] = 0x10;

				//生成返回数据的校验值
				RS485_TX_BUFF[7] = 0x00;
				for(i=0;i<7;i++)
				{
					RS485_TX_BUFF[7] += RS485_TX_BUFF[i];		
				}

				//数据发送
				RS485_RN = 1;
				RS485_Send(RS485_TX_BUFF,8);
				RS485_RN = 0;
			}
            
            //若校验不通过,返回另一组数据
			else
			{
                //组织返回数据
				RS485_TX_BUFF[0] = 0x11;
				RS485_TX_BUFF[1] = 0x00;
				RS485_TX_BUFF[2] = 0x00;
				RS485_TX_BUFF[3] = 0x00;
				RS485_TX_BUFF[4] = 0x00;
				RS485_TX_BUFF[5] = 0x00;
				RS485_TX_BUFF[6] = 0x00;
				
                //生成返回数据的校验值
				RS485_TX_BUFF[7] = 0x00;
				for(i=0;i<7;i++)
				{
					RS485_TX_BUFF[7] += RS485_TX_BUFF[i];		
				}
				
                //数据发送
				RS485_RN = 1;
				RS485_Send(RS485_TX_BUFF,8);
				RS485_RN = 0;
			}
		}
	}
}

        从机收到的指令如下图,对比发现其与主机发送的格式一致。所以多状态设置元件的指令可以直接被从机接收。

 2、数值元件

        采用数值元件,触摸屏上电初始化之后,发数据之前会报错,入下图所示:

         经初步测试,根据从机得到的指令进行分析,个人认为出现错误的原因可能是由于数值元件在触摸屏上电之后,在正式发数据之前,需要与从机进行初步的通信,以确认连接通畅。此时由于从机中尚无相应的Modbus规约,无法相应来自于数值元件的通信请求,主机反复多次发送请求却得不到响应,最终导致触摸屏做出装置无响应的判断。

三、结论

        为了实现与HMI之间的完整通信,需在stm32中引入Modbus RTU通信规约,过程中需对HMI的数据发送和接收机制进行深入的测试,才能更好地实现高质量的数据交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值