321 lines
7.8 KiB
C
321 lines
7.8 KiB
C
|
||
#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;
|
||
}
|