pref: 优化通信
This commit is contained in:
@@ -7,16 +7,21 @@
|
|||||||
#include "lwrb.h"
|
#include "lwrb.h"
|
||||||
#include "crc16.h"
|
#include "crc16.h"
|
||||||
|
|
||||||
lwrb_t lwrb_struct;
|
// lwrb_t lwrb_struct;
|
||||||
uint8_t lwrb_buffer[50];
|
// uint8_t lwrb_buffer[50];
|
||||||
uint8_t frame_buffer[100];
|
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)
|
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_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);
|
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)
|
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 = 0;
|
||||||
uint8_t cnt_crc = 2;
|
uint8_t cnt_crc = 2;
|
||||||
|
uint8_t cnt_ptr = 0;
|
||||||
uint8_t data = 0;
|
uint8_t data = 0;
|
||||||
uint8_t data_array_temp[100] = {0};
|
uint8_t data_array_temp[100] = {0};
|
||||||
uint16_t crc_cal = 0;
|
uint16_t crc_cal = 0;
|
||||||
|
uint32_t read_length = 50;
|
||||||
|
|
||||||
if (lwrb_get_full(&lwrb_struct) >= (4 + data_num * sizeof(uint32_t))) {
|
if (fifo_used(&frame_fifo)) {
|
||||||
while (lwrb_read(&lwrb_struct, &data, 1)) {
|
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);
|
// printf("char : %0.2X\r\n", data);
|
||||||
|
|
||||||
if ((0 == cnt) && (BY_FRAME_HEAD_1 == data)) {
|
if ((0 == cnt) && (BY_FRAME_HEAD_1 == data)) {
|
||||||
cnt = 1;
|
cnt = 1;
|
||||||
data_array_temp[0] = data;
|
data_array_temp[0] = data;
|
||||||
@@ -65,6 +78,7 @@ void by_frame_parse(uint8_t data_num, uint32_t *data_array)
|
|||||||
|
|
||||||
if (cnt_crc) {
|
if (cnt_crc) {
|
||||||
crc_cal |= ((uint16_t)data << (--cnt_crc * 8));
|
crc_cal |= ((uint16_t)data << (--cnt_crc * 8));
|
||||||
|
cnt++;
|
||||||
continue;
|
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)));
|
// printf("CAL CRC %0.4X\r\n", crc16_check((uint8_t *)data_array_temp, 2 + data_num * sizeof(uint32_t)));
|
||||||
|
|
||||||
if (!cnt_crc) {
|
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));
|
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");
|
// 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)
|
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);
|
||||||
}
|
}
|
||||||
@@ -16,6 +16,8 @@
|
|||||||
#define BY_FRAME_UART_INDEX (UART_4)
|
#define BY_FRAME_UART_INDEX (UART_4)
|
||||||
#define BY_FRAME_UART_BAUDRATE (115200)
|
#define BY_FRAME_UART_BAUDRATE (115200)
|
||||||
|
|
||||||
|
extern uint8_t frame_buffer[50];
|
||||||
|
|
||||||
extern void by_frame_init(void);
|
extern void by_frame_init(void);
|
||||||
extern void by_frame_send(uint8_t data_num, uint32_t *data_array);
|
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);
|
extern void by_frame_parse(uint8_t data_num, uint32_t *data_array);
|
||||||
|
|||||||
@@ -108,9 +108,7 @@ void USART3_IRQHandler(void)
|
|||||||
void UART4_IRQHandler(void)
|
void UART4_IRQHandler(void)
|
||||||
{
|
{
|
||||||
if (USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) {
|
if (USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) {
|
||||||
uint8_t data_s = 0;
|
by_frame_parse_uart_handle(USART_ReceiveData(UART4));
|
||||||
uart_query_byte(UART_4, &data_s);
|
|
||||||
by_frame_parse_uart_handle(data_s);
|
|
||||||
USART_ClearITPendingBit(UART4, USART_IT_RXNE);
|
USART_ClearITPendingBit(UART4, USART_IT_RXNE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ int main(void)
|
|||||||
Page_Init();
|
Page_Init();
|
||||||
sport_pid_init();
|
sport_pid_init();
|
||||||
|
|
||||||
pit_ms_init(TIM1_PIT, 1); // 运动解算,bianmaqi
|
pit_ms_init(TIM1_PIT, 1); // 运动解算,编码器
|
||||||
|
|
||||||
printf("ok\r\n");
|
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, 60, test_data[1].f32, 4, 1);
|
||||||
ips200_show_float(40, 80, in_gyro, 4, 2);
|
ips200_show_float(40, 80, in_gyro, 4, 2);
|
||||||
ips200_show_float(40, 100, in_speed, 4, 4);
|
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, 120, "outang");
|
||||||
ips200_show_string(0,140,"outgyr"); ips200_show_float(80,140,out_gyro,4,1);
|
ips200_show_float(80, 120, out_angle, 4, 1);
|
||||||
|
ips200_show_string(0, 140, "outgyr");
|
||||||
|
ips200_show_float(80, 140, out_gyro, 4, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user