From 41b0dbb332242781c8c2d561081abb2d3ee52ded Mon Sep 17 00:00:00 2001 From: bmy <2583236812@qq.com> Date: Wed, 27 Mar 2024 10:57:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/by_frame.c | 49 ++++++++++++++++++++++++++++--------------------- app/by_frame.h | 6 ++++-- app/main.c | 13 +++---------- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/app/by_frame.c b/app/by_frame.c index 8a0cac9..6e399ef 100644 --- a/app/by_frame.c +++ b/app/by_frame.c @@ -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; diff --git a/app/by_frame.h b/app/by_frame.h index 7b5460d..263ee91 100644 --- a/app/by_frame.h +++ b/app/by_frame.h @@ -16,11 +16,13 @@ #define BY_FRAME_UART_INDEX (UART_4) #define BY_FRAME_UART_BAUDRATE (115200) +#define BY_FRAME_DATA_NUM (3) + extern uint8_t frame_buffer[50]; extern void by_frame_init(void); -extern void by_frame_send(uint8_t data_num, uint32_t *data_array); -extern void by_frame_parse(uint8_t data_num, uint32_t *data_array); +void by_frame_send(uint32_t *data_array); +void by_frame_parse(uint32_t *data_array); extern void by_frame_parse_uart_handle(uint8_t data); #endif \ No newline at end of file diff --git a/app/main.c b/app/main.c index 344fb46..cdfe999 100644 --- a/app/main.c +++ b/app/main.c @@ -36,12 +36,9 @@ #include "by_rt_button.h" #include "by_fan_control.h" -by_vofa_t vofa_test; -float debug_array[2]; - int main(void) { - TYPE_UNION test_data[2]; + TYPE_UNION test_data[BY_FRAME_DATA_NUM]; clock_init(SYSTEM_CLOCK_120M); system_delay_init(); debug_init(); @@ -63,15 +60,11 @@ int main(void) pit_ms_init(TIM1_PIT, 1); // 运动解算,编码器 printf("ok\r\n"); - by_vofa_init(&vofa_test, BT_UART_INDEX, sizeof(debug_array) / sizeof(debug_array[0]), debug_array); while (1) { - debug_array[0] = in_pos; - debug_array[1] = out_pos; - // by_vofa_send(&vofa_test); // 发送数据 - printf("pwm:%lu,%lu,%lu,%lu\r\n", pwm_duty_ls_g, pwm_duty_rs_g, pwm_duty_lb_g, pwm_duty_rb_g); + // printf("pwm:%lu,%lu,%lu,%lu\r\n", pwm_duty_ls_g, pwm_duty_rs_g, pwm_duty_lb_g, pwm_duty_rb_g); Page_Run(); - by_frame_parse(2, &test_data[0].u32); + by_frame_parse(&test_data[0].u32); by_buzzer_run(); jj_bt_run(); in_pos = test_data[1].f32;