[技术问答] 长数据分包的四种实现方法(附带源码)

[复制链接]
 楼主| zhamatu 发表于 2020-4-27 21:56 | 显示全部楼层 |阅读模式

  1. #include "stdlib.h"

  2. typedef unsigned char uint8_t;


  3. #define MAX_PACKAGE_LEN   8 //20 或者 64 或者 16

  4. void uart_tx(uint8_t *wr_buf, uint8_t buf_len)
  5. {
  6.         uint8_t i = 0;

  7.         if(buf_len > MAX_PACKAGE_LEN)
  8.                 return ;
  9. /*
  10.         for(i=0; i<buf_len; i++ )
  11.         {
  12.                 printf("%c",*wr_buf++);
  13.         }
  14. */
  15.         printf("%.*s", buf_len, wr_buf);
  16. }


 楼主| zhamatu 发表于 2020-4-27 21:57 | 显示全部楼层
  1. fenbao1(uint8_t *wr_buf, uint8_t buf_len)
  2. {
  3.         while(1)
  4.         {
  5.                 if(buf_len > MAX_PACKAGE_LEN)
  6.                 {
  7.                         uart_tx(wr_buf, MAX_PACKAGE_LEN);
  8.                         buf_len -= MAX_PACKAGE_LEN;
  9.                         wr_buf += MAX_PACKAGE_LEN;
  10.                 }
  11.                 else
  12.                 {
  13.                         uart_tx(wr_buf, buf_len);
  14.                         break;
  15.                 }
  16.         }
  17. }
 楼主| zhamatu 发表于 2020-4-27 21:58 | 显示全部楼层

  1. fenbao2(uint8_t *wr_buf, uint8_t buf_len)
  2. {
  3.         while(buf_len > 0)
  4.         {
  5.                 if(buf_len > MAX_PACKAGE_LEN)
  6.                 {
  7.                         uart_tx(wr_buf, MAX_PACKAGE_LEN);
  8.                         buf_len -= MAX_PACKAGE_LEN;
  9.                         wr_buf += MAX_PACKAGE_LEN;
  10.                 }
  11.                 else
  12.                 {
  13.                         uart_tx(wr_buf, buf_len);
  14.                         buf_len = 0;
  15.                 }
  16.         }
  17. }
 楼主| zhamatu 发表于 2020-4-27 21:58 | 显示全部楼层
  1. fenbao3(uint8_t *wr_buf, uint8_t buf_len)
  2. {
  3.         uint8_t zhengbao_num = buf_len / MAX_PACKAGE_LEN ;
  4.         uint8_t sanbao_num = buf_len % MAX_PACKAGE_LEN;

  5.         uint8_t  i = 0;

  6.         for(i=0; i<zhengbao_num; i++ )
  7.         {
  8.                 uart_tx(wr_buf, MAX_PACKAGE_LEN);
  9.                 wr_buf += MAX_PACKAGE_LEN;
  10.         }

  11.         uart_tx(wr_buf, sanbao_num);
  12. }
 楼主| zhamatu 发表于 2020-4-27 21:59 | 显示全部楼层
  1. fenbao4(uint8_t *wr_buf)
  2. {
  3.         uint8_t buf_len = 0;
  4.         uint8_t tmp_buf_len = 0;
  5.         uint8_t i=0;

  6.         uint8_t zhengbao_num = 0;
  7.         uint8_t sanbao_num = 0;
  8. /*
  9.         while(* (++wr_buf) != '\0')
  10.         {
  11.                 buf_len ++;
  12.         }
  13.         printf("buf_len:%d\n",buf_len);
  14. */
  15.         while(*wr_buf != '\0')
  16.         {
  17.                 buf_len ++;
  18.                 wr_buf++;
  19.         }
  20.         printf("buf_len:%d\n",buf_len);
  21.         zhengbao_num = buf_len / MAX_PACKAGE_LEN ;
  22.         sanbao_num = buf_len % MAX_PACKAGE_LEN;       
  23.     wr_buf -= buf_len;

  24.         for(i=0; i<zhengbao_num; i++ )
  25.         {
  26.                 uart_tx(wr_buf, MAX_PACKAGE_LEN);
  27.                 wr_buf += MAX_PACKAGE_LEN;
  28.         }

  29.         uart_tx(wr_buf, sanbao_num);
  30.        
  31.                        
  32. }
 楼主| zhamatu 发表于 2020-4-27 22:00 | 显示全部楼层
  1. void main()
  2. {
  3.         //uint8_t tmp[] = "1234567890abcdefg\n";
  4.         uint8_t tmp[] = "123\n";
  5.         fenbao1(tmp, sizeof(tmp));
  6.         fenbao2(tmp, sizeof(tmp));
  7.         fenbao3(tmp, sizeof(tmp));
  8.         fenbao4(tmp);
  9. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

504

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

63

主题

504

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部