仪表只有一个串口,串口接了触摸屏[HMI],需要转发MQTT怎么处理

客户需求:

现场为某厂家电力仪表,只有一个串口[RS485],MODBUS-RTU协议,已经与HMI通讯,如何实现HMI不修改的情况下,完成仪表数据的MQTT上传。

解决方案:

方案1:小迈物联网网关M2一台。

方案2:小迈物联网网关NOTE2002 一台,RS232/RS485转换器一个。

网关配置过程:

1:按照正常配置MODBUS-RTU,串口为COM1,完成数据的采集和MQTT传输工作。

2:增加一个端口,配置如下:

端口类型选择:SerialPortReuse,串口为COM2。

设备参数选择:

步骤2的功能就是实现了HMI的数据采集工作。
3:保存下载到网关即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32可以通过串口HMI触摸屏。首先,需要确定HMI触摸屏的通信协议和串口通信参数。常见的协议包括RS232、RS485、TTL等。然后,STM32需要按照相应的通信协议和参数进行配置,在程序中使用串口通信相关的库函数进行数据的发送和收。最后,根据HMI触摸屏提供的指令格式和协议,STM32编写相应的控制指令,通过串口发送给HMI触摸屏,并HMI触摸屏返回的数据,从而实现与HMI触摸屏的连和数据交互。例如,使用STM32CubeMX和HAL库函数进行串口配置,代码如下: ``` #include "main.h" #include "stdio.h" #include "string.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); void uart_sendchar(UART_HandleTypeDef *huart, uint8_t char_data); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); uint8_t tx_data[10] = {'H', 'M', 'I', '\r', '\n'}; uint8_t rx_data[10]; uint16_t rx_len = 0; while (1) { HAL_UART_Transmit(&huart1, tx_data, 5, 1000); HAL_Delay(1000); rx_len = HAL_UART_Receive(&huart1, rx_data, 10, 1000); if(rx_len > 0) { printf("Received data: %s\r\n", rx_data); } memset(rx_data, 0, 10); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } if (HAL_PWREx_EnableOverDrive() != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } void uart_sendchar(UART_HandleTypeDef *huart, uint8_t char_data) { while ((huart->Instance->SR & UART_FLAG_TXE) == 0); huart->Instance->DR = (char_data & 0xFF); } void Error_Handler(void) {} #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line){} #endif static void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 在该代码中,使用UART1串口HMI触摸屏进行通信,发送"\<HMl\r\n"指令,并HMI触摸屏返回的数据并打印到串口终端。 值得注意的是,如果HMI触摸屏使用的是RS485通信协议,需要使用专用的RS485模块进行转换,并对STM32的串口进行一定的设置。具体的设置方法和原理可以参考其他相关资料和教程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值