feat: 换用更简单的通信帧格式
真的不是因为原来的不好用!
This commit is contained in:
88
app/by_frame.c
Normal file
88
app/by_frame.c
Normal file
@@ -0,0 +1,88 @@
|
||||
#include "by_frame.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "zf_common_headfile.h"
|
||||
#include "lwrb.h"
|
||||
#include "crc16.h"
|
||||
|
||||
lwrb_t lwrb_struct;
|
||||
uint8_t lwrb_buffer[50];
|
||||
uint8_t frame_buffer[100];
|
||||
|
||||
void by_frame_init(void)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
void by_frame_send(uint8_t data_num, uint32_t *data_array)
|
||||
{
|
||||
uint16_t crc_cal = 0;
|
||||
frame_buffer[0] = BY_FRAME_HEAD_1;
|
||||
frame_buffer[1] = BY_FRAME_HEAD_2;
|
||||
|
||||
memcpy(frame_buffer + 2, data_array, data_num * sizeof(uint32_t));
|
||||
crc_cal = crc16_check(frame_buffer, 2 + data_num * sizeof(uint32_t));
|
||||
|
||||
frame_buffer[2 + data_num * sizeof(uint32_t)] = (uint8_t)(crc_cal >> 8);
|
||||
frame_buffer[3 + data_num * sizeof(uint32_t)] = (uint8_t)(crc_cal);
|
||||
|
||||
uart_write_buffer(BY_FRAME_UART_INDEX, frame_buffer, 4 + data_num * sizeof(uint32_t));
|
||||
}
|
||||
|
||||
void by_frame_parse(uint8_t data_num, uint32_t *data_array)
|
||||
{
|
||||
uint8_t cnt = 0;
|
||||
uint8_t cnt_crc = 2;
|
||||
uint8_t data = 0;
|
||||
uint8_t data_array_temp[100];
|
||||
uint16_t crc_cal = 0;
|
||||
|
||||
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((uint8_t *)data_array_temp, 2 + data_num * sizeof(uint32_t))) {
|
||||
memcpy(data_array, data_array_temp + 2, data_num * sizeof(uint32_t));
|
||||
printf("parsed done!\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void by_frame_parse_uart_handle(uint8_t data)
|
||||
{
|
||||
lwrb_write(&lwrb_struct, &data, 1);
|
||||
}
|
||||
Reference in New Issue
Block a user