当前位置: 首页 > article >正文

STM32 串口发送中文

一、汉字编码基础1.1、汉字识别UTF-8编码特点汉字通常占3个字节首字节特征1110xxxx(0xE0-0xEF)都 0x7F后续字节特征10xxxxxx(0x80-0xBF)都 0x7FGBK编码特点汉字占2个字节首字节特征0x81-0xFE都 0x7F第二字节特征0x40-0xFE除0x7F#include main.h #include string.h #define MAX_RX_BUFFER 64 // 全局变量 volatile uint8_t rx_buffer[MAX_RX_BUFFER]; volatile uint8_t rx_index 0; volatile uint8_t chinese_flag 0; volatile uint8_t chinese_bytes 0; // 判断是否为UTF-8汉字首字节 uint8_t is_utf8_chinese_start(uint8_t data) { return (data 0xE0 data 0xEF); // 1110xxxx } // 判断是否为UTF-8后续字节 uint8_t is_utf8_continuation(uint8_t data) { return (data 0x80 data 0xBF); // 10xxxxxx } // 判断是否为GBK汉字首字节 uint8_t is_gbk_chinese_start(uint8_t data) { return (data 0x81 data 0xFE); } // 判断是否为GBK汉字第二字节 uint8_t is_gbk_chinese_second(uint8_t data) { return (data 0x40 data 0xFE data ! 0x7F); } void Uart1_Init(void) { // 初始化代码同上... USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); } void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) { uint8_t received_data USART_ReceiveData(USART1); // 处理汉字接收状态 if(chinese_flag 0) { // 正在接收汉字后续字节 rx_buffer[rx_index] received_data; chinese_flag--; if(chinese_flag 0) { // 汉字接收完成可以处理 printf(Received Chinese character: ); for(int i rx_index - chinese_bytes; i rx_index; i) { printf(%02X , rx_buffer[i]); } printf(\r\n); } } else if(is_utf8_chinese_start(received_data)) { // UTF-8汉字首字节 rx_buffer[rx_index] received_data; chinese_flag 2; // 还需要2个字节 chinese_bytes 3; // UTF-8汉字总字节数 } else if(is_gbk_chinese_start(received_data)) { // GBK汉字首字节 rx_buffer[rx_index] received_data; chinese_flag 1; // 还需要1个字节 chinese_bytes 2; // GBK汉字总字节数 } else { // 英文字符或其他 rx_buffer[rx_index] received_data; // 如果是换行或缓冲区满处理数据 if(received_data \n || rx_index MAX_RX_BUFFER-1) { rx_buffer[rx_index] \0; // 添加字符串结束符 process_received_data((uint8_t*)rx_buffer, rx_index); rx_index 0; } } USART_ClearITPendingBit(USART1, USART_IT_RXNE); } } // 处理接收到的数据 void process_received_data(uint8_t *data, uint8_t length) { printf(Received: ); for(int i 0; i length; i) { if(data[i] 0x20 data[i] 0x7E) { // 可打印ASCII字符 printf(%c, data[i]); } else { // 汉字字节或其他非打印字符 printf([%02X], data[i]); } } printf(\r\n); // 这里可以添加具体的汉字识别逻辑 detect_chinese_characters(data, length); } // 检测并识别汉字 void detect_chinese_characters(uint8_t *data, uint8_t length) { uint8_t i 0; while(i length) { // 检查UTF-8汉字 if(i 2 length is_utf8_chinese_start(data[i]) is_utf8_continuation(data[i1]) is_utf8_continuation(data[i2])) { printf(UTF-8 Chinese: %02X %02X %02X\r\n, data[i], data[i1], data[i2]); i 3; } // 检查GBK汉字 else if(i 1 length is_gbk_chinese_start(data[i]) is_gbk_chinese_second(data[i1])) { printf(GBK Chinese: %02X %02X\r\n, data[i], data[i1]); i 2; } else { // ASCII字符 if(data[i] 0x20 data[i] 0x7E) { printf(ASCII: %c\r\n, data[i]); } i; } } }其中ASCII检测data[i] 0x20 data[i] 0x7E判断0x20-0x7E32-126是因为ASCII成分构成 控制字符 (0x00-0x1F, 0x7F) 可打印ASCII字符 (0x20-0x7E) 扩展字符/多字节字符首字节 (0x80-0xFF)// 控制字符 (0x00-0x1F, 0x7F) // 可打印ASCII字符 (0x20-0x7E) // 扩展字符/多字节字符首字节 (0x80-0xFF) 0x7E: ~波浪线可打印字符 0x7F: DEL删除控制字符冲突区间分析UTF-8汉字首字节0xE0-0xEF(1110xxxx对应3字节UTF-8)GBK汉字首字节0x81-0xFE重叠区间0xE0-0xEF同时被两种编码识别为首字节。基于上下文自动检测// 改进的自动检测函数 uint8_t detect_encoding_type(uint8_t* data, uint8_t length) { // 统计编码特征 uint8_t utf8_score 0; uint8_t gbk_score 0; for(uint8_t i 0; i length; i) { if(data[i] 0xE0 data[i] 0xEF) { // 可能是UTF-8或GBK if(i 2 length) { // 检查UTF-8模式 if((data[i1] 0x80 data[i1] 0xBF) (data[i2] 0x80 data[i2] 0xBF)) { utf8_score 3; } // 检查GBK模式 if(i 1 length data[i1] 0x40 data[i1] 0xFE data[i1] ! 0x7F) { gbk_score 2; } } } else if(data[i] 0x81 data[i] 0xFE !(data[i] 0xE0 data[i] 0xEF)) { // 这是非重叠区的GBK首字节0x81-0xDF 和 0xF0-0xFE if(i 1 length data[i1] 0x40 data[i1] 0xFE data[i1] ! 0x7F) { gbk_score 2; } } } return (utf8_score gbk_score) ? ENCODING_UTF8 : ENCODING_GBK; }双缓冲区分处理// 分别用UTF-8和GBK方式尝试解析 void try_both_decodings(uint8_t *data, uint8_t length) { uint8_t i 0; while(i length) { // 尝试UTF-8 if(i 2 length data[i] 0xE0 data[i] 0xEF data[i1] 0x80 data[i1] 0xBF data[i2] 0x80 data[i2] 0xBF) { printf(Likely UTF-8: %02X %02X %02X\r\n, data[i], data[i1], data[i2]); i 3; } // 尝试GBK else if(i 1 length data[i] 0x81 data[i] 0xFE data[i1] 0x40 data[i1] 0xFE data[i1] ! 0x7F) { printf(Likely GBK: %02X %02X\r\n, data[i], data[i1]); i 2; } else { // ASCII if(data[i] 0x20 data[i] 0x7E) { printf(%c, data[i]); } i; } } }1.2、简单的汉字检测和响应// 简化的汉字处理 void simple_chinese_handler(void) { uint8_t i 0; while(i rx_index) { // 检测到汉字特征 if(rx_buffer[i] 0x7F) {// 快速过滤可能是多字节字符 // 再进一步判断具体类型 printf(Chinese character detected at position %d: , i); // 如果是GBK可能汉字 if(i 1 rx_index rx_buffer[i] 0x81) { printf(GBK: %02X%02X, rx_buffer[i], rx_buffer[i1]); i 2;// 跳过第二个字节 } // 如果是UTF-8可能汉字 else if(i 2 rx_index (rx_buffer[i] 0xF0) 0xE0) { printf(UTF-8: %02X%02X%02X, rx_buffer[i], rx_buffer[i1], rx_buffer[i2]); i 3;// 跳过第二、三个字节 } else { printf(其他多字节字符); i; } printf(\r\n); } else { // 肯定是单字节ASCII字符 // ASCII字符 if(rx_buffer[i] \r || rx_buffer[i] \n) { // 行结束 break; } i; } } }汉字检测if(data[i] 0x7F)判断大于0x7F1270x7E: ~波浪线可打印字符 0x7F: DEL删除控制字符。ASCII 编码范围:0x00 - 0x7F: 标准ASCII字符128个字符; 0x80 - 0xFF: 扩展ASCII区域判断if(rx_buffer[i] 0x7F)是用来检测可能的中文字符的,GBK编码特点 0x7F;UTF-8编码特点都 0x7F;实际上只判断 0x7F是不够精确的因为扩展ASCII字符0x80-0xFF也可能不是汉字;某些特殊符号也在 0x7F 范围内.if(rx_buffer[i] 0x7F)是一个快速筛选条件用于区分单字节ASCII和多字节字符; 初步判断可能是非ASCII字符如汉字;作为进一步精确判断的前提.

