硬汉嵌入式论坛

 找回密码
 立即注册
查看: 750|回复: 1
收起左侧

[脱机烧录] 滚码存储格式为BCD码小端排列的实现方案,高级脚本配置

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2022-12-2 00:03:49 | 显示全部楼层 |阅读模式
客户要求滚码存储为BCD码小端排列。
比如4字节长度,123456 的十进制数保存为: 56 34 12 00
比如3字节长度,123456 的十进制数保存为: 56 34 12

可以通过高级脚本功能实现。

[Lua] 纯文本查看 复制代码
--产品序号SN生成函数 (支持INT64整数滚码) 输出是二进制字符串
function sn_new(void)
        local bin = {}
        local out = {}
        local sn1
        local s
        local i

        if (SN_TYPE == 0) then        --普通滚码
                sn1 = pg_read_sn()        --读上次SN (必须是整数)
                str = string.format("SN. = %d", sn1) print(str)                
        else
                --1970年秒数
                sn1 = os.time()
        end

        --存储格式固定BCD码小端左对齐
        local c
        local s1
        s1 = ""
        for i = 1,2 * SN_LEN,1 do
                c = math.floor(sn1 / (10 ^ (2 * SN_LEN - i)))
                c = c % 10
                s1 = s1..string.char(c)
        end
        s = ""
        for i = SN_LEN, 1, -1 do
          s = s..string.char((string.byte(s1, 2 * i - 1) << 4) + string.byte(s1,2 * i))
        end                        

        if (SN_TYPE == 0) then        --普通滚码                        
                if (SN_INC_STEP ~= nil) then
                        sn1 = sn1 + SN_INC_STEP
                else
                        sn1 = sn1 + 1
                end
        
                pg_write_sn(sn1)        --编程成功后才会保存本次SN
        end
                
        return s
end


将上面的代码加入配置窗口,即可实现。客户完全可以自定义滚码存储格式
image.png

如果需要BCD码大端排列。
比如
4字节长度,123456 的十进制数保存为: 00 12 34 56
3字节长度,123456 的十进制数保存为: 12 34 56
关键代码为:
[Lua] 纯文本查看 复制代码
                local c
                local s1
                s1 = ""
                for i = 1,2 * SN_LEN,1 do
                        c = math.floor(sn1 / (10 ^ (2 * SN_LEN - i)))
                        c = c % 10
                        s1 = s1..string.char(c)
                end
                s = ""
                for i = 1, SN_LEN,1 do
                  s = s..string.char((string.byte(s1, 2 * i - 1) << 4) + string.byte(s1,2 * i))
                end





回复

使用道具 举报

5

主题

97

回帖

112

积分

初级会员

积分
112
发表于 2022-12-2 00:36:41 | 显示全部楼层
非常感谢。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 03:56 , Processed in 0.247975 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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