gateway_mcu/CH32V303-FreeRTOS/App/application/Slave/Src/slaveMcuComm.c

321 lines
7.8 KiB
C
Raw Permalink 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 "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不使用该串口, 01H4800;02H9600;03H19200;04H38400;05H57600;06H115200) */
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;
}