相关文章:

STM32 串口发送中文

一、汉字编码基础 1.1、汉字识别 UTF-8编码特点:汉字通常占3个字节;首字节特征:1110xxxx (0xE0-0xEF)(都 > 0x7F);后续字节特征:10xxxxxx (0x80-0xBF)(都 > 0x7F) …...

收藏!你的大模型项目,面试官根本没在听(小白/程序员必看)

最近后台收到很多程序员和大模型小白的私信,其中一个同学的困惑特别有代表性:他面了三家公司,简历上写了两个大模型相关项目,一个RAG检索系统,一个Agent智能代理,从技术选型到落地部署都花了不少心思&#…...

3步破解微信记录管理难题:WeChatMsg如何重新定义数字记忆保存?

3步破解微信记录管理难题:WeChatMsg如何重新定义数字记忆保存? 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHu…...

新手零基础入门,快马ai带你三步搞定win10下的opencl开发环境

新手零基础入门,快马AI带你三步搞定Win10下的OpenCL开发环境 最近想学习GPU并行计算,发现OpenCL是个不错的入门选择。但作为新手,在Windows 10上配置开发环境时遇到了不少坑。经过一番摸索,终于找到了简单高效的解决方案&#xf…...

如何用Mi-Create打造专属小米手表表盘:零基础设计师的终极指南

