(Chatgpt辅助)C语言移植Code128B条形码算法到LVGL8.3【附跑通代码】

LVGL 8.3 条形码的显示 此时解码出来的barcode_data数据是0或1组成的数组,1即是有数据,也就是条形码中的黑色。刚刚我们把条形码已经转化为lv_img_dsc_t类型的数据,可以用img控件来将它显示出来。先获取输入数据的长度, 再根据长度申空间给到code128算法,然后解析出原始数据。此时我们跟据barcode_data数据,如果是1就填充黑色,否则白色。条形码一般默认是以白色为底,黑色为显示数据的颜色。如果不了解code128算法,可以先去了解一下。 阅读详情

(Chatgpt辅助)C语言移植Code128B条形码算法到LVGL8.3【附跑通代码】


序言:
这篇博客是我在移植条形码过程中,发现优快云以及Google上面较少关于C语言移植条形码到LVGL的

资料文档。同时又恰好我刚开始使用Chatgpt辅助移植,所以就把相关内容总结整理一遍。我本来是

打算移植code128auto算法的,但是临时有其他事情中断了,所以只能把code128B的内容总结一下,

后续有空我会继续完善这个博客的。

<1>CODE128算法简介

详细的介绍可以参考这个博客:https://blog.youkuaiyun.com/walk_ing/article/details/52712641

我对该算法的粗浅概括可以总结为以下几点:

<1>Code128B编码规则:开始位 + 数据位 + 检验位 + 结束位

<2>Code128编码表规定一份对应法则:即你所输入的字符将根据这份表格映射成10(bs)形式,其

中1表示黑色,0表示白色

<3>开始位,校验位,结束位都已经被规定好。只有数据位需要一一对应。

<2>C语言实现算法

根据上述3点总结就可以写出相应的代码

// Code 128字符集
const char* code128_charset_B = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

// code128编码值数组,每个字符占11个单位表示
static const uint16_t s_code128_encode_set[] = {
    0x6cc, 0x66c, 0x666, 0x498, 0x48c, 0x44c, 0x4c8, 0x4c4, 0x464, 0x648,
    0x644, 0x624, 0x59c, 0x4dc, 0x4ce, 0x5cc, 0x4ec, 0x4e6, 0x672, 0x65c,
    0x64e, 0x6e4, 0x674, 0x76e, 0x74c, 0x72c, 0x726, 0x764, 0x734, 0x732,
    0x6d8, 0x6c6, 0x636, 0x518, 0x458, 0x446, 0x588, 0x468, 0x462, 0x688,
    0x628, 0x622, 0x5b8, 0x58e, 0x46e, 0x5d8, 0x5c6, 0x476, 0x776, 0x68e,
    0x62e, 0x6e8, 0x6e2, 0x6ee, 0x758, 0x746, 0x716, 0x768, 0x762, 0x71a,
    0x77a, 0x642, 0x78a, 0x530, 0x50c, 0x4b0, 0x486, 0x42c, 0x426, 0x590,
    0x584, 0x4d0, 0x4c2, 0x434, 0x432, 0x612, 0x650, 0x7ba, 0x614, 0x47a,
    0x53c, 0x4bc, 0x49e, 0x5e4, 0x4f4, 0x4f2, 0x7a4, 0x794, 0x792, 0x6de,
    0x6f6, 0x7b6, 0x578, 0x51e, 0x45e, 0x5e8, 0x5e2, 0x7a8, 0x7a2, 0x5de,
    0x5ee, 0x75e, 0x7ae, 0x684, 0x690, 0x69c, 0x18EB
};

//两个辅助函数声明
uint16_t calculate_code128_checksum(const char* input_string,uint32_t code128_length);
int strchr_temp(const char* str, int c);

// 根据输入字符串自动选择Code 128字符集并生成编码数据
void generate_code128_auto(const char* input_string, uint16_t* code128_data, uint32_t* code128_length) {
    // 使用Code 128 B字符集编码
        code128_data[0] = 0x690;  // Code 128起始码B
        *code128_length = 1;

    // 生成Code 128编码数据
    for (size_t i = 0; i < strlen(input_string); i++) {
        code128_data[*code128_length] = s_code128_encode_set[strchr_temp(code128_charset_B, input_string[i])];
        (*code128_length)++;
    }
    // 添加Code 128校验位
    code128_data[*code128_length] = calculate_code128_checksum(input_string, *code128_length);
    (*code128_length)++;
    
    // 添加Code 128停止码
    code128_data[*code128_length] = 0x18EB;  // Code 128停止码
    (*code128_length)++;

}

