sggt/App/HART/hart.c

98 lines
2.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// #include <stdio.h>
#include <string.h>
#include "FreeRTOS.h"
#include "task.h"
#include "hart.h"
#include "gpio.h"
void hart_send(UART_HandleTypeDef *huart, uint8_t *data)
{
usart_printf(huart, (char *)data);
}
void parse_scom_hart(st_scom *scom)
{
if (scom == &scom1_hart)
{
scom->rx_flag = FALSE;
if ((scom->rx_buff[0] == 0xff) && (scom->rx_buff[1] == 0xff) && (scom->rx_buff[scom->rx_len - 1] == 0xAA))
{
;
}
scom->tx_flag = TRUE;
scom->rx_len = 0;
}
}
void hart_communicate(st_scom *scom)
{
uint8_t hart_data_test[18] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xaa};
HART_RTS(RTS_OFF);
if (scom->rx_flag == TRUE)
{
scom->rx_flag = FALSE;
parse_scom_hart(scom);
}
// scom->tx_flag = TRUE;
if (scom->tx_flag == TRUE)
{
scom->tx_flag = FALSE;
HART_RTS(RTS_ON);
vTaskDelay(5);
memcpy(scom->tx_buff, hart_data_test, sizeof(hart_data_test));
hart_send(&huart1, scom->tx_buff);
HART_RTS(RTS_OFF);
}
}
//DEVICE <---SIG---> PC
//将来自设备的HART数据装载至com485_tx将comhart_tx的HART数据发送至设备
void transparent_hart(st_scom *scom)
{
if (scom != &scom1_hart) return;
HART_RTS(RTS_OFF);
//来自HART设备的数据是否接收完成
if (scom->rx_flag == TRUE)
{
scom->rx_flag = FALSE;
//接收到的数据是否符合HART数据报符合则写入485的tx准备发送至上位机
if ((scom->rx_buff[0] == 0xff) && (scom->rx_buff[1] == 0xff) && (scom->rx_buff[scom->rx_len - 1] == 0xAA))
{
//SIG -> PC
memcpy(scom2_rs485.tx_buff, scom->rx_buff, sizeof(scom->rx_buff));
scom2_rs485.tx_len = scom->rx_len;
scom2_rs485.tx_flag = TRUE;
}
//清空缓存区,等待新的数据
memset(scom->rx_buff, 0, sizeof(scom->rx_buff));
scom->rx_len = 0;
}
//来自上位机的数据是否准备完毕
if (scom->tx_flag == TRUE)
{
scom->tx_flag = FALSE;
HART_RTS(RTS_ON);
vTaskDelay(5);
//将tx中的数据发送至HART设备
hart_send(&huart1, scom->tx_buff);
HART_RTS(RTS_OFF);
//清空缓存区,等待新的数据
memset(scom->tx_buff, 0, sizeof(scom->tx_buff));
scom->tx_len = 0;
}
}