#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(); } } } }