// 计算Code 128字符的校验位
uint16_t calculate_code128_checksum(const char* input_string,uint32_t code128_length) {
    uint32_t sum = 104;  // 初始校验和为第一个字符的值
    for (uint32_t i = 1; i <= code128_length; i++) {
    // 权重为字符在编码中的位置
        sum += i * strchr_temp(code128_charset_B, input_string[i-1]);  
    }

    return sum % 103;  // 对校验和取模
}

int strchr_temp(const char* str, int c) {
    int temp = 0;
    while (*str != '\0') {
        if (*str == c) {
            return temp;//返回ID
        }
        str++;
        temp++;
    }
    return NULL;
}

<3>LVGL绘图函数实现

CODE128B算法实现之后,就可以把这个算法当成一个黑箱。作为使用者,我们只需要关心这个黑箱

的输入输出端口即可:输入一个字符串,输出一个0或者1告诉我们是画黑线条还是白线条。而有

了这个输出,就可以适配到LVGL上,我们只需要在LVGL画出相应的黑条或者白条即可。


void draw_blackbar(uint32_t code128to01_length,int x ,int y,uint32_t width,uint32_t height){

    lv_obj_t *rect = lv_obj_create(lv_scr_act());  // 创建一个矩形对象
    lv_obj_set_size(rect, width/code128to01_length, height);  // 设置矩形的尺寸
    lv_obj_set_pos(rect, x, y);

    static lv_style_t style_rect;                                  //创建样式
    lv_style_init(&style_rect);                                    //初始化样式
    lv_style_set_bg_color(&style_rect,lv_color_black());        //设置背景颜色
    lv_style_set_radius(&style_rect,0);             //设置圆角
	lv_obj_add_style(rect,&style_rect,LV_PART_MAIN);			   //添加样式
    lv_style_set_border_color(&style_rect,lv_color_black());//设置边框背景颜色
}

void draw_whilebar(uint32_t code128to01_length,int x ,int y,uint32_t width,uint32_t height){

    lv_obj_t *rect = lv_obj_create(lv_scr_act());  // 创建一个矩形对象
    lv_obj_set_size(rect, width/code128to01_length, height);  // 设置矩形的尺寸
    lv_obj_set_pos(rect, x, y);

    static lv_style_t style_rect;//加静态,这样它就只能被初始化一次,并且一直持续到程序结束为止。
    lv_style_init(&style_rect);                                    //初始化样式
    lv_style_set_bg_color(&style_rect,lv_color_white());        //设置背景颜色
    lv_style_set_radius(&style_rect,0);             //设置圆角
	lv_obj_add_style(rect,&style_rect,LV_PART_MAIN);			   //添加样式
    lv_style_set_border_color(&style_rect,lv_color_white());//设置边框背景颜色
}
//有聪明的靓仔肯定会问,这两玩意不是重复了吗?明明更新个color参数就行了。
//回答:我这边发现使用样式时会出BUG,所以暂时用这种冗余的做法,后面有时间再优化

void draw_barcode(uint16_t* code128_data,uint32_t code128_length) {
     int xCoord = 46;int yCoord = 60;
     int code128_width = 270;
     int code128to01_length = (code128_length * 11)+1;
     int unitwidth = code128_width/code128to01_length;
//    int unitwidth = 5;

    for (size_t i = 0; i < code128_length; i++) {
        int init_temp = (i == (code128_length-1)?11:10);

        for(int j = init_temp; j>=0 ; j--){
            if (((code128_data[i]>>j) & 1)== 1) {
               //printf("1");
               draw_blackbar(code128to01_length,xCoord,yCoord,code128_width,100);  // 黑色条纹
            } else {
               //printf("0");
               draw_whilebar(code128to01_length,xCoord,yCoord,code128_width,100);  // 白色条纹
            }
            xCoord +=unitwidth;
        }
    }
    printf("\n");
}

int main(){
	    lv_obj_clean(lv_scr_act());     //先清除UI,防止唤醒后再次初始化UI导致帧率变小

        const char* input_string = "Hello";
        uint32_t code128_length = 0;
        generate_code128_auto(input_string, code128_data, &code128_length);

        draw_barcode(code128_data,code128_length);
}