如何用Mi-Create打造专属小米手表表盘:零基础设计师的终极指南 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 想让你的小米手表与众不同吗&#x…...

快速构建tomcat配置可视化原型:用快马一键生成配置向导界面

今天想和大家分享一个快速验证Tomcat配置方案的小技巧。作为一个Java开发者,经常需要折腾Tomcat的安装配置,每次都要重复下载、配环境变量、改server.xml这些步骤,特别耗时。最近发现用InsCode(快马)平台可以快速生成一个可视化配置向导&…...

收藏!小白/程序员转行Agent必看,4步理清学习思路,轻松具备求职竞争力

如今,AI领域的风口早已到来,Agent作为当下最热门的赛道之一,掌握其相关技能,无疑能让你在就业市场中脱颖而出,成为企业争抢的核心人才。无论是刚入门的编程小白,还是想转型的资深程序员,Agent都…...

美胸-年美-造相Z-Turbo部署避坑指南:Xinference日志解读与常见启动失败排查

美胸-年美-造相Z-Turbo部署避坑指南:Xinference日志解读与常见启动失败排查 1. 项目简介与部署价值 美胸-年美-造相Z-Turbo是基于Z-Image-Turbo LoRA版本的专业文生图模型,专注于高质量的美胸年美风格图像生成。通过Xinference框架部署,结合…...

GLM-4-9B-Chat-1M惊艳效果:1M token混合中英文技术文档中精准分离双语术语表

GLM-4-9B-Chat-1M惊艳效果:1M token混合中英文技术文档中精准分离双语术语表 想象一下,你手头有一份200万字的技术文档,中英文混杂在一起,专业术语随处可见。传统方法需要人工逐页翻阅,耗时耗力还容易出错。现在&#…...

javaweb有声漫画售卖商城

目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分技术实现要点扩展功能设计安全与合规项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 用户模块 注册与登录&#…...

使用gitee备份整个服务器数据

可以的,我给你说一套服务器上最标准、最稳妥的备份方案,专门针对你这种:/var/www 数据库 /etc/apache2 一起存到 Gitee 的场景。一、先说清楚:哪些要备份、哪些别乱备份1. 必须备份(你的网站核心)/var/ww…...

Windows系统优化指南:通过安全配置提升系统性能的完整方案

Windows系统优化指南:通过安全配置提升系统性能的完整方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors…...

IDM激活工具使用指南:长期使用IDM的技术方案详解

