搜索
bottom↓
回复: 27

分享一份原创简易的分包组包代码

  [复制链接]

出0入0汤圆

发表于 2018-3-6 13:27:46 | 显示全部楼层 |阅读模式
本帖最后由 怂包BB 于 2018-3-6 13:31 编辑

做蓝牙传输,由于限制,每次最多20个字节。于是写了分相对通用的分包组包的代码。如果大家有项目可以用到这个,可以看看,如果有BUG和可以优化的地方,希望可以告诉我,谢谢!

功能说明

1、支持通信数据传输的分包以及组包
2、通用协议格式,同时支持协议头自定义配置
3、接口简单,使用方便
4、数据校验方式可选CRC32, CRC16等

协议格式说明

【协议头】【数据】【校验】

协议头格式:
  1. typedef struct
  2. {
  3.   B_TP_HEAD_TYPE          head;
  4.   B_TP_FRAME_NUMBER_TYPE  f_num;
  5.   b_TPU8                  number;         /**< 自定义一项 */
  6.   B_TP_TOTAL_LEN_TYPE     total_len;
  7. }b_tp_head_t;
复制代码


  • 非自定义的项变量名不能改变
  • 头标志: 数据类型可以配置
  • 分帧标志: 是否分帧传输
  • 数据长度: 数据的长度,不包括协议头以及校验
  • 校验: 校验方式可选,对协议头以及数据部分进行校验


使用接口说明

1、根据需求完成b_tp_config.h文件的配置
2、如果在协议头加入了自定义项,实现一下两个函数来操作自定义的部分:
  1. b_tp_err_code_t _b_tp_rec_check_head(b_tp_head_t *);
  2. void _b_tp_send_set_head(b_tp_head_t *);
复制代码

3、完成b_tp_port.c里数据发送
4、收到数据后将收到的数据通过b_tp_receive_data函数提交给b_tp进行解析
5、解析完成后调用回调,所以通过b_tp_reg_callback注册回调


写了测试代码进行逻辑的确认:
传送50个字节(1 ~ 50),分成三次传输:
  1. 165 1 0 50 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  2. 2 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
  3. 3 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 69 61
复制代码


同样三笔数据进行解析也是可以解析正确。

配置项:
  1. /** | B_TP_HEAD | B_TP_FRAME_NUMBER | TOTAL_LEN | DATA (N) | CHECK */
  2. /**  configure start  ----------------------------------------------------------*/
  3. #define B_TP_HEAD_TYPE            b_TPU8
  4. #define B_TP_FRAME_NUMBER_TYPE    b_TPU8
  5. #define B_TP_TOTAL_LEN_TYPE       b_TPU8
  6. #define B_TP_CHECK_SELECT         B_TP_CRC16         /**< B_TP_SUM / B_TP_CRC16 / B_TP_CRC32 */


  7. #define B_TP_HEAD                 0XA5
  8. #define B_TP_MTU                  20

  9. #define B_TP_SEND_REPEAT          1
  10. #define B_TP_SEND_LOCK_ENABLE     1
  11. #define B_TP_STATIC_BUF_ENABLE    1

  12. #if B_TP_SEND_LOCK_ENABLE
  13. #define B_TP_STATIC_BUF_LEN       160
  14. #else
  15. #define B_TP_STATIC_BUF_LEN       160
  16. #define B_TP_STATIC_REC_BUF_LEN   64
  17. #endif

  18. #define B_TP_DEBUG_NO_CHECK       0
  19. /** configure end ---------------------------------------------*/

  20. #pragma pack(1)

  21. typedef struct
  22. {
  23.   B_TP_HEAD_TYPE          head;
  24.   B_TP_FRAME_NUMBER_TYPE  f_num;
  25.   b_TPU8                  number;
  26.   B_TP_TOTAL_LEN_TYPE     total_len;
  27. }b_tp_head_t;

  28. #pragma pack()

  29. /**
  30. * @}
  31. */
复制代码





https://github.com/notrynohigh/b_tp

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2018-3-6 13:37:48 | 显示全部楼层
写的不错,赞一个

出0入0汤圆

发表于 2018-3-6 13:50:12 | 显示全部楼层
留个爪!!!

出0入0汤圆

发表于 2018-3-6 14:51:51 | 显示全部楼层
刚好要用,多谢

出0入0汤圆

发表于 2018-3-6 14:54:17 来自手机 | 显示全部楼层
同上,再谢