#附效果图
在这里插入图片描述

<4>ChatGPT使用有感

整个使用过程总体而言还是相当Nice的,比如:<1>可以直接让他把算法实现出来,直接让它把移植

代码写出来。尽管它写的代码不可能立即拿来使用,但是整体大框架是没有问题,我们可以依据这个

大框架,再根据自己的软硬件环境,做小的修改调整。(注意它写的代码还带有不少中文注释,这点

对于我们阅读也有非常大的作用)

<2>网上有C#实现的条形码算法,我是看不懂的,于是可以直接让Chatgpt翻译成C语言,我当时觉得

这个功能实在是太棒了!

总体而言,瑕不掩瑜,是个拥有极强信息过滤能力和代码编写能力,以及归纳总结能力的好帮手。

LVGL 自定义组件(类)之 条形码组件 lv_barcode_class 就是自定义的条形码组件(类)里面组成就是类的成员及实现方法。具体可以参考C++中的类和对象。 阅读详情

相关推荐

lvgl7.11 二维码控件补丁

lvgl7.11是不支持二维码控件的,所以再此进行兼容

生成EAN13条码(C语言实现)

输入:十进制字符串(13位) 输出:二进制字符串(0代表白条,1代表黑条) #include <stdio.h> #include <string.h> const char *LeftData[20] = { "0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111...

weixin_42613031的博客 3665

条码生成器(c语言代码)

条码生成器(c语言代码)

C语言条形码--二维码生成库zint的生成方法

整理的条形码和二维码生成库—zint库的生成,具体步骤参考这篇文章: https://blog.csdn.net/sunhuansheng/article/details/105304832 其他补充说明: 1、编译时出现错误: 错误 LNK1104 无法打开文件“kernel32.lib” ;解决办法参考下面这篇文章: https://blog.csdn.net/cai_niaocainiao/article/details/81515516 2、使用时,头文件中加入: #include “zint.h”

weixin_43424867的博客 1619

条码CODE128C语言算法

C语言 实现的一维码CODE128编码算法

生成条形码并打印(code128ABC)

MFC基于对话框,生成条形码,支持code128

LVGL Barcode控件和Qrcode控件详解

条形码控件用于生成和显示条形码。用途:适用于需要生成和显示条形码的应用场景,如产品标签、库存管理等。功能:QR码控件用于生成和显示二维码。用途:适用于需要生成和显示二维码的应用场景,如支付、登录验证等。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1404

一维条形码的生成与实现(c语言+注释)

条形码的生成及实现c语言源代码,直接就可以在vc++上运行

code128条码c语言,条码(code128)的不同版本实现

Value Total===== =====Start Code B 104 104Position 1 C 35 1 x 35 = 35Position 2 o 79 ...

weixin_32419787的博客 787

LVGL 7.8.1生成二维码例程-附件资源

LVGL 7.8.1生成二维码例程-附件资源

别再被海康VisionMaster标定搞懵了!固定相机视觉引导,从标定到示教保姆级避坑指南

本文详细解析了海康VisionMaster在固定相机视觉引导中的标定与示教全流程,特别针对单相机标定提供了精简高效的4图标定法。从标定板准备到示教物理点设置,再到坐标转换与误差补偿,提供了一套完整的保姆级避坑指南,帮助工程师快速掌握固定相机视觉引导系统的核心技术。

weixin_30336061的博客 495

10个最佳QR码二维码和条形码Javascript库

QR码是最热门的趋势或策略,并且比以往任何时候都更好。QR码是一个二维条形码。它们通常用于对URL进行编码,以便有人可以扫描代码并访问网站。以下是10个最佳QR和条形码Javascript库,用于生成QR码和许多第三方库,可以帮助您做到这一点。QRCode.js是一个用于制作QRCode的javascript库,支持在DOM中使用HTML5 Canvas和表格标签的跨浏览器。此库没有依赖项。 QuaggaJS是一款完全用JavaScript编写的条形码扫描仪,支持各种类型的条形码的实时本地化和解码,例如EA

南北极之间 6028

SAP Workflow 工作流开发步骤总结

SAP WORKFLOW

qq_36952606的博客 5093

Qt 中利用 GNU barcode 生成一维条形码

