# 基于 Linux+LVGL 嵌入式手办售卖可视化客户端 **Repository Path**: li-zhijie2/lv_port_linux_frame_buffer ## Basic Information - **Project Name**: 基于 Linux+LVGL 嵌入式手办售卖可视化客户端 - **Description**: 开发环境:Linux、C 语言、pthread 多线程、LVGL8.x、cJSON、TCP Socket 项目定位:嵌入式触控售货终端,客户端 + 配套 TCP 服务端,实现商品同步、购物、下单全流程,全程独立编码、调试、落地。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-07-14 - **Last Updated**: 2026-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 手办售卖嵌入式 LVGL 客户端项目 **项目简介** 本项目是基于 **Linux + pthread 多线程 + LVGL 8.x 图形库 + TCP 网络通信** 开发的嵌入式手办售卖触控客户端系统,采用 **四层分层低耦合架构** ,结构清晰、业务完整。项目实现了嵌入式触控UI交互、用户账号注册登录、手办商品展示、购物车管理、订单支付上传、服务端数据实时同步等一整套商用级业务流程。 项目采用 **UI渲染线程与网络接收线程分离** 的并发模型,通过 **标记轮询 + 互斥锁** 完美解决 LVGL 非线程安全导致的崩溃、花屏问题;自定义 **4字节长度报文头 + JSON** 私有通信协议,彻底规避 TCP 粘包、分包缺陷。全程规范化动态内存管理,无内存泄漏、无段错误,程序可长期稳定运行,是一套综合性极强的嵌入式Linux图形网络实战项目。 ### 开发环境 - **硬件平台** :开发板6818 - **系统平台** :Ubuntu 20.04 / 嵌入式 Linux - **开发语言** :C 语言 - **图形框架** :LVGL 8.x(适配800*480触控显示屏) - **字体渲染** :FreeType + simkai.ttf 中文楷体 - **网络通信** :Linux Socket TCP 长连接 - **并发处理** :pthread 多线程、互斥锁同步 - **数据解析** :cJSON 库(JSON序列化/反序列化) - **编译工具** :GCC、Make - **硬件适配** :Linux fbdev 帧缓冲、evdev 触摸驱动 ### 编译与运行步骤 **1. 项目编译** ``` # 清除旧编译产物 make clean # 整体编译客户端与服务端程序 make ``` **2. 运行服务端(后台数据服务)** 将server文件夹剪切到ubutu中编译 ``` gcc *.c cJSON/cJSON.c -o server -pthread ``` 运行 ``` ./server ``` ![输入图片说明](server/server.jpg) 功能:监听10000端口,提供管理员控制台,支持商品增删改查,向下下发JSON商品数据,接收并存储客户端上传的订单信息。 **3. 运行客户端(嵌入式图形界面)** ``` ./demo ``` ![输入图片说明](demo.jpg) 开发板程序登录界面: ![输入图片说明](login.jpg) 切换背景: ![输入图片说明](beijin.jpg) 功能:初始化LVGL图形界面、自动连接服务端TCP端口、加载本地用户数据、渲染商城页面、响应触控点击与弹窗交互。 ### 核心功能模块说明 ### **一、用户账号体系模块** - 实现用户注册、账号密码本地持久化存储(user.txt),程序重启数据不丢失 - 登录密码本地校验,校验失败弹窗中文提示错误信息 - 支持经典/复古双主题背景一键切换,实时重绘界面 - 集成中文软键盘,输入框聚焦自动弹出,点击空白区域自动收起 ### **二、手办商城UI交互模块** - 基于LVGL实现800*480全屏触控界面,分页展示手办商品(每页4个) - 商品卡片展示图片、单价、剩余库存,点击弹出详情弹窗 - 详情页支持自定义购买数量、库存校验,库存不足弹窗提示 - 合法数量商品可加入个人购物车,自动累加选购数量 - 底部集成购物车、客服预留、退出登录功能按钮 - 退出登录自动断开TCP连接、销毁界面,返回登录页面 ### **三、购物车与订单支付模块** - 透明弹窗式购物车页面,遍历链表动态渲染已选购商品 - 支持单品独立删除,删除后自动刷新购物车列表 - 自动统计购物车全部商品总价,实时展示金额 - 支付金额合法性校验,金额充足方可提交订单 - 支付成功自动生成JSON订单,通过TCP上传服务端 - 订单上传成功后自动清空购物车、重置总价数据 ### **四、TCP网络通信模块** - 自定义通信协议: **4字节网络序长度头 + JSON报文** ,彻底解决TCP粘包、分包问题 - 客户端独立子线程循环接收服务端数据,不阻塞UI渲染 - 服务端多线程架构:主线程管理员控制台、子线程阻塞接收客户端连接 - 支持服务端远程增删改商品,客户端自动同步刷新商城界面 - 实现订单数据上传、商品数据下发双向通信逻辑 ### 五、数据结构与持久化模块 - 自定义 **商品单向链表** :管理商城在售商品、用户购物车商品,封装增删改查、统计、清空全套接口 - 自定义 **用户单向链表** :存储用户信息、关联专属购物车、同步服务端订单数据 - 本地文件IO:user.txt持久化用户账号密码,实现数据落地存储 - 规范内存管理:所有动态内存、cJSON对象统一释放,杜绝内存泄漏 ### 六、线程安全与稳定性模块 - 严格遵循LVGL线程安全规范: **子线程不操作任何UI控件** - 独创标记轮询刷新机制:网络子线程修改刷新标记,主线程检测后重建UI - 全局共享变量读写加互斥锁,避免多线程数据竞争错乱 - 统一中文楷体样式全局复用,解决中文乱码、界面卡顿问题 - 弹窗采用销毁重建方案,无控件残留、无界面重叠BUG ### 系统整体架构 ### 四层分层解耦架构(核心亮点) 1. **UI表现层(login_ui.c / main_ui.c)** :仅负责LVGL界面渲染、控件事件绑定、页面弹窗切换,不处理任何业务与网络逻辑 2. **业务逻辑层(product_data.c / user_data.c)** :纯数据处理,实现链表CRUD、库存校验、总价统计、用户数据管理,完全解耦UI与网络 3. **网络通信层(client.c / server.c)** :封装TCP套接字、报文收发、JSON解析,提供极简通用通信接口 4. **基础工具层** :LVGL图形驱动、FreeType字体、cJSON解析、pthread多线程、文件IO底层支撑 ### 线程运行模型 - **客户端主线程** :LVGL界面渲染、触控事件监听、UI刷新标记检测、页面逻辑处理 - **客户端子线程** :后台循环接收TCP报文、解析JSON、更新全局数据、置位UI刷新标记 - **服务端主线程** :管理员控制台,支持商品增删改查操作 - **服务端子线程** :阻塞监听客户端连接,持续解析订单数据、下发商品数据 ### 核心数据结构 **1. 商品结构体** ``` struct product { char name[10]; // 商品名称 char image_path[10]; // 图片路径 int number; // 库存/选购数量 int price; // 商品单价 struct product *next; // 单向链表指针 }; ``` **2. 用户结构体** ``` struct user_data { char name[20]; // 用户名 struct product *myshopping; // 用户专属购物车链表 struct user_data *next; }; ``` ### 项目难点与解决方案 - **LVGL多线程崩溃问题** :禁止子线程操作UI,采用「子线程改标记+主线程刷新界面」机制,彻底解决段错误、花屏问题 - **TCP粘包分包问题** :自定义4字节网络序长度报文头,先读长度再读数据,精准拆分完整报文 - **中文乱码问题** :全局加载FreeType楷体字体,统一UI样式复用,彻底解决方框乱码 - **界面刷新异常** :弹窗采用销毁重建方案,替代局部刷新,无控件重叠、残留BUG - **内存泄漏问题** :规范malloc/free、cJSON_Create/cJSON_Delete配对使用,逐行排查内存占用 - **多线程数据竞争** :共享变量读写加互斥锁,保证并发数据安全 ### 项目总结与拓展方向 ### 项目总结 本项目完整覆盖 **嵌入式Linux应用开发、LVGL图形界面开发、多线程并发同步、TCP网络编程、JSON数据解析、链表数据结构、持久化存储、分层架构设计** 等核心技术栈。全程遵循工程化开发思想,代码低耦合、高内聚、可复用性强,针对性解决嵌入式图形多线程冲突、网络粘包、界面刷新异常、内存泄漏等经典开发难题,完整具备嵌入式终端软件的设计、编码、调试与优化能力。 ### 后续拓展方向 - 优化UI刷新机制:使用LVGL消息队列替代全局标记,实现轻量化局部刷新 - 新增用户密码加密存储,提升数据安全性 - 增加客服聊天弹窗、商品图片异步加载功能 - 服务端新增商品文件持久化,重启不丢失数据 - 使用条件变量替代轮询标记,降低CPU占用率 ### 项目目录结构 ``` lv_port_linux_frame_buffer ├── server/ # 服务端完整源码 │ ├── server.c # 服务端主程序、端口监听、多线程处理 │ ├── product.c/h # 服务端商品数据管理 │ ├── cJSON库文件 # JSON数据解析与封装 │ └── Makefile # 服务端编译脚本 ├── client/ # 客户端完整源码 │ ├── client.c # 客户端TCP通信、线程管理 │ ├── login_ui.c/h # 登录注册界面逻辑 │ ├── main_ui.c/h # 商城、购物车、订单UI逻辑 │ ├── product_data.c/h # 商品数据链表管理 │ ├── user_data.c/h # 用户数据持久化管理 │ ├── font/ # 中文楷体字体文件 │ ├── img/ # 手办商品图片资源 │ ├── user.txt # 用户账号密码本地存储文件 │ └── Makefile # 客户端编译脚本 └── README.md # 项目说明文档 ```