feat: 增加通信参数

This commit is contained in:
bmy
2024-03-27 10:57:41 +08:00
parent 2e8aec0cf5
commit 41b0dbb332
3 changed files with 35 additions and 33 deletions

View File

@@ -7,8 +7,8 @@
#include "lwrb.h"
#include "crc16.h"
uint8_t frame_buffer_recv[(2 * (4 + 8)) + 1];
uint8_t frame_buffer_send[4 + 8];
uint8_t frame_buffer_recv[(2 * (4 + BY_FRAME_DATA_NUM * sizeof(uint32_t))) + 1];
uint8_t frame_buffer_send[4 + BY_FRAME_DATA_NUM * sizeof(uint32_t)];
uint8_t frame_parse_busy;
lwrb_t lwrb_ctx;
@@ -19,19 +19,22 @@ void by_frame_init(void)
uart_rx_interrupt(BY_FRAME_UART_INDEX, ENABLE);
}
void by_frame_send(uint8_t data_num, uint32_t *data_array)
void by_frame_send(uint32_t *data_array)
{
uint16_t crc_cal = 0;
uint16_t crc_cal = 0;
const uint8_t data_byte_num = BY_FRAME_DATA_NUM * sizeof(uint32_t);
frame_buffer_send[0] = BY_FRAME_HEAD_1;
frame_buffer_send[1] = BY_FRAME_HEAD_2;
memcpy(frame_buffer_send + 2, data_array, data_num * sizeof(uint32_t));
crc_cal = crc16_check(frame_buffer_send, 2 + data_num * sizeof(uint32_t));
// 当传入数组不足时,会发生越界情况
memcpy(frame_buffer_send + 2, data_array, data_byte_num);
crc_cal = crc16_check(frame_buffer_send, 2 + data_byte_num);
frame_buffer_send[2 + data_num * sizeof(uint32_t)] = (uint8_t)(crc_cal >> 8);
frame_buffer_send[3 + data_num * sizeof(uint32_t)] = (uint8_t)(crc_cal);
frame_buffer_send[2 + data_byte_num] = (uint8_t)(crc_cal >> 8);
frame_buffer_send[3 + data_byte_num] = (uint8_t)(crc_cal);
uart_write_buffer(BY_FRAME_UART_INDEX, frame_buffer_send, 4 + data_num * sizeof(uint32_t));
uart_write_buffer(BY_FRAME_UART_INDEX, frame_buffer_send, 4 + data_byte_num);
}
/**
@@ -41,15 +44,16 @@ void by_frame_send(uint8_t data_num, uint32_t *data_array)
* @param data_array
* @todo 将其中写死的数据长度按照宏定义给出
*/
void by_frame_parse(uint8_t data_num, uint32_t *data_array)
void by_frame_parse(uint32_t *data_array)
{
uint32_t len = lwrb_get_full(&lwrb_ctx); // 缓冲区大小
uint8_t status = 0; // 状态 0-未找到帧头 1-找到帧头 2-校验
uint16_t frame_start = 0; // 帧起始位置
uint8_t frame_buf[4 + 8] = {0}; // 帧
uint8_t buf[(4 + 8) * 2] = {0}; // 用于解析的数据块
uint32_t len = lwrb_get_full(&lwrb_ctx); // 缓冲区大小
uint8_t status = 0; // 状态 0-未找到帧头 1-找到帧头 2-校验
uint16_t frame_start = 0; // 帧起始位置
uint8_t frame_buf[4 + BY_FRAME_DATA_NUM * sizeof(uint32_t)] = {0}; // 帧
uint8_t buf[(4 + BY_FRAME_DATA_NUM * sizeof(uint32_t)) * 2] = {0}; // 用于解析的数据块
const uint8_t data_byte_num = BY_FRAME_DATA_NUM * sizeof(uint32_t);
if (len < 2 * (4 + 4 * data_num)) {
if (len < 2 * (4 + data_byte_num)) {
// 当前要求缓冲区满
// (x) 缓冲区内长度小于帧长度,直接返回
// 要是每次读的时候缓冲区内就只有前一帧的尾部和后一帧的头部,岂不是很尴尬
@@ -91,14 +95,14 @@ void by_frame_parse(uint8_t data_num, uint32_t *data_array)
// 开始读数据
if (1 == status) {
// 剩下的数据不够组成一帧
if ((frame_start + 4 + 8 - 1) > len) {
if ((frame_start + 4 + data_byte_num - 1) > len) {
// printf("failed! length not enough \r\n");
// 解析出错,缓冲区中没有有效帧
return;
} else {
// 复制到帧缓冲区,减一是因为之前多加了一次
memcpy(frame_buf, buf + frame_start - 1, 4 + 8);
memcpy(frame_buf, buf + frame_start - 1, 4 + data_byte_num);
// for (uint8_t i = 0; i < 12; i++) {
// printf("%02X", frame_buf[i]);
// }
@@ -111,11 +115,14 @@ void by_frame_parse(uint8_t data_num, uint32_t *data_array)
if (2 == status) // 校验 CRC
{
if ((frame_buf[2 + 8] << 8 | frame_buf[2 + 8 + 1]) == crc16_check(frame_buf, 2 + 4 * data_num)) {
if ((frame_buf[2 + data_byte_num] << 8 | frame_buf[2 + data_byte_num + 1]) == crc16_check(frame_buf, 2 + data_byte_num)) {
// 解析成功了✌
// printf("parsed done!!!!!!!!\r\n");
// 复制数据
memcpy(data_array, frame_buf + 2, 4 * data_num);
if (NULL != (frame_buf + 2)) {
memcpy(data_array, frame_buf + 2, data_byte_num);
}
return;
} else {
status = 0;