2024-07-13 02:22:47 +00:00
|
|
|
|
/*
|
|
|
|
|
* communication_protocol.c
|
|
|
|
|
*
|
|
|
|
|
* Created on: 2024<EFBFBD><EFBFBD>5<EFBFBD><EFBFBD>18<EFBFBD><EFBFBD>
|
|
|
|
|
* Author: 34509
|
|
|
|
|
*/
|
|
|
|
|
|
2024-07-13 03:43:10 +00:00
|
|
|
|
#include <communication_protocol.h>
|
2024-07-15 09:22:55 +00:00
|
|
|
|
#include "inflash.h"
|
2024-07-17 01:40:41 +00:00
|
|
|
|
#include <string.h>
|
|
|
|
|
#include "thread_communication.h"
|
2024-07-13 02:22:47 +00:00
|
|
|
|
|
2024-07-15 09:22:55 +00:00
|
|
|
|
SL_Mppt_Scan_Broadcast_pack g_Scan_Broadcast_pack = {
|
|
|
|
|
.start_Flag = "SL",
|
|
|
|
|
.address = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
|
|
|
|
|
.function_Code = SL_Function_Code_Broadcast_Scan,
|
|
|
|
|
.check_Bit_H = 0x36,
|
|
|
|
|
.check_Bit_L = 0xE6,
|
|
|
|
|
.end_Flag = 0x16,
|
|
|
|
|
};
|
2024-07-13 02:22:47 +00:00
|
|
|
|
|
2024-07-15 09:22:55 +00:00
|
|
|
|
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
static uint8_t uart_buff[50]={0x00};
|
2024-07-13 02:22:47 +00:00
|
|
|
|
|
|
|
|
|
|
2024-07-17 01:40:41 +00:00
|
|
|
|
/* <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
static void SL_MsgProcFunc_Read_Register(device_handle device, void *pMsg, uint32_t MsgLen);
|
|
|
|
|
static void SL_MsgProcFunc_Registration_request(device_handle device, void *pMsg, uint32_t MsgLen);
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>봦<EFBFBD><EBB4A6><EFBFBD><EFBFBD> */
|
|
|
|
|
SL_FuncionMsgProcTable g_MsgTbl[] =
|
|
|
|
|
{
|
|
|
|
|
{SL_Function_Code_Read_Register, SL_MsgProcFunc_Read_Register},
|
|
|
|
|
{SL_Function_Code_Registration_request, SL_MsgProcFunc_Registration_request},
|
|
|
|
|
};
|
|
|
|
|
|
2024-07-15 09:22:55 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief У<EFBFBD><EFBFBD><EFBFBD>㷨
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
uint16_t CheckFunc(uint8_t *arr_buff, uint8_t len)
|
|
|
|
|
{
|
|
|
|
|
uint16_t crc = 0xFFFF;
|
|
|
|
|
uint16_t i, j;
|
|
|
|
|
for (j = 0; j < len; ++j) {
|
|
|
|
|
crc = crc ^ (*arr_buff++);
|
|
|
|
|
for (i = 0; i < 8; ++i) {
|
|
|
|
|
if ((crc&0x0001) > 0) {
|
|
|
|
|
crc = crc >> 1;
|
|
|
|
|
crc = crc ^ 0xa001;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
crc = crc >> 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return crc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>485<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>æ
|
|
|
|
|
* @param
|
|
|
|
|
* @retval 1 <EFBFBD><EFBFBD>æ
|
|
|
|
|
* 0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
uint8_t Check_485_bus_busy(device_handle device)
|
|
|
|
|
{
|
|
|
|
|
uart_device_info *device_info = (uart_device_info *)device;
|
|
|
|
|
if((!device) || (!device_info->init))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
USART_ITConfig(device_info->uart_index, USART_IT_RXNE, ENABLE);
|
|
|
|
|
|
|
|
|
|
uint16_t num_ago = ring_queue_length(device);
|
|
|
|
|
Delay_Ms(2);
|
|
|
|
|
uint16_t num_now = ring_queue_length(device);
|
|
|
|
|
|
|
|
|
|
USART_ITConfig(device_info->uart_index, USART_IT_RXNE, DISABLE);
|
|
|
|
|
|
|
|
|
|
if (num_now == num_ago) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-17 01:40:41 +00:00
|
|
|
|
void SL_MsgProcFunc_Read_Register(device_handle device, void *pMsg, uint32_t MsgLen)
|
|
|
|
|
{
|
|
|
|
|
memset(&MqUartSend_pack, 0, sizeof(MqUartSend_pack));
|
|
|
|
|
MqUartSend_pack.device = device;
|
|
|
|
|
MqUartSend_pack.direction = up;
|
|
|
|
|
MqUartSend_pack.len = MsgLen;
|
|
|
|
|
|
|
|
|
|
uint8_t *buf = (uint8_t *)pMsg;
|
|
|
|
|
for (uint8_t var = 0; var < MsgLen; ++var) {
|
|
|
|
|
MqUartSend_pack.recv_Data[var] = buf[var];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* <20><> <20><> <20><> Ϣ <20><> <20><> Ϣ <20><> <20><> <20><> */
|
|
|
|
|
if (rt_mq_send(mqSend, &MqUartSend_pack, MsgLen) != RT_EOK) {
|
|
|
|
|
rt_kprintf("rt_mq_send ERR\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SL_MsgProcFunc_Registration_request(device_handle device, void *pMsg, uint32_t MsgLen)
|
|
|
|
|
{
|
|
|
|
|
memset(&MqUartSend_pack, 0, sizeof(MqUartSend_pack));
|
|
|
|
|
MqUartSend_pack.device = device;
|
|
|
|
|
MqUartSend_pack.direction = down;
|
|
|
|
|
MqUartSend_pack.len = MsgLen;
|
|
|
|
|
|
|
|
|
|
uint8_t *buf = (uint8_t *)pMsg;
|
|
|
|
|
|
|
|
|
|
for (uint8_t var = 0; var < MsgLen; ++var) {
|
|
|
|
|
MqUartSend_pack.recv_Data[var] = buf[var];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* <20><> <20><> <20><> Ϣ <20><> <20><> Ϣ <20><> <20><> <20><> */
|
|
|
|
|
if (rt_mq_send(mqSend, &MqUartSend_pack, MsgLen) != RT_EOK) {
|
|
|
|
|
rt_kprintf("rt_mq_send ERR\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-07-15 09:22:55 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>־"SL"
|
|
|
|
|
* @param start_buff <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>־
|
|
|
|
|
* @retval 1 ƥ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|
|
|
|
* 0 ƥ<EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static int Match_Startflag(uint8_t start_buff[2])
|
|
|
|
|
{
|
|
|
|
|
if ((start_buff[0] == g_slConfigInfo.start_Flag[0]) && \
|
|
|
|
|
(start_buff[1] == g_slConfigInfo.start_Flag[1])) {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-17 01:40:41 +00:00
|
|
|
|
///**
|
|
|
|
|
// * @brief ƥ<><C6A5><EFBFBD>㲥<EFBFBD><E3B2A5>ַ
|
|
|
|
|
// * @param address <20><>ַ
|
|
|
|
|
// * @retval 1 ƥ<><C6A5><EFBFBD>ɹ<EFBFBD>
|
|
|
|
|
// * 0 ƥ<><C6A5>ʧ<EFBFBD><CAA7>
|
|
|
|
|
// */
|
|
|
|
|
//static int Match_Broadcastaddress(uint8_t address[7])
|
|
|
|
|
//{
|
|
|
|
|
// if (address[0] == 0xFF && \
|
|
|
|
|
// address[1] == 0xFF && \
|
|
|
|
|
// address[2] == 0xFF && \
|
|
|
|
|
// address[3] == 0xFF && \
|
|
|
|
|
// address[4] == 0xFF && \
|
|
|
|
|
// address[5] == 0xFF && \
|
|
|
|
|
// address[6] == 0xFF) {
|
|
|
|
|
//
|
|
|
|
|
// return 1;
|
|
|
|
|
// }
|
|
|
|
|
// return 0;
|
|
|
|
|
//}
|
|
|
|
|
|
2024-07-15 09:22:55 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param uart_handle <EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param buff <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param buff_size <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static int uart_read_climate_pack(device_handle uart_handle,uint8_t *buff, uint32_t buff_size)
|
|
|
|
|
{
|
2024-07-17 01:40:41 +00:00
|
|
|
|
SL_Mppt_Recv_pack *pack = (SL_Mppt_Recv_pack *)buff;
|
|
|
|
|
|
|
|
|
|
uint32_t offset = 0;
|
|
|
|
|
uint32_t len = 0;
|
|
|
|
|
uint8_t r_Flag = 0; /* <20><><EFBFBD>ı<EFBFBD>־λ */
|
|
|
|
|
uint8_t flag_run = 0;
|
|
|
|
|
|
|
|
|
|
char c = 0;
|
|
|
|
|
|
|
|
|
|
buff_size--; //Ԥ<><D4A4>һ<EFBFBD><D2BB>'\0'λ<><CEBB>
|
|
|
|
|
|
|
|
|
|
for (; offset < buff_size;){
|
|
|
|
|
if (ring_queue_length(uart_handle) == 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
c = uart_dev_in_char(uart_handle);
|
2024-07-15 09:22:55 +00:00
|
|
|
|
|
2024-07-17 01:40:41 +00:00
|
|
|
|
buff[offset++] = c;
|
2024-07-15 09:22:55 +00:00
|
|
|
|
|
2024-07-17 01:40:41 +00:00
|
|
|
|
/* ƥ<><C6A5><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>־λ */
|
|
|
|
|
if (offset == sizeof(pack->start_Flag) || (flag_run > 0)) {
|
|
|
|
|
if (!Match_Startflag(pack->start_Flag)) {
|
|
|
|
|
memcpy(buff, buff+1, offset-1);
|
|
|
|
|
offset--;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// /* ƥ<><C6A5><EFBFBD><EFBFBD>ַ */
|
|
|
|
|
// if (offset == (sizeof(pack->start_Flag) + sizeof(pack->address)) || (flag_run > 1)) {
|
|
|
|
|
// /* ƥ<><C6A5><EFBFBD>㲥<EFBFBD><E3B2A5>ַ,<2C>豸<EFBFBD><E8B1B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5> */
|
|
|
|
|
// if (Match_Broadcastaddress(pack->address)) {
|
|
|
|
|
// b_Flag = 1;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
/* ƥ<>书<EFBFBD><E4B9A6><EFBFBD><EFBFBD> */
|
|
|
|
|
if ((offset == (sizeof(pack->start_Flag) + sizeof(pack->address) + sizeof(pack->function_Code))) || (flag_run > 2)) {
|
|
|
|
|
/* <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
if (pack->function_Code == SL_Function_Code_Read_Register) {
|
|
|
|
|
r_Flag = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
else if ((pack->function_Code == SL_Function_Code_Registration_request)) {
|
|
|
|
|
len = SL_MPPT_REGISTRATIONREQUEST_PACK_SIZE;
|
|
|
|
|
r_Flag = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
if (flag_run < 2) {
|
|
|
|
|
flag_run = 2;
|
|
|
|
|
}
|
|
|
|
|
r_Flag = 0;
|
|
|
|
|
memcpy(buff, buff+1, offset-1);
|
|
|
|
|
offset--;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((1 == r_Flag) && (offset == 12)) {
|
|
|
|
|
SL_Mppt_ROReply_pack *rpack = (SL_Mppt_ROReply_pack *)buff;
|
|
|
|
|
uint8_t Register_Number = (rpack->reply_Register_Number_H << 8) | rpack->reply_Register_Number_L;
|
|
|
|
|
len = Register_Number * 2 + SL_MPPT_ROReply_PACK_SIZE - 4;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (offset == len) {
|
|
|
|
|
/* <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
if (pack->function_Code == SL_Function_Code_Read_Register) {
|
|
|
|
|
uint16_t crc_16 = buff[offset - 2] | (buff[offset - 3] << 8);
|
|
|
|
|
|
|
|
|
|
if ((CheckFunc(buff, offset - 3) != crc_16) || (buff[offset - 1] != 0x16)) {
|
|
|
|
|
if (flag_run < 3) {
|
|
|
|
|
flag_run = 3;
|
|
|
|
|
}
|
|
|
|
|
memcpy(buff, buff+1, offset-1);
|
|
|
|
|
offset--;
|
|
|
|
|
} else {
|
|
|
|
|
return offset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
SL_Mppt_RegistrationRequest_pack *rpack = (SL_Mppt_RegistrationRequest_pack *)buff;
|
|
|
|
|
|
|
|
|
|
uint16_t crc_16 = rpack->check_Bit_L | (rpack->check_Bit_H << 8);
|
|
|
|
|
if ((CheckFunc(buff, offset - 3) != crc_16) || (buff[offset - 1] != 0x16)) {
|
|
|
|
|
|
|
|
|
|
if (flag_run < 3) {
|
|
|
|
|
flag_run = 3;
|
|
|
|
|
}
|
|
|
|
|
memcpy(buff, buff+1, offset-1);
|
|
|
|
|
offset--;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
return offset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2024-07-15 09:22:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
void FRT_MsgHandler(device_handle device, uint8_t *pMsg, uint32_t MsgLen)
|
|
|
|
|
{
|
|
|
|
|
SL_Mppt_Recv_pack *pack = (SL_Mppt_Recv_pack *)pMsg;
|
|
|
|
|
|
2024-07-17 01:40:41 +00:00
|
|
|
|
for (u_int16_t i = 0; i < sizeof(g_MsgTbl) / sizeof(SL_FuncionMsgProcTable); i++) {
|
|
|
|
|
if (pack->function_Code == g_MsgTbl[i].msgId) {
|
|
|
|
|
g_MsgTbl[i].pMsgProc(device, pMsg, MsgLen);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-07-15 09:22:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
void read_and_process_uart_data(device_handle device)
|
|
|
|
|
{
|
2024-07-17 01:40:41 +00:00
|
|
|
|
if (uart_dev_char_present(device)) {
|
|
|
|
|
rt_thread_mdelay(30);
|
|
|
|
|
rt_kprintf("ring_queue_length = %d \n", ring_queue_length(device));
|
2024-07-15 09:22:55 +00:00
|
|
|
|
memset(uart_buff, 0, sizeof(uart_buff));
|
|
|
|
|
int ret = uart_read_climate_pack(device, uart_buff, sizeof(uart_buff));
|
|
|
|
|
if(ret > 0){
|
|
|
|
|
FRT_MsgHandler(device, uart_buff, ret);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-07-17 01:40:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static void send_uart_data(uint8_t *buff)
|
|
|
|
|
{
|
|
|
|
|
SL_UartSend_pack *upack = (SL_UartSend_pack *)buff;
|
|
|
|
|
|
|
|
|
|
uart_dev_write(upack->device, upack->recv_Data, upack->len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
void send_data(uint8_t *buff)
|
|
|
|
|
{
|
|
|
|
|
SL_UartSend_pack *upack = (SL_UartSend_pack *)buff;
|
|
|
|
|
|
|
|
|
|
if (upack->direction == down) {
|
|
|
|
|
send_uart_data(buff);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|