#include "slaveMcuComm.h" #include "slaveQueueUart.h" #include "slaveParameter.h" #include "uart_dev.h" #include "FreeRTOS.h" #include "task.h" #include "mcu_common.h" /* 配置文件数据类型表 */ enum { /* (1字节)对智能模块通信波特率(00H:不使用该串口, 01H:4800;02H:9600;03H:19200;04H:38400;05H:57600;06H:115200) */ J1_485_Communication_Baud_Rate = 0x0001, J3_485_Communication_Baud_Rate = 0x0002, J5_485_Communication_Baud_Rate = 0x0003, J7_485_Communication_Baud_Rate = 0x0004, J8_485_Communication_Baud_Rate = 0x0005, J9_485_Communication_Baud_Rate = 0x0006, }; /* 寄存器解析 */ static uint16_t ReadRegisterJ1Baud(void *pMsg); static uint16_t ReadRegisterJ3Baud(void *pMsg); static uint16_t ReadRegisterJ5Baud(void *pMsg); static uint16_t ReadRegisterJ7Baud(void *pMsg); static uint16_t ReadRegisterJ8Baud(void *pMsg); static uint16_t ReadRegisterJ9Baud(void *pMsg); static uint16_t WriteRegisterJ1Baud(void *pMsg); static uint16_t WriteRegisterJ3Baud(void *pMsg); static uint16_t WriteRegisterJ5Baud(void *pMsg); static uint16_t WriteRegisterJ7Baud(void *pMsg); static uint16_t WriteRegisterJ8Baud(void *pMsg); static uint16_t WriteRegisterJ9Baud(void *pMsg); /* 寄存器处理表 */ typedef uint16_t (*RegProcFunc)(void*); typedef struct _SL_RegProcTable{ uint32_t regId; RegProcFunc pRegProc; }SL_RegProcTable; /* 读取寄存器处理表 */ SL_RegProcTable g_RegTblR[] = { {J1_485_Communication_Baud_Rate, ReadRegisterJ1Baud}, {J3_485_Communication_Baud_Rate, ReadRegisterJ3Baud}, {J5_485_Communication_Baud_Rate, ReadRegisterJ5Baud}, {J7_485_Communication_Baud_Rate, ReadRegisterJ7Baud}, {J8_485_Communication_Baud_Rate, ReadRegisterJ8Baud}, {J9_485_Communication_Baud_Rate, ReadRegisterJ9Baud}, }; /* 写入寄存器处理表 */ SL_RegProcTable g_RegTblW[] = { {J1_485_Communication_Baud_Rate, WriteRegisterJ1Baud}, {J3_485_Communication_Baud_Rate, WriteRegisterJ3Baud}, {J5_485_Communication_Baud_Rate, WriteRegisterJ5Baud}, {J7_485_Communication_Baud_Rate, WriteRegisterJ7Baud}, {J8_485_Communication_Baud_Rate, WriteRegisterJ8Baud}, {J9_485_Communication_Baud_Rate, WriteRegisterJ9Baud}, }; static void SlaveMcuReadRegister(uint8_t *buff, uint8_t dataLen) { uint16_t Register_Start_Address = (buff[6] << 8) | buff[7]; uint16_t Register_Number = (buff[8] << 8) | buff[9]; /* 初始化发送内存 */ //系统内存不足,丢去当前包 uint32_t tempLen = 13 + 2 * Register_Number + slaveQueueUartSendInfoSize; if (xPortGetFreeHeapSize() < tempLen + 1024) { return; } uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen); slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff; sendBuff->length = 13 + 2 * Register_Number; sendBuff->data = Buff + slaveQueueUartSendInfoSize; uint8_t *replay_pack = sendBuff->data; /* 起始标志 */ *(replay_pack) = 'S'; *(replay_pack + 1) = 'L'; /* 端口号 */ replay_pack += 2; *(replay_pack) = SlaveMcu; /* 回复字节长度 */ replay_pack += 1; *(replay_pack) = (uint8_t)((sendBuff->length - 6) >> 8); *(replay_pack + 1) = (uint8_t)(sendBuff->length - 6); /* 功能码 */ replay_pack += 2; *(replay_pack) = SL_Function_Code_Read_Register; /* 读取寄存器起始地址 */ replay_pack += 1; *(replay_pack) = buff[6]; *(replay_pack + 1) = buff[7]; /* 回复字节长度 */ replay_pack += 2; *(replay_pack) = (uint8_t)((sendBuff->length - 13) >> 8); *(replay_pack + 1) = (uint8_t)(sendBuff->length - 13); /* 回复数据内容 */ /* 读取数据 */ for ( uint16_t pos = 0; pos < Register_Number; pos++) { for (uint16_t var = 0; var < sizeof(g_RegTblR) / sizeof(SL_RegProcTable); var++) { if (g_RegTblR[var].regId == (Register_Start_Address + pos)) { uint16_t temp = g_RegTblR[var].pRegProc(NULL); replay_pack += 2; *(replay_pack) = (uint8_t)(temp >> 8); *(replay_pack + 1) = (uint8_t)(temp); } } } /* 校验位 */ replay_pack += 2; uint16_t crc_temp = modebusCrc(sendBuff->data, sendBuff->length - 3); *replay_pack = (uint8_t)(crc_temp >> 8); replay_pack += 1; *replay_pack = (uint8_t)crc_temp; /* 结束标志 */ replay_pack += 1; *replay_pack = 0x17; /* 队列中有空间,则将发送数据 */ if (uxQueueSpacesAvailable(mcu_uart_Queue)) { xQueueSend(mcu_uart_Queue, &Buff, 10); } else { vPortFree(Buff); } } static void SlaveMcuWriteRegister(uint8_t *buff, uint8_t dataLen) { uint16_t Register_Start_Address = (buff[6] << 8) | buff[7]; uint16_t Register_Number = (buff[8] << 8) | buff[9]; /* 将数据写入到寄存器中 */ for ( uint16_t pos = 0; pos < Register_Number; pos++) { for (uint16_t i = 0; i < sizeof(g_RegTblW) / sizeof(SL_RegProcTable); i++) { if (g_RegTblW[i].regId == (Register_Start_Address + pos)) { uint16_t data = buff[10 + 2 * pos] << 8 | buff[10 + 2 * pos + 1]; g_RegTblW[i].pRegProc(&data); } } } /* 后续将数据存入配置文件中 */ } void slaveFrameDataAnalyze(uint8_t *buff, uint8_t dataLen) { uint16_t crc = (buff[dataLen - 4] << 8) | buff[dataLen - 3]; if (crc != modebusCrc(buff, dataLen - 3)) { return; } if (buff[5] == SL_Function_Code_Read_Register) { SlaveMcuReadRegister(buff, dataLen); } else if (buff[5] == SL_Function_Code_Write_Register) { SlaveMcuWriteRegister(buff, dataLen); } } /** * @brief 读取J1波特率 * @param * @retval */ uint16_t ReadRegisterJ1Baud(void *pMsg) { return baudConversionConfig(getJ1_485_Baud()); } /** * @brief 读取J3波特率 * @param * @retval */ uint16_t ReadRegisterJ3Baud(void *pMsg) { return baudConversionConfig(getJ3_485_Baud()); } /** * @brief 读取J5波特率 * @param * @retval */ uint16_t ReadRegisterJ5Baud(void *pMsg) { return baudConversionConfig(getJ5_485_Baud()); } /** * @brief 读取J7波特率 * @param * @retval */ uint16_t ReadRegisterJ7Baud(void *pMsg) { return baudConversionConfig(getJ7_485_Baud()); } /** * @brief 读取J8波特率 * @param * @retval */ uint16_t ReadRegisterJ8Baud(void *pMsg) { return baudConversionConfig(getJ8_485_Baud()); } /** * @brief 读取J9波特率 * @param * @retval */ uint16_t ReadRegisterJ9Baud(void *pMsg) { return baudConversionConfig(getJ9_485_Baud()); } /** * @brief 设置端口1波特率 * @param * @retval */ uint16_t WriteRegisterJ1Baud(void *pMsg) { setJ1_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J1_485(getJ1_485_Baud()); return 0; } /** * @brief 设置端口3波特率 * @param * @retval */ uint16_t WriteRegisterJ3Baud(void *pMsg) { setJ3_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J3_485(getJ3_485_Baud()); return 0; } /** * @brief 设置端口1波特率 * @param * @retval */ uint16_t WriteRegisterJ5Baud(void *pMsg) { setJ5_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J5_485(getJ5_485_Baud()); return 0; } /** * @brief 设置端口7波特率 * @param * @retval */ uint16_t WriteRegisterJ7Baud(void *pMsg) { setJ7_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J7_485(getJ7_485_Baud()); return 0; } /** * @brief 设置端口8波特率 * @param * @retval */ uint16_t WriteRegisterJ8Baud(void *pMsg) { setJ8_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J8_485(getJ8_485_Baud()); return 0; } /** * @brief 设置端口9波特率 * @param * @retval */ uint16_t WriteRegisterJ9Baud(void *pMsg) { setJ9_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J9_485(getJ9_485_Baud()); return 0; }