pref: 优化通信

This commit is contained in:
bmy
2024-03-05 16:34:56 +08:00
parent 8c21e784d8
commit 2805caa10b
4 changed files with 76 additions and 17 deletions

View File

@@ -7,16 +7,21 @@
#include "lwrb.h"
#include "crc16.h"
lwrb_t lwrb_struct;
uint8_t lwrb_buffer[50];
uint8_t frame_buffer[100];
// lwrb_t lwrb_struct;
// uint8_t lwrb_buffer[50];
uint8_t frame_buffer[50];
uint8_t frame_buffer_parse[50];
uint8_t frame_parse_busy;
fifo_struct frame_fifo;
void by_frame_init(void)
{
fifo_init(&frame_fifo, FIFO_DATA_8BIT, frame_buffer, 30);
uart_init(BY_FRAME_UART_INDEX, BY_FRAME_UART_BAUDRATE, BY_FRAME_UART_TX_PIN, BY_FRAME_UART_RX_PIN);
uart_rx_interrupt(BY_FRAME_UART_INDEX, ENABLE);
lwrb_init(&lwrb_struct, lwrb_buffer, 50);
frame_parse_busy = 0;
// lwrb_init(&lwrb_struct, lwrb_buffer, 50);
}
void by_frame_send(uint8_t data_num, uint32_t *data_array)
@@ -38,13 +43,21 @@ void by_frame_parse(uint8_t data_num, uint32_t *data_array)
{
uint8_t cnt = 0;
uint8_t cnt_crc = 2;
uint8_t cnt_ptr = 0;
uint8_t data = 0;
uint8_t data_array_temp[100] = {0};
uint16_t crc_cal = 0;
uint32_t read_length = 50;
if (lwrb_get_full(&lwrb_struct) >= (4 + data_num * sizeof(uint32_t))) {
while (lwrb_read(&lwrb_struct, &data, 1)) {
if (fifo_used(&frame_fifo)) {
fifo_read_buffer(&frame_fifo, frame_buffer_parse, &read_length, FIFO_READ_AND_CLEAN);
while (1) {
if (cnt_ptr < 50) {
data = frame_buffer_parse[cnt_ptr];
cnt_ptr++;
}
// printf("char : %0.2X\r\n", data);
if ((0 == cnt) && (BY_FRAME_HEAD_1 == data)) {
cnt = 1;
data_array_temp[0] = data;
@@ -65,6 +78,7 @@ void by_frame_parse(uint8_t data_num, uint32_t *data_array)
if (cnt_crc) {
crc_cal |= ((uint16_t)data << (--cnt_crc * 8));
cnt++;
continue;
}
@@ -72,9 +86,10 @@ void by_frame_parse(uint8_t data_num, uint32_t *data_array)
// printf("CAL CRC %0.4X\r\n", crc16_check((uint8_t *)data_array_temp, 2 + data_num * sizeof(uint32_t)));
if (!cnt_crc) {
if (crc_cal == crc16_check((uint8_t *)data_array_temp, 2 + data_num * sizeof(uint32_t))) {
if (crc_cal == crc16_check(data_array_temp, 2 + data_num * sizeof(uint32_t))) {
memcpy(data_array, data_array_temp + 2, data_num * sizeof(uint32_t));
lwrb_reset(&lwrb_struct); // 处理完直接清空缓冲区,避免堆积产生处理阻塞
// lwrb_reset(&lwrb_struct); // 处理完直接清空缓冲区,避免堆积产生处理阻塞
memset(data_array_temp, 0, sizeof(data_array_temp));
// printf("parsed done!\r\n");
}
@@ -82,9 +97,51 @@ void by_frame_parse(uint8_t data_num, uint32_t *data_array)
}
}
}
// if (lwrb_get_full(&lwrb_struct) >= (4 + data_num * sizeof(uint32_t))) {
// while (lwrb_read(&lwrb_struct, &data, 1)) {
// // printf("char : %0.2X\r\n", data);
// if ((0 == cnt) && (BY_FRAME_HEAD_1 == data)) {
// cnt = 1;
// data_array_temp[0] = data;
// continue;
// }
// if ((1 == cnt) && (BY_FRAME_HEAD_2 == data)) {
// cnt = 2;
// data_array_temp[1] = data;
// continue;
// }
// if ((2 <= cnt) && (cnt < 2 + data_num * sizeof(uint32_t))) {
// data_array_temp[cnt] = data;
// cnt++;
// continue;
// }
// if (cnt_crc) {
// crc_cal |= ((uint16_t)data << (--cnt_crc * 8));
// continue;
// }
// // printf("GET CRC %0.4X\r\n", crc_cal);
// // printf("CAL CRC %0.4X\r\n", crc16_check((uint8_t *)data_array_temp, 2 + data_num * sizeof(uint32_t)));
// if (!cnt_crc) {
// if (crc_cal == crc16_check(data_array_temp, 2 + data_num * sizeof(uint32_t))) {
// memcpy(data_array, data_array_temp + 2, data_num * sizeof(uint32_t));
// lwrb_reset(&lwrb_struct); // 处理完直接清空缓冲区,避免堆积产生处理阻塞
// memset(data_array_temp, 0, sizeof(data_array_temp));
// // printf("parsed done!\r\n");
// }
// break;
// }
// }
// }
}
void by_frame_parse_uart_handle(uint8_t data)
{
lwrb_write(&lwrb_struct, &data, 1);
fifo_write_element(&frame_fifo, data);
// lwrb_write(&lwrb_struct, &data, 1);
}

View File

@@ -16,6 +16,8 @@
#define BY_FRAME_UART_INDEX (UART_4)
#define BY_FRAME_UART_BAUDRATE (115200)
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);

View File

@@ -108,9 +108,7 @@ void USART3_IRQHandler(void)
void UART4_IRQHandler(void)
{
if (USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) {
uint8_t data_s = 0;
uart_query_byte(UART_4, &data_s);
by_frame_parse_uart_handle(data_s);
by_frame_parse_uart_handle(USART_ReceiveData(UART4));
USART_ClearITPendingBit(UART4, USART_IT_RXNE);
}
}

View File

@@ -56,7 +56,7 @@ int main(void)
Page_Init();
sport_pid_init();
pit_ms_init(TIM1_PIT, 1); // 运动解算,bianmaqi
pit_ms_init(TIM1_PIT, 1); // 运动解算,编码器
printf("ok\r\n");
@@ -72,7 +72,9 @@ int main(void)
ips200_show_float(40, 60, test_data[1].f32, 4, 1);
ips200_show_float(40, 80, in_gyro, 4, 2);
ips200_show_float(40, 100, in_speed, 4, 4);
ips200_show_string(0,120,"outang"); ips200_show_float(80,120,out_angle,4,1);
ips200_show_string(0,140,"outgyr"); ips200_show_float(80,140,out_gyro,4,1);
ips200_show_string(0, 120, "outang");
ips200_show_float(80, 120, out_angle, 4, 1);
ips200_show_string(0, 140, "outgyr");
ips200_show_float(80, 140, out_gyro, 4, 1);
}
}