diff --git a/app/main.c b/app/main.c index 645cb7a..af00836 100644 --- a/app/main.c +++ b/app/main.c @@ -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) { diff --git a/app/tiny_frame/by_tiny_frame_config.h b/app/tiny_frame/by_tiny_frame_config.h index 295678f..a302e29 100644 --- a/app/tiny_frame/by_tiny_frame_config.h +++ b/app/tiny_frame/by_tiny_frame_config.h @@ -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 diff --git a/app/tiny_frame/by_tiny_frame_parse.c b/app/tiny_frame/by_tiny_frame_parse.c index 1c44b6d..d5f627f 100644 --- a/app/tiny_frame/by_tiny_frame_parse.c +++ b/app/tiny_frame/by_tiny_frame_parse.c @@ -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; -} \ No newline at end of file +} + +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; +} diff --git a/app/tiny_frame/by_tiny_frame_parse.h b/app/tiny_frame/by_tiny_frame_parse.h index 6047fdd..eeb41a0 100644 --- a/app/tiny_frame/by_tiny_frame_parse.h +++ b/app/tiny_frame/by_tiny_frame_parse.h @@ -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