feat: 添加通信帧解析超时机制

This commit is contained in:
bmy
2024-02-23 20:13:34 +08:00
parent 3a68f98635
commit a1c047f15a
4 changed files with 85 additions and 4 deletions

View File

@@ -35,6 +35,11 @@
#include "by_tiny_frame_pack.h"
/** 测试完成后移除 **/
void test(void)
{
printf("hhhhhhok\r\n");
}
int main(void)
{
@@ -60,6 +65,9 @@ int main(void)
printf("start running\r\n");
/** 测试完成后移除 **/
by_tiny_frame_parse_handle_register(test);
by_tiny_frame_parse_start_listern();
by_tf_pack_frame_t frame_now;
frame_now.cmd = 0x06;
@@ -75,7 +83,8 @@ int main(void)
/** 测试完成后移除 **/
by_tiny_frame_parse_run();
// by_tiny_frame_pack_send(&frame_now);
system_delay_ms(100);
system_delay_ms(10);
by_tiny_frame_parse_timer_handle();
/** 测试完成后移除 **/
// if (mt9v03x_finish_flag) {

View File

@@ -10,14 +10,18 @@
#define BY_TF_PARSE_BUFFER_SIZE (50)
/** 注释此项则为主机,否则为从机 **/
// 注释此项则为主机,否则为从机
// #define BY_TF_DEVICE_SLAVE
/********** 从机模式配置选项 **********/
#if defined(BY_TF_DEVICE_SLAVE)
/** 多从机通信时注意修改地址,避免冲突 **/
// 从机地址 (多从机通信时注意修改地址,避免冲突)
#define BY_TF_DEVICE_SLAVE_ADDRESS (0x0D)
/********** 主机模式配置选项 **********/
#else
#define BY_TF_DEVICE_MASTER
// 监听/解析 超时时间 单位毫秒
#define BY_TF_PARSE_TIMEOUT (200)
#endif
#endif

View File

@@ -6,10 +6,18 @@
lwrb_t lwrb_struct;
uint8_t buffer_rb[BY_TF_PARSE_BUFFER_SIZE];
uint8_t buffer_out;
uint8_t listern_flag;
uint16_t listern_timeout;
uint16_t listern_timevia;
by_tf_parse_frame_t frame_now;
by_tf_parse_success_handle_func parse_success_handle;
void by_tiny_frame_parse_init(void)
{
#if defined(BY_TF_DEVICE_MASTER)
listern_timeout = BY_TF_PARSE_TIMEOUT;
#endif
/** 初始化环形缓冲区 **/
lwrb_init(&lwrb_struct, buffer_rb, 40);
}
@@ -62,23 +70,63 @@ uint8_t by_tiny_frame_parse_listening(by_tf_parse_frame_t *frame_s, const uint8_
return 1;
}
/**
* @brief by_tf_parse 串口回调函数,在对应串口中断函数中调用
*
* @param buff
*/
void by_tiny_frame_parse_uart_handle(uint8_t buff)
{
lwrb_write(&lwrb_struct, &buff, 1);
}
/**
* @brief by_tf_parse 定时回调函数,要求触发周期为 1ms
*
*/
void by_tiny_frame_parse_timer_handle(void)
{
#if defined(BY_TF_DEVICE_MASTER)
if (listern_flag) {
listern_timevia++;
} else {
listern_timevia = 0;
}
#endif
}
void by_tiny_frame_parse_run(void)
{
#if defined(BY_TF_DEVICE_MASTER)
if (0 == listern_flag) {
return;
} else {
if (listern_timeout <= listern_timevia) {
// 接收超时,停止监听
by_tiny_frame_parse_end_listern();
#if (BY_TF_DEBUG)
printf("by_tf_listern timeout\r\n");
#endif
}
}
#endif
for (uint8_t i = 0; i < lwrb_get_full(&lwrb_struct); i++) {
if (!lwrb_read(&lwrb_struct, &buffer_out, 1)) {
break;
}
// TODO 目前接收校验错误也会等待直至超时
// TODO 待结合 read&wirte 部分修改监听的从机地址
if (!by_tiny_frame_parse_listening(&frame_now, 0x0D, buffer_out)) {
if (!by_tiny_frame_parse_crc(&frame_now)) {
// 接收成功后停止监听
by_tiny_frame_parse_end_listern();
// 解析成功回调
parse_success_handle();
#if (BY_TF_DEBUG)
printf("frame parsed!\r\n");
#endif
@@ -110,4 +158,19 @@ uint8_t by_tiny_frame_parse_crc(by_tf_parse_frame_t *frame_s)
}
return 1;
}
}
void by_tiny_frame_parse_handle_register(by_tf_parse_success_handle_func func)
{
parse_success_handle = func;
}
void by_tiny_frame_parse_start_listern(void)
{
listern_flag = 1;
}
void by_tiny_frame_parse_end_listern(void)
{
listern_flag = 0;
}

View File

@@ -18,9 +18,14 @@ typedef struct by_tf_parse_frame_t {
uint32_t data;
} by_tf_parse_frame_t;
typedef void (*by_tf_parse_success_handle_func)(void);
extern void by_tiny_frame_parse_init(void);
extern void by_tiny_frame_parse_uart_handle(uint8_t buff);
extern void by_tiny_frame_parse_run(void);
extern uint8_t by_tiny_frame_parse_crc(by_tf_parse_frame_t *frame_s);
extern void by_tiny_frame_parse_handle_register(by_tf_parse_success_handle_func func);
extern void by_tiny_frame_parse_start_listern(void);
extern void by_tiny_frame_parse_end_listern(void);
#endif