出0入0汤圆

 楼主| 发表于 2018-3-6 15:24:26 | 显示全部楼层
su33691 发表于 2018-3-6 13:37
写的不错,赞一个

多谢支持

出0入0汤圆

 楼主| 发表于 2018-3-6 15:25:06 | 显示全部楼层

多谢支持,有问题交流可以随时联系

出0入0汤圆

 楼主| 发表于 2018-3-6 15:25:35 | 显示全部楼层

有问题可以随时联系,多谢支持

出0入0汤圆

发表于 2018-3-6 15:29:37 | 显示全部楼层
赶紧下载学习下,一直想找这种协议传输的例子。尤其是这种可以支持大数据传输的

出0入0汤圆

发表于 2018-3-6 15:58:36 | 显示全部楼层
分包传输的关键 是自增包序号

出0入0汤圆

发表于 2018-3-6 16:20:30 来自手机 | 显示全部楼层
还用不上但支持原创分享,支持楼主

出0入0汤圆

发表于 2018-3-6 16:27:17 | 显示全部楼层
下次需要大数据传输时可以应用

出0入4汤圆

发表于 2018-3-6 20:19:31 | 显示全部楼层
下载学习

出0入296汤圆

发表于 2018-3-6 20:41:07 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2018-3-6 20:46 编辑

看了下代码,总体风格很不错,是基于块处理的算法,非常值得学习。
硬要说提意见的话,感觉malloc用的太多了,可能会有碎片化的问题,
另外,内存分配方式也定死了。感觉也许可以让用户在配置阶段提供buffer。
如果考虑做一个缓冲池实现ping pang缓冲和解析也许更好一点。

我有类似的结构,可以相互交流下:

这是一个frame打包和解包的服务,结构和楼主类似
(我上传了一个PC调试工具,可以直接进行打包和解包测试)

https://github.com/GorgonMeducer ... ame/es_simple_frame

这是一个缓冲池的服务,可以和前面这个配合起来:

https://github.com/GorgonMeducer ... memory/stream2block

再补充一个异步通信的引擎:

https://github.com/GorgonMeducer ... on/telegraph_engine

欢迎一起拍砖。

出20入118汤圆

发表于 2018-3-7 01:21:57 来自手机 | 显示全部楼层
mark下好东西

出0入0汤圆

发表于 2018-3-7 08:18:59 | 显示全部楼层
昨天我还想尝试着配合FIFO队列,进行串口通讯。

出0入0汤圆

发表于 2018-3-8 15:06:58 来自手机 | 显示全部楼层
Gorgon_Meducer 发表于 2018-3-6 20:41
看了下代码,总体风格很不错,是基于块处理的算法,非常值得学习。
硬要说提意见的话,感觉malloc用的太多 ...

大佬回来了~

出0入0汤圆

发表于 2018-3-8 23:51:47 | 显示全部楼层
多谢分享,有空的时候学习一下!

出0入0汤圆

发表于 2018-3-9 06:47:22 来自手机 | 显示全部楼层
多谢分享

出0入0汤圆

发表于 2018-3-9 17:16:07 来自手机 | 显示全部楼层
谢谢分享,做个记号。

出0入0汤圆

发表于 2018-3-9 18:12:24 | 显示全部楼层
这个开源可以点个赞!

出0入0汤圆

发表于 2018-4-22 10:09:41 | 显示全部楼层
Gorgon_Meducer 发表于 2018-3-6 20:41
看了下代码,总体风格很不错,是基于块处理的算法,非常值得学习。
硬要说提意见的话,感觉malloc用的太多 ...

看了下,不错的框架,准备试用下

出0入0汤圆

发表于 2018-4-22 10:23:45 来自手机 | 显示全部楼层
做个记号,学习一下,谢谢分享!

出0入0汤圆

发表于 2018-4-22 12:43:18 来自手机 | 显示全部楼层
协议占用带宽多少

出0入0汤圆

发表于 2018-4-22 14:48:38 来自手机 | 显示全部楼层
留个记号,谢谢

出0入0汤圆

发表于 2018-4-22 22:12:34 来自手机 | 显示全部楼层
新项目刚好要用蓝牙这块,学习一下

出0入0汤圆

发表于 2018-4-22 23:49:53 | 显示全部楼层
谢谢,学习一下通信协议方面的东西

出0入0汤圆

发表于 2018-4-25 16:24:49 | 显示全部楼层
多谢分享,刚做完一个蓝牙的程序, 再次学习下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 16:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表