第一次提交
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
#include "board_comm.h"
|
||||
|
||||
|
||||
static board_comm_data_t board_comm_data;
|
||||
static USARTInstance *board_comm_usart_instance;
|
||||
static DaemonInstance *board_comm_daemon_instance;
|
||||
|
||||
// 计算简单校验和
|
||||
static uint32_t board_comm_checksum(uint8_t *data, uint8_t len)
|
||||
{
|
||||
uint32_t sum = 0;
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
sum += data[i];
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
// 解析接收到的数据包
|
||||
static void board_comm_decode(const uint8_t *buffer)
|
||||
{
|
||||
board_comm_packet_t *packet = (board_comm_packet_t *)buffer;
|
||||
|
||||
// 验证帧头
|
||||
if (packet->header[0] != 0x55 || packet->header[1] != 0xAA)
|
||||
return;
|
||||
|
||||
// 验证校验和(包含整型和浮点型数据)
|
||||
uint8_t data_len = sizeof(packet->int_data) + sizeof(packet->float_data);
|
||||
uint32_t calc_sum = board_comm_checksum((uint8_t *)packet->int_data, data_len);
|
||||
if (calc_sum != packet->checksum)
|
||||
return;
|
||||
|
||||
// 复制数据
|
||||
memcpy(board_comm_data.rx_int_data, packet->int_data, sizeof(packet->int_data));
|
||||
memcpy(board_comm_data.rx_float_data, packet->float_data, sizeof(packet->float_data));
|
||||
}
|
||||
|
||||
// 串口接收回调
|
||||
static void BoardCommRxCallback()
|
||||
{
|
||||
// 暂时注释掉 daemon 相关调用,专注于数据传输
|
||||
// DaemonReload(board_comm_daemon_instance);
|
||||
board_comm_decode(board_comm_usart_instance->recv_buff);
|
||||
}
|
||||
|
||||
// 通信丢失回调
|
||||
static void BoardCommLostCallback(void *id)
|
||||
{
|
||||
memset(board_comm_data.rx_int_data, 0, sizeof(board_comm_data.rx_int_data));
|
||||
memset(board_comm_data.rx_float_data, 0, sizeof(board_comm_data.rx_float_data));
|
||||
USARTServiceInit(board_comm_usart_instance);
|
||||
LOGWARNING("[board_comm] communication lost");
|
||||
}
|
||||
|
||||
// 初始化板间通信
|
||||
board_comm_data_t* BoardCommInit(UART_HandleTypeDef *uart_handle)
|
||||
{
|
||||
USART_Init_Config_s conf;
|
||||
conf.module_callback = BoardCommRxCallback;
|
||||
conf.usart_handle = uart_handle;
|
||||
conf.recv_buff_size = BOARD_COMM_FRAME_SIZE;
|
||||
board_comm_usart_instance = USARTRegister(&conf);
|
||||
|
||||
// 暂时注释掉 daemon 注册,专注于数据传输
|
||||
/*
|
||||
// 注册守护进程
|
||||
Daemon_Init_Config_s daemon_conf = {
|
||||
.reload_count = 20, // 200ms未收到数据视为离线
|
||||
.callback = BoardCommLostCallback,
|
||||
.owner_id = NULL,
|
||||
};
|
||||
board_comm_daemon_instance = DaemonRegister(&daemon_conf);
|
||||
*/
|
||||
|
||||
memset(&board_comm_data, 0, sizeof(board_comm_data));
|
||||
|
||||
return &board_comm_data;
|
||||
}
|
||||
|
||||
// 检查通信状态
|
||||
uint8_t BoardCommIsOnline(void)
|
||||
{
|
||||
// 暂时返回固定值,专注于数据传输
|
||||
return 1;
|
||||
// return DaemonIsOnline(board_comm_daemon_instance);
|
||||
}
|
||||
|
||||
// 发送状态数组
|
||||
void BoardCommSend(int32_t int_data[2], float float_data[2])
|
||||
{
|
||||
board_comm_packet_t packet;
|
||||
|
||||
// 设置帧头
|
||||
packet.header[0] = 0x55;
|
||||
packet.header[1] = 0xAA;
|
||||
|
||||
// 复制数据
|
||||
memcpy(packet.int_data, int_data, sizeof(packet.int_data));
|
||||
memcpy(packet.float_data, float_data, sizeof(packet.float_data));
|
||||
memcpy(board_comm_data.tx_int_data, int_data, sizeof(board_comm_data.tx_int_data));
|
||||
memcpy(board_comm_data.tx_float_data, float_data, sizeof(board_comm_data.tx_float_data));
|
||||
|
||||
// 计算校验和
|
||||
uint8_t data_len = sizeof(packet.int_data) + sizeof(packet.float_data);
|
||||
packet.checksum = board_comm_checksum((uint8_t *)packet.int_data, data_len);
|
||||
|
||||
// 发送数据
|
||||
USARTSend(board_comm_usart_instance, (uint8_t *)&packet, sizeof(packet), USART_TRANSFER_IT);
|
||||
}
|
||||
|
||||
// 获取接收到的整型数组
|
||||
int32_t* BoardCommGetIntData(void)
|
||||
{
|
||||
return board_comm_data.rx_int_data;
|
||||
}
|
||||
|
||||
// 获取接收到的浮点型数组
|
||||
float* BoardCommGetFloatData(void)
|
||||
{
|
||||
return board_comm_data.rx_float_data;
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
#ifndef BOARD_COMM_H
|
||||
#define BOARD_COMM_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "string.h"
|
||||
#include "bsp_usart.h"
|
||||
#include "daemon.h"
|
||||
#include "bsp_log.h"
|
||||
|
||||
|
||||
#define BOARD_COMM_FRAME_SIZE 22u // 帧大小: 2字节帧头 + 8字节int32 + 8字节float + 4字节校验
|
||||
#define BOARD_COMM_DATA_SIZE 16u // 数据大小: 8字节int32 + 8字节float
|
||||
|
||||
// 通信数据包结构
|
||||
typedef struct
|
||||
{
|
||||
uint8_t header[2]; // 帧头 0x55 0xAA
|
||||
int32_t int_data[2]; // 2个int32整型值
|
||||
float float_data[2]; // 2个float浮点型值
|
||||
uint32_t checksum; // 校验和
|
||||
} __attribute__((packed)) board_comm_packet_t;
|
||||
|
||||
// 板间通信实例
|
||||
typedef struct
|
||||
{
|
||||
int32_t tx_int_data[2]; // 发送的整型数组
|
||||
float tx_float_data[2]; // 发送的浮点型数组
|
||||
int32_t rx_int_data[2]; // 接收的整型数组
|
||||
float rx_float_data[2]; // 接收的浮点型数组
|
||||
} board_comm_data_t;
|
||||
|
||||
// 函数声明
|
||||
board_comm_data_t* BoardCommInit(UART_HandleTypeDef *uart_handle);
|
||||
uint8_t BoardCommIsOnline(void);
|
||||
void BoardCommSend(int32_t int_data[2], float float_data[2]);
|
||||
int32_t* BoardCommGetIntData(void);
|
||||
float* BoardCommGetFloatData(void);
|
||||
|
||||
#endif // BOARD_COMM_H
|
||||
Reference in New Issue
Block a user