sggt/App/MODBUS/Src/modbus_485.c

340 lines
8.9 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 "modbus_485.h"
uint32_t tick_start = 0;
uint32_t tick_middle = 0;
uint32_t tick_end = 0;
uint32_t trans_log_rx = 0;
uint32_t trans_log_tx = 0;
uint8_t st_flag = 0;
//static void scom_485_send(UART_HandleTypeDef *huart, char *str)
//{
// RS485_RW(RS485_WR);
// vTaskDelay(10);
// printf("\r\n");
// usart_printf(huart, "rs485 receive:[%s]\r\n", str);
// printf("printf test_data:[%s]\r\n", str);
// RS485_RW(RS485_RD);
//}
void parse_scom_485(st_scom *scom)
{
if ((scom == &scom2_rs485) && (scom->rx_flag == TRUE))
{
scom->rx_flag = FALSE;
if ((scom->rx_buff[0] == 0xff) && (scom->rx_buff[1] == 0xff) && (scom->rx_buff[scom->rx_len - 1] == 0xaa))
{
// scom_485_send(&huart2, scom->rx_buff);
//RS485_RW(RS485_WR);
vTaskDelay(10);
HAL_UART_Transmit(&huart2, scom->rx_buff, scom->rx_len, 0xFFFF);
//RS485_RW(RS485_RD);
}
scom->rx_len = 0;
}
}
void transparent_485(st_scom *scom)
{
if(scom != &scom2_rs485) return;
//来自上位机的数据是否接收完成
if(scom->rx_flag == TRUE)
{
scom->rx_flag = FALSE;
// switch (sig_trans)
// {
// case TRANS_HART:
// {
// if ((scom->rx_buff[0] == 0xff) && (scom->rx_buff[1] == 0xff) && (scom->rx_buff[scom->rx_len - 1] == 0xaa))
// {
// //接收到的数据是否符合HART数据报符合则写入HART的tx准备发送至HART设备
// memcpy(scom1_hart.tx_buff, scom->rx_buff, sizeof(scom->rx_buff));
// scom1_hart.tx_flag = TRUE;
// }
// }
// break;
// case TRANS_BLUETOOTH:
// {
// //将接收到的数据存入BLE的tx准备发送至蓝牙设备
// memcpy(scom6_ble.tx_buff, scom->rx_buff, sizeof(scom->rx_buff));
// scom6_ble.tx_flag = TRUE;
// }
// break;
// case TRANS_MODBUS:
// {
// modbus_process_rtu();
// }
// break;
// case TRANS_NONE:
// {}
// break;
// default:
// break;
// }
//清空缓存区,等待新的数据
memset(scom->rx_buff, 0, sizeof(scom->rx_buff));
scom->rx_len = 0;
}
//数据是否准备完成
if( (scom->tx_flag == TRUE) && (sig_trans != TRANS_NONE) )
{
scom->tx_flag = FALSE;
//vTaskDelay(10);
wu_delay_us(1000);
//将数据发送至上位机
HAL_UART_Transmit(&huart2, scom->tx_buff, scom->tx_len, 0xFFFF);
//清空缓存区,等待新的数据
memset(scom->tx_buff, 0, sizeof(scom->tx_buff));
scom->tx_len = 0;
//HAL_UART_Transmit_IT(&huart2, scom->tx_buff, scom->tx_len);
xTaskResumeFromISR(task_lcdHandle);
xTaskResumeFromISR(task_menuHandle);
screen_suspend_flag = 0;
}
}
void transparent_tim(void)
{
switch (sig_trans)
{
case TRANS_NONE:
{}
break;
case TRANS_HART_TO_PC:
{
trans_hart2pc();
}
break;
case TRANS_PC_TO_HART:
{
trans_pc2hart();
}
break;
case TRANS_BLE_TO_PC:
{
trans_ble2pc();
}
break;
case TRANS_PC_TO_BLE:
{
trans_pc2ble();
}
break;
case TRANS_MODBUS_PC_TO_SIG:
{
trans_modbus_pc2sig();
}
break;
case TRANS_MODBUS_SIG_TO_SLAVE:
{
trans_modbus_sig2slave();
}
break;
default:
break;
}
}
void trans_hart2pc(void)
{
//来自HART设备的数据是否接收完成
if (scom1_hart.rx_flag == TRUE)
{
scom1_hart.rx_flag = FALSE;
//接收到的数据是否符合HART数据报符合则写入485的tx准备发送至上位机
if ((scom1_hart.rx_buff[0] == 0xff) && (scom1_hart.rx_buff[1] == 0xff) && (scom1_hart.rx_buff[scom1_hart.rx_len - 1] == 0xAA))
{
memcpy(scom2_rs485.tx_buff, scom1_hart.rx_buff, scom1_hart.rx_len);
scom2_rs485.tx_len = scom1_hart.rx_len;
scom2_rs485.tx_flag = TRUE;
}
if(scom2_rs485.tx_flag == TRUE)
{
scom2_rs485.tx_flag = FALSE;
//将数据发送至上位机
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
}
//清空缓存区,等待新的数据
memset(scom1_hart.rx_buff, 0, scom1_hart.rx_len);
scom1_hart.rx_len = 0;
}
}
void trans_pc2hart(void)
{
if (scom2_rs485.rx_flag == TRUE)
{
scom2_rs485.rx_flag = FALSE;
if ((scom2_rs485.rx_buff[0] == 0xff) && (scom2_rs485.rx_buff[1] == 0xff) && (scom2_rs485.rx_buff[scom2_rs485.rx_len - 1] == 0xaa))
{
//接收到的数据是否符合HART数据报符合则写入HART的tx准备发送至HART设备
memcpy(scom1_hart.tx_buff, scom2_rs485.rx_buff, scom2_rs485.rx_len);
scom1_hart.tx_len = scom2_rs485.rx_len;
scom1_hart.tx_flag = TRUE;
}
//来自上位机的数据是否准备完毕
if (scom1_hart.tx_flag == TRUE)
{
scom1_hart.tx_flag = FALSE;
HART_RTS(RTS_ON);
wu_delay_us(10000);
//将tx中的数据发送至HART设备
HAL_UART_Transmit_DMA(&huart1, scom1_hart.tx_buff, scom1_hart.tx_len);
}
//清空缓存区,等待新的数据
memset(scom2_rs485.rx_buff, 0, scom2_rs485.rx_len);
scom2_rs485.rx_len = 0;
}
}
void trans_ble2pc(void)
{
if( ble_init() == 0 ) return;
if (scom6_ble.rx_flag == TRUE)
{
scom6_ble.rx_flag = FALSE;
//将接收到的数据存入485的tx准备发送至上位机
memcpy(scom2_rs485.tx_buff, scom6_ble.rx_buff, scom6_ble.rx_len);
scom2_rs485.tx_len = scom6_ble.rx_len;
scom2_rs485.tx_flag = TRUE;
if(scom2_rs485.tx_flag == TRUE)
{
scom2_rs485.tx_flag = FALSE;
//将数据发送至上位机
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
}
//清空缓存区,等待新的数据
memset(scom6_ble.rx_buff, 0, scom6_ble.rx_len);
scom6_ble.rx_len = 0;
}
}
void trans_pc2ble(void)
{
if (scom2_rs485.rx_flag == TRUE)
{
scom2_rs485.rx_flag = FALSE;
//将接收到的数据存入BLE的tx准备发送至蓝牙设备
memcpy(scom6_ble.tx_buff, scom2_rs485.rx_buff, scom2_rs485.rx_len);
scom6_ble.tx_len = scom2_rs485.rx_len;
scom6_ble.tx_flag = TRUE;
//来自上位机的数据是否准备完毕
if (scom6_ble.tx_flag == TRUE)
{
scom6_ble.tx_flag = FALSE;
//将tx中的数据发送至蓝牙设备
HAL_UART_Transmit_DMA(&huart6, scom6_ble.tx_buff, scom6_ble.tx_len);
}
//清空缓存区,等待新的数据
memset(scom2_rs485.rx_buff, 0, scom2_rs485.rx_len);
scom2_rs485.rx_len = 0;
}
}
void trans_modbus_pc2sig(void)
{
if (scom2_rs485.rx_flag == TRUE)
{
scom2_rs485.rx_flag = FALSE;
modbus_process_rtu();
if(scom2_rs485.tx_flag == TRUE)
{
scom2_rs485.tx_flag = FALSE;
//将数据发送至上位机
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
}
//清空缓存区,等待新的数据
memset(scom2_rs485.rx_buff, 0, scom2_rs485.rx_len);
scom2_rs485.rx_len = 0;
}
}
void trans_modbus_sig2slave(void)
{
}
void trans_start_capture(void)
{
if( ( 1 <= (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx)) )&&( (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx)) <= 3) )
{
if(tabdata.hart_enable)
{
if (st_flag == 0)
{
st_flag = 1;
tick_start = xTaskGetTickCountFromISR();
}
}
}
if( ( 1 <= (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart6.hdmarx)) )&&( (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart6.hdmarx)) <= 3) )
{
if(tabdata.bluetooth_enable)
{
if (st_flag == 0)
{
st_flag = 1;
tick_start = xTaskGetTickCountFromISR();
}
}
}
if( ( 1 <= (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart2.hdmarx)) )&&( (BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart2.hdmarx)) <= 3) )
{
if(tabdata.hart_enable||tabdata.bluetooth_enable||tabdata.modbus_enable)
{
if (st_flag == 0)
{
st_flag = 1;
tick_start = xTaskGetTickCountFromISR();
}
}
}
}