IDM激活工具使用指南:长期使用IDM的技术方案详解 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager(IDM&#xf…...

如何通过LCU API构建现代化英雄联盟工具箱:从技术选型到实战应用

如何通过LCU API构建现代化英雄联盟工具箱:从技术选型到实战应用 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 想象一下这样的场…...

效率提升秘籍:借助快马AI自动生成健壮的视频续播管理模块

最近在开发视频播放功能时,遇到了一个很常见的需求:实现"继续播放上次观看位置"的功能。本以为是个简单的功能,但实际开发中发现要考虑的细节还真不少。经过一番折腾,我总结出了一套高效的解决方案,分享给大…...

利用快马ai一键生成android studio配置脚本,五分钟搭建安卓开发原型环境

利用快马AI一键生成Android Studio配置脚本,五分钟搭建安卓开发原型环境 最近在尝试学习安卓开发,发现Android Studio的安装和配置过程相当繁琐。从下载安装包到配置SDK、创建模拟器,再到初始化项目,每一步都可能遇到各种问题。作…...

Qwen2.5-14B-Instruct部署案例:高校戏剧系用像素剧本圣殿教学实践

Qwen2.5-14B-Instruct部署案例:高校戏剧系用像素剧本圣殿教学实践 1. 项目背景与价值 在戏剧创作教学中,传统剧本创作方式面临诸多挑战:学生创意受限、格式不规范、修改成本高。某高校戏剧系引入基于Qwen2.5-14B-Instruct深度优化的"像…...

六自由度工业机器人设计【说明书(论文)+CAD图纸+SolidWorks三维图+任务书+开题报告】

六自由度工业机器人作为现代自动化领域的核心装备,其设计需兼顾机械结构、运动控制与系统集成等多维度技术要求。该类机器人通过六个独立旋转轴的协同运动,可实现末端执行器在三维空间内的灵活定位与姿态调整,广泛应用于焊接、装配、搬运等工…...

CA6140车床杠杆831009钻M6孔夹具设计全套带图

CA6140车床作为机械加工领域的经典设备,其杠杆零件(编号831009)的加工精度直接影响整机性能。针对该零件M6螺纹孔的加工需求,专用夹具的设计需兼顾定位稳定性、操作便捷性与加工经济性。通过分析零件结构可知,杠杆两端…...

这份Java核心知识点整理PDF,几乎涵盖了所有Java岗位的面试题

如果你正在准备Java开发面试,不管是校招还是社招,这份《JAVA核心知识点整理》PDF绝对是你在冲刺阶段最值得收藏的资料之一。它不是那种泛泛而谈的教程,而是直击面试高频考点的题库,包含了近300页的干货,从JVM底层到微服…...

【深度长文】一篇讲清 Kubernetes 控制平面架构,四个组件如何协同

引言 很多人第一次接触 Kubernetes,记住的是一串组件名称:API Server、etcd、Scheduler、Controller Manager、kubelet。再往后一些,会知道 Deployment 管副本,Scheduler 管调度,Operator 能做自动化运维。但如果继续…...

OpenClaw对话日志分析:Qwen3.5-9B优化任务执行成功率

OpenClaw对话日志分析:Qwen3.5-9B优化任务执行成功率 1. 问题背景与数据准备 去年开始使用OpenClaw对接Qwen3.5-9B模型时,我发现一个有趣现象:同样的自动化任务,在不同时段执行成功率波动很大。有时能完美完成文件整理和邮件发送…...

Ostrakon-VL-8B构建智能相册:基于自然语言的照片检索与回忆生成

Ostrakon-VL-8B构建智能相册:基于自然语言的照片检索与回忆生成 你有没有过这样的经历?手机里存了几千张照片,想找一张去年夏天在山上拍的照片,却要翻上十几分钟,甚至最后也没找到。或者,看着一堆旅行照片…...

Pumba在Kubernetes中的实战部署:DaemonSet配置指南

Pumba在Kubernetes中的实战部署:DaemonSet配置指南 【免费下载链接】pumba Chaos testing, network emulation, and stress testing tool for containers 项目地址: https://gitcode.com/gh_mirrors/pu/pumba Pumba是一款强大的容器混沌测试工具,…...

LocalVocal深度解析:打造完全本地的OBS实时字幕与翻译系统

LocalVocal深度解析:打造完全本地的OBS实时字幕与翻译系统 【免费下载链接】obs-localvocal OBS plugin for local speech recognition and captioning using AI 项目地址: https://gitcode.com/gh_mirrors/ob/obs-localvocal 在当今的数字内容创作时代&…...

Qwen3.5-9B-AWQ-4bit视觉理解效果实测:表格截图OCR准确率与语义概括质量分析

Qwen3.5-9B-AWQ-4bit视觉理解效果实测:表格截图OCR准确率与语义概括质量分析 1. 模型概述 Qwen3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型,能够结合上传图片与文字提示词,输出中文分析结果。这个量化版本特别适合处理图片主体识别、场…...

暗黑3一键宏终极指南:D3keyHelper让你的刷图效率翻倍

暗黑3一键宏终极指南:D3keyHelper让你的刷图效率翻倍 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑3中重复的技能按键感到疲…...

VisualCppRedist AIO:一站式解决Windows运行库问题的终极方案

VisualCppRedist AIO:一站式解决Windows运行库问题的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 问题场景:运行库缺失如何让…...

思源宋体:3大核心优势+5步落地指南,免费商用中文字体解决方案

思源宋体:3大核心优势5步落地指南,免费商用中文字体解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字化设计与开发中,中文字体的选择一…...

告别繁琐文字提取:Text-Grab本地化OCR工具效率提升指南

告别繁琐文字提取:Text-Grab本地化OCR工具效率提升指南 【免费下载链接】Text-Grab Use OCR in Windows quickly and easily with Text Grab. With optional background process and notifications. 项目地址: https://gitcode.com/gh_mirrors/te/Text-Grab …...