Qt 中利用 GNU barcode 生成一维条形码 最近有个项目,需要用到条形码。上网找了一圈,网上很少有介绍如何用 C++ 或者 C代码生成条形码的。偶尔有那么一两篇,也是针对某一种条形码给出的。而且一般都是 Code 39 码或者 Code 128 码这种比较简单的条码。 我调研了一番,感觉开源的条码库里面还是GNU barcode 实现的比较全。基本常见的条形码全都支持。不过 GNU barcode 直接在项目里用不是很方便。因为它封装的太简单了。缺少把条码画出来的功能代码。因此,我花了几天时间

Ivan 的专栏 4727

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5714

招行收款通SM2加密解密全流程解析:PHP开发者必看

本文详细解析了招商银行收款通服务中SM2加密解密的完整流程,特别针对PHP开发者提供了从密钥管理到签名验签的实战指南。涵盖国密算法基础、PHP环境配置、密钥安全存储及生产环境优化方案,帮助开发者快速实现高安全性的支付系统集成。

weixin_30632089的博客 651

code128条码c语言,C#生成code128条形码的方法

本文实例讲述了物流条形码的C#实现方法,分享一下供大家参考。具体实现方法如下:主要功能代码如下:using System;using System.Collections.Generic;using System.Data;using System.Drawing;namespace Code{class BarCode{public class Code128{private DataTable...

weixin_42355399的博客 1118

【Bug已解决】Claude Desktop Cowork 报错 Workspace unavailable 解决方案

方案适用场景推荐指数确认虚拟机镜像下载完整性排查的第一步,最基础的前提检查⭐⭐⭐⭐⭐确认虚拟机平台功能已启用Windows 系统功能层面的必要条件⭐⭐⭐⭐⭐重启 CoworkVMService快速尝试恢复服务正常状态⭐⭐⭐⭐完全重启客户端排除临时性状态错乱⭐⭐⭐⭐降级使用文件工具临时替代方案,不阻塞当前工作⭐⭐⭐报错的本质是Cowork 功能依赖的虚拟机管理服务,在 Windows 应用包隔离机制下未能正确定位虚拟机文件的实际存放路径。

博客 6234

C#以图形方式输出Code128C条形码

图形方式输出Code128C条形码最近的项目牵涉到一维条码打印的问题。条码的选型上倒没什么,因为要求短且仅包含数字,所以决定选用Code128C。在国外的网站上找了点资料研究了下,终于大致搞懂了Code128C的原理和实现方法。Code128C只能编码长度是偶数的数字串,这是它的前提之一。说起来编码规则很简单,00 - 99 这100个数字每个数字都预先规定好一个条码,然后把原始的待编码字

ki1381的专栏 7328

31.华为路由器:PPPOE配置模拟实验及NAT配置

实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 The number of interface

迷逝 8117

SQL面试题——抖音SQL面试题 股票波峰波谷

这个题目的难度比较低,我们是用lead 和 lag 两个函数就可以搞定,也就是在一个SQL 里面同时使用多个函数,问题的考查点在于对边界的考虑。

2万+

BarCode 算法 VB类库 1

 Option Explicit VB / VBA Functions for Code128(A, B,C), UCC/EAN 128 Copyright 2004 by MW6 Technologies Inc. All rights reserved. This code may not be modified or distributed unless you purchase

Franck的专栏 748

CP AUTOSAR标准之AUTOSAR OS(AUTOSAR_SWS_OS)(二)

AUTOSAR OS是一个Operating System,即操作系统。它最核心的功能是管理任务和事件的调度,不同任务间的同步流,并且提供监控和错误处理功能。或者用最简化理解就是一个函数调度器。

CoolBreeze的博客 654

史上最简洁C# 生成条形码图片思路及示例分享

这篇文章主要介绍了史上最简洁C# 生成条形码图片思路及示例分享,需要的朋友可以参考下   在网上看到一些人写关于条形码的代码都很长,有的甚至拿来卖,所以查了下资料,希望能对大家有帮助。   我的实现原理是:   其实Windows本身就有一个字体是用来显示条形码的。   只要将数字改为这种字体就变成了条形码。   windows字体库下,有如下八种字

技术资料收集站 2448

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

生成条形码

/// /// 生成条形码 /// /// /// /// /// /// public string bar_code(object str, int ch, int cw, int type_code) { string strTmp = str.ToString(); string code = strTmp; strTmp = strT

黑色幽默 680

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: Source insight 个性化设置:界面+自定义快捷键【简洁版】
Squirrel Jumping
博客等级 码龄6年 10粉丝 4原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值