我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

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

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

[复制链接]

该用户从未签到

5

主题

4

回帖

0

积分

一级逆天

积分
0

终身成就奖

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

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

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

×
/*
应用场景之一:串口通讯
*/
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;
}

/*
打包,解包、测试都在上面了,拿去用吧,不用感谢。
*/
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2024-6-14 16:03
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    0

    主题

    1万

    回帖

    7618

    积分

    二级逆天

    积分
    7618

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

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

    使用道具 举报

    该用户从未签到

    87

    主题

    1136

    回帖

    2478

    积分

    PADS-241024高级班

    积分
    2478

    终身成就奖

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

    使用道具 举报

    该用户从未签到

    4

    主题

    3

    回帖

    0

    积分

    一级逆天

    积分
    0

    终身成就奖

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

    使用道具 举报

    该用户从未签到

    2

    主题

    187

    回帖

    0

    积分

    二级逆天

    积分
    0

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

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

    使用道具 举报

    该用户从未签到

    45

    主题

    277

    回帖

    715

    积分

    PADS-2020国庆特训班

    积分
    715

    终身成就奖

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-10-7 22:18
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    16

    主题

    578

    回帖

    267

    积分

    二级逆天

    积分
    267

    终身成就奖

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

    使用道具 举报

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

    本版积分规则

    每日签到,有金币领取。


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

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

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

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