我们从2011年坚守至今,只想做纯粹的技术论坛,请不要发布和技术无关的话题。  本站有两万多份高大上的PCB和原理图下载,每日更新中,欢迎常回来看看

 找回密码
 立即注册
搜索
查看: 1422|回复: 6

[技术文章] 轻量级通讯协议源码(适用于单片机之间通讯)

[复制链接]

5

主题

4

回帖

16

积分

一级逆天

积分
16

终身成就奖

发表于 2020-8-14 17:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

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

×
/*
应用场景之一:串口通讯
*/
int pack_encode(char *src, int src_len, char *dst, int *dst_len)
{
    int i = 0;
    int j = 0;

    if (!src || !dst || !dst_len)
        return -1;

    dst[j++] = 0x7E;
    for (i = 0; i < src_len; i++)
    {
        if (src == 0x7E)
        {
            dst[j++] = 0x7D;
            dst[j++] = 0x5E;
        }
        else if (src == 0x7D)
        {
            dst[j++] = 0x7D;
            dst[j++] = 0x5D;
        }
        else
        {
            dst[j++] = src;
        }
    }
    dst[j++] = 0x7E;
    *dst_len = j;
    return 0;
}

int pack_decode(char *src, int src_len, char *dst, int *dst_len)
{
    int i = 0;
    int j = 0;

    if (!src || !dst || !dst_len || src[0] != 0x7E || src[src_len - 1] != 0x7E)
        return -1;

    src_len--;
    for (i = 1; i < src_len; i++)
    {
        if (src == 0x7D && (i + 1) < src_len)
        {
            i++;
            if (src == 0x5E)
            {
                dst[j++] = 0x7E;
            }
            else if (src == 0x5D)
            {
                dst[j++] = 0x7D;
            }
            else
            {
                return -1;
            }
        }
        else
        {
            dst[j++] = src;
        }
    }
    *dst_len = j;
    return 0;
}

int main(int argc, char *argv[])
{
    int i = 0;
    int len = 0;
    char buff[128] = {0x7F};
    char temp[128] = {0};
    char result[128] = {0};

    pack_encode(buff, 1, temp, &len);
    printf("encode reault:len=%d,", len);
    for (i = 0; i < len; i++)
        printf("%02x ", temp);
    printf("\n");

    pack_decode(temp, len, result, &len);
    printf("decode reault:len=%d,", len);
    for (i = 0; i < len; i++)
        printf("%02x ", result);
    printf("\n");

    if (memcmp(result, buff, len) != 0)
    {
        printf("fuck!test failed\n");
    }
    else
    {
        printf("yes!, test ok\n");
    }

    return 0;
}

/*
打包,解包、测试都在上面了,拿去用吧,不用感谢。
*/
  • 打卡等级:常住青年
  • 打卡总天数:17
  • 打卡月天数:0
  • 打卡总奖励:61
  • 最近打卡:2025-01-13 19:11:02

0

主题

8150

回帖

7628

积分

二级逆天

积分
7628

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2020-8-14 18:02 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:初入少年
  • 打卡总天数:5
  • 打卡月天数:0
  • 打卡总奖励:17
  • 最近打卡:2025-03-31 14:59:05

163

主题

957

回帖

2717

积分

PADS-241024高级班

积分
2717

终身成就奖

发表于 2020-8-21 22:51 | 显示全部楼层
回复

使用道具 举报

4

主题

3

回帖

9

积分

一级逆天

积分
9

终身成就奖

发表于 2020-9-18 18:34 | 显示全部楼层
相关用了挺多,因为PC和STC15W通讯,就几个指令,所以电脑端发送单字节 A,B,C。。。。,然后单片机端接收到用switch判断做相应干活.
回复

使用道具 举报

2

主题

148

回帖

206

积分

二级逆天

积分
206

终身成就奖特殊贡献奖原创先锋奖

发表于 2022-9-7 08:04 | 显示全部楼层
回复

使用道具 举报

发表于 2022-9-8 08:58 | 显示全部楼层
int pack_decode(char *src, int src_len, char *dst, int *dst_len)
这句那位大佬解释下,这个函数开头的int和括号里面的int分别是,返回值类型,和变量类型吗
回复

使用道具 举报

  • 打卡等级:初入少年
  • 打卡总天数:8
  • 打卡月天数:0
  • 打卡总奖励:19
  • 最近打卡:2026-10-06 16:03:15

16

主题

512

回帖

285

积分

二级逆天

积分
285

终身成就奖

发表于 2022-9-8 16:46 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请举报投诉

本站所有资料仅限参考学习交流,PCB原理图源码等所有资料不保证准确没问题,请不要用作生产。否则后果自负。

闽公网安备35062302000276号 | 闽ICP备2024076463号-1 | 论坛技术支持QQ群171867948 | 论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表