352 lines
9.6 KiB
C
352 lines
9.6 KiB
C
#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))
|
||
{
|
||
//SIG -> PC
|
||
memcpy(scom2_rs485.tx_buff, scom1_hart.rx_buff, sizeof(scom1_hart.rx_buff));
|
||
scom2_rs485.tx_len = scom1_hart.rx_len;
|
||
scom2_rs485.tx_flag = TRUE;
|
||
}
|
||
|
||
if(scom2_rs485.tx_flag == TRUE)
|
||
{
|
||
scom2_rs485.tx_flag = FALSE;
|
||
|
||
//wu_delay_us(500);
|
||
|
||
//将数据发送至上位机
|
||
//HAL_UART_Transmit(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len, 0xFFFF);
|
||
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom1_hart.rx_buff, 0, sizeof(scom1_hart.rx_buff));
|
||
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, sizeof(scom2_rs485.rx_buff));
|
||
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(15000);
|
||
|
||
//将tx中的数据发送至HART设备
|
||
//hart_send(&huart1, scom1_hart.tx_buff);
|
||
//HAL_UART_Transmit(&huart1, scom1_hart.tx_buff, scom1_hart.tx_len , 0xFFFF);
|
||
HAL_UART_Transmit_DMA(&huart1, scom1_hart.tx_buff, scom1_hart.tx_len);
|
||
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom2_rs485.rx_buff, 0, sizeof(scom2_rs485.rx_buff));
|
||
scom2_rs485.rx_len = 0;
|
||
}
|
||
}
|
||
|
||
void trans_ble2pc(void)
|
||
{
|
||
if (scom6_ble.rx_flag == TRUE)
|
||
{
|
||
scom6_ble.rx_flag = FALSE;
|
||
|
||
//将接收到的数据存入485的tx,准备发送至上位机
|
||
memcpy(scom2_rs485.tx_buff, scom6_ble.rx_buff, sizeof(scom6_ble.rx_buff));
|
||
scom2_rs485.tx_len = scom6_ble.rx_len;
|
||
scom2_rs485.tx_flag = TRUE;
|
||
|
||
if(scom2_rs485.tx_flag == TRUE)
|
||
{
|
||
scom2_rs485.tx_flag = FALSE;
|
||
|
||
//wu_delay_us(500);
|
||
|
||
//将数据发送至上位机
|
||
//HAL_UART_Transmit(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len, 0xFFFF);
|
||
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom6_ble.rx_buff, 0, sizeof(scom6_ble.rx_buff));
|
||
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, sizeof(scom2_rs485.rx_buff));
|
||
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中的数据发送至蓝牙设备
|
||
//ble_send(&huart6, scom6_ble.tx_buff);
|
||
//HAL_UART_Transmit(&huart6, scom6_ble.tx_buff, scom6_ble.tx_len, 0xFFFF);
|
||
HAL_UART_Transmit_DMA(&huart6, scom6_ble.tx_buff, scom6_ble.tx_len);
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom2_rs485.rx_buff, 0, sizeof(scom2_rs485.rx_buff));
|
||
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;
|
||
|
||
//wu_delay_us(500);
|
||
|
||
//将数据发送至上位机
|
||
//HAL_UART_Transmit(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len, 0xFFFF);
|
||
HAL_UART_Transmit_DMA(&huart2, scom2_rs485.tx_buff, scom2_rs485.tx_len);
|
||
}
|
||
|
||
//清空缓存区,等待新的数据
|
||
memset(scom2_rs485.rx_buff, 0, sizeof(scom2_rs485.rx_buff));
|
||
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();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|