【串口收发框架】【printf重定向】【圆周率计算】
本开源程序实现如题目所示的三个功能1、串口收发框架使用硬件UART中断方式实现串口收发中断方式相对查询方式和GPIO软件模拟的优点在此就不多赘述了使用定时器实现串口接收超时复位避免接收到错误数据或数据未发完就终止时错误的状态始终保留导致再发送正确的数据正确的数据又和之前错误的数据拼接成一个错误的数据收发缓存为全局变量使用指针在中断函数中实现自动处理不需要在主程序中轮询某些状态和标志中断程序简单高效全状态机控制不会耽误大量时间不使用软件延时。2、printf重定向使用标准库stdio.h、stdarg.h实现变量格式化printf重定向到UART输出然后就可以愉快的使用printf了缺点是和直接写数组相比会消耗更多code空间。3、圆周率计算使用莱布尼茨法计算圆周率用于printf输出变量由于莱布尼茨法是收敛的无穷级数且偶数项为正奇数项为负程序中保留上一次迭代结果并和本次迭代结果求平均值以加速收敛实测454次迭代结果为3.141592如不求相邻两次平均值则需上万次迭代且由于浮点数精度的限制几万次迭代后误差会越来越大。单片机STC8G1K08A-8PIN时钟频率11.0592MHzUART1 9600bps 8N1为便于观察主程序中延迟50ms串口默认为阻塞模式即上一个数据包未发完又发新的数据包时会等待串口状态复位即发送长度为0Uart_Send_Lenth0该变量为全局变量数据包发送完毕后在中断程序中清零表示数据包发送完毕该模式在软件发送频率大于硬件发送频率时软件发送频率会被拖慢但不会发送错误的数据注释掉while(Uart_Send_Lenth)即可改为覆盖模式该模式上一个数据包未发完又发新的数据包时新的数据包会覆盖掉原数据包且串口状态被重置发送的数据包会被打断但软件发送不会被拖慢如在阻塞模式下没有达到预期速度或在覆盖模式下发送数据错误请降低发送频率或提高波特率该串口收发框架100%。如不想使用printf函数直接写发送缓存以下为范例程序T_Buffer[0]T;T_Buffer[1];T_Buffer[2]Hex_to_Ascii[t%10000/1000];T_Buffer[3]Hex_to_Ascii[t%1000/100];T_Buffer[4].;T_Buffer[5]Hex_to_Ascii[t%100/10];T_Buffer[6]Hex_to_Ascii[t%10];T_Buffer[7]C;T_Buffer[8] ;T_Buffer[9]P;T_Buffer[10];T_Buffer[11]Hex_to_Ascii[p%1000000/100000];T_Buffer[12]Hex_to_Ascii[p%100000/10000];T_Buffer[13]Hex_to_Ascii[p%10000/1000];T_Buffer[14].;T_Buffer[15]Hex_to_Ascii[p%1000/100];T_Buffer[16]Hex_to_Ascii[p%100/10];T_Buffer[17]Hex_to_Ascii[p%10];T_Buffer[18]K;T_Buffer[19]P;T_Buffer[20]a;T_Buffer[21]0x0d;T_Buffer[22]0x0a;UART_Send(23);对发送缓存数组赋值后调用UART_Send(x)即可x为发送长度。因没有使用串口接收功能串口接收程序是个半成品需用户按照具体协议编写解析程序以下为范例程序void Uart_Isr(void) interrupt 4{static unsigned int tp;unsigned int temp,lenth,i;if(RI){RI0;Uart_Start();R_Buffer[RP]SBUF;if(RP1){temp(R_Buffer[0]8)R_Buffer[1];if(temp0x0200){R_Buffer[1]0x07;switch(R_Buffer[0]){case R:Uart_Send_Iap(R_Buffer[1]);Sector0xFF;break;case W:SectorR_Buffer[1];Iap_Erase_Sector(Sector*0x0200);Uart_Printf(扇区%bd已擦除\xFD请切换到HEX模式写入数\xFD据\r\n,Sector);break;}Uart_Stop();}else if(temp2temp512){lenthtemp;}}if(RPlenth-1lenth2Sector8){for(i0;ilenth;i){Iap_Program_Byte(Sector*0x0200i,R_Buffer);Uart_Start();}Uart_Stop();Uart_Printf(扇区%bd写入%d字节\r\n,Sector,lenth);Sector0xFF;}else if(RPR_Buffer_Len-1){Uart_Stop();}else if(TR0){RP;}}if(TI){TI0;if(Uart_Send_Lenth!0){SBUF(T_Buffer[TP]);TP;}if(TPUart_Send_Lenth){TP0;Uart_Send_Lenth0;}}}这是一个接收不固定长度数据包的程序前两个字节为长度最大长度512字节如您也需要接收这么长的数据包则需要修改接收缓存长度R_Buffer_Len大于数据包长度注意接收到除了包尾的每个字节后都要调用Uart_Start()函数以重置超时定时器在接收到期望的数据包正确数据包或错误数据包后调用Uart_Stop()函数立即重置状态即可如不立即重置状态在超时后也会自动重置状态但在此期间又收到数据会发生数据接收错误。该例程包含汉字0xFD问题的解决方法供参考。以下是完整程序/*----------------------------分割线----------------------------*/#include STC8G.H#include define.h#include intrins.h#include string.h#include stdio.h#include stdarg.h#define RXD P30#define TXD P31#define FOSC 11059200UL#define BAUD 9600UL#define BRT (0x10000-FOSC/BAUD/4)#define R_Buffer_Len 64 //Uart1接收缓存长度#define T_Buffer_Len 64 //Uart1发送缓存长度unsigned char RP; //Uart1接收指针unsigned char TP; //Uart1发送指针unsigned char Uart_Send_Lenth; //Uart1发送长度unsigned char xdata R_Buffer[R_Buffer_Len]; //Uart1接收缓存unsigned char xdata T_Buffer[T_Buffer_Len]; //Uart1发送缓存///*----------------------------延时10usSTC-Y611.0592MHz----------------------------*///void Delay_10us(void)//{// unsigned char i;// i35;// while(--i);//}///*----------------------------延时x10us----------------------------*///void Delay_x10us(unsigned char x)//{// while(x--)// Delay_10us();//}/*----------------------------延时10msSTC-Y611.0592MHz----------------------------*/void Delay_10ms(void){unsigned char i,j;_nop_();_nop_();i144;j157;do{while(--j);}while(--i);}/*----------------------------延时x10ms----------------------------*/void Delay_x10ms(unsigned char x){while(x--)Delay_10ms();}void UART_Send(unsigned int x){TP0;Uart_Send_Lenthx;TI1;}void Uart_Printf(unsigned char *v,...){va_list ap;va_start(ap,v);while(Uart_Send_Lenth);UART_Send(vsprintf(T_Buffer,v,ap));va_end(ap);}void Init(void){P_SW2|EAXFR;P3M00x00;P3M10x00;AUXR0x40; //设置定时器0时钟为12T模式设置定时器1为1T模式设置定时器1为波特率发生器TMOD0x01; //设置定时器0为16位不自动重装载模式设置定时器1为16位自动重装载模式TL00x00; //设置定时器0初始值5msTH00xEE; //设置定时器0初始值5msTF00; //清除TF0中断标志位ET01; //启用定时器0中断SCON0x50; //设置UART1模式为8位数据可变波特率TL1BRT; //设置UART1波特率TH1BRT8; //设置UART1波特率TR11; //打开定时器1ES1; //启用UART1中断EA1; //启用总中断}void main(void){unsigned int x;float pi,pi_last;Init();x0;pi0.0F;while(1){x%2?(pi-4.0F/((float)x*2.0F1.0F)):(pi4.0F/((float)x*2.0F1.0F));Uart_Printf(x%U pi%1.6F\r\n,x,(pipi_last)/2);pi_lastpi;if(x454)while(1);x;Delay_x10ms(5);}}void Uart_Start(void){TL00x00;TH00xEE;TR01;}void Uart_Stop(void){TR00;TL00x00;TH00xEE;RP0;memset(R_Buffer,0x00,sizeof R_Buffer);}void Timer0_Isr(void) interrupt 1{Uart_Stop();}void Uart_Isr(void) interrupt 4{if(RI){RI0;Uart_Start();R_Buffer[RP]SBUF;if(RPR_Buffer_Len-1){Uart_Stop();}else if(TR0){RP;}}if(TI){TI0;if(Uart_Send_Lenth!0){SBUF(T_Buffer[TP]);TP;}if(TPUart_Send_Lenth){TP0;Uart_Send_Lenth0;}}}硬件选项的时钟频率11.0592M注意下载端口一定要选CDC不要选HID否则不能正确发送下载命令用户命令按图设置功能描述打印到控制台串口输出参数说明*format格式控制。支持以下格式%ds16数据%uu16数据%lds32数据%luu32数据%s字符串%cASCII字符%Xu16数据的16进制字符串%lXu32数据的16进制字符串%[0][1-5]u以n的宽度显示u16数据不足时可前置添0超过时宽度限制无效%[0][1-10]lu以n的宽度显示u32数据不足时可前置添0超过时宽度限制无效%.[0-4]d对s16数据以小数形式呈现%.[0-9]ld:对s32数据以小数形式呈现%.[0-4]u对u16数据以小数形式呈现%.[0-9]lu对u32数据以小数形式呈现%.nd参数1为保留小数位数参数为2为s16数据%.nld参数1为保留小数位数参数为2为s32数据%.nu参数1为保留小数位数参数为2为u16数据%.nlu参数1为保留小数位数参数为2为u32数据%t参数1为字符串指针。参数2为限制长度可以是参数1的空间大小-1。将此字符之前的格式化的字符复制到第1个字符串指针位置%hs:参数1为u8指针。参数2为限制长度。将此数据转为十六进制字符串。%hn:参数1为u8指针。参数2为限制长度。直接拷贝源数据。

相关新闻

终极指南:用scroll-world零代码构建沉浸式3D滚动页面

终极指南:用scroll-world零代码构建沉浸式3D滚动页面

终极指南:用scroll-world零代码构建沉浸式3D滚动页面 【免费下载链接】scroll-world A skill that turn any brand into a scrollable 3D world landing page 项目地址: https://gitcode.com/gh_mirrors/sc/scroll-world 在当今竞争激烈的数字世界中&#xf…

2026/8/10 22:15:05 阅读更多 →
Feather完整指南:如何在iOS设备上免越狱安装和管理应用

Feather完整指南:如何在iOS设备上免越狱安装和管理应用

Feather完整指南:如何在iOS设备上免越狱安装和管理应用 【免费下载链接】Feather Free on-device iOS/iPadOS application manager/installer, using certificates part of the Apple Developer Program. 项目地址: https://gitcode.com/GitHub_Trending/feather4…

2026/8/10 22:14:05 阅读更多 →
Node.js 服务高并发卡顿排查:从 Event Loop 阻塞诊断到 CPU Profiling 闭环

Node.js 服务高并发卡顿排查:从 Event Loop 阻塞诊断到 CPU Profiling 闭环

Node.js 服务高并发卡顿排查:从 Event Loop 阻塞诊断到 CPU Profiling 闭环 当 Node.js 服务出现“流量和下游正常、CPU 却持续升高”的现象,应优先检查事件循环是否被同步计算阻塞。大 JSON 解析、正则处理和序列化都可能触发这类问题。 本文以大报文解…

2026/8/10 22:14:05 阅读更多 →

最新新闻

AI审稿时代:如何撰写机器友好型学术论文以提升录用率

AI审稿时代:如何撰写机器友好型学术论文以提升录用率

最近在学术圈交流时,发现一个越来越明显的趋势:同行们对AI辅助审稿的态度,正从最初的“新奇尝试”迅速分化为“坚决拥护”和“强烈抵制”两大阵营。这种分化不仅停留在口头讨论,更直接影响了投稿策略、期刊选择乃至学术评价体系。…

2026/8/10 23:59:02 阅读更多 →
小尺寸,大乾坤:XTX 2G-bit SPI NAND (XT26G02C)

小尺寸,大乾坤:XTX 2G-bit SPI NAND (XT26G02C)

写在前面嵌入式开发中,存储选型一直是个经典话题。NOR Flash 简单可靠、支持XIP,但容量上去之后价格确实不太友好。并行NAND容量大、成本低,但引脚多、占PCB面积,还得配ECC和坏块管理,主控要求也高。SPI NAND Flash算是…

2026/8/10 23:59:02 阅读更多 →
开源剪贴板管理工具全解析:从原理到企业级部署

开源剪贴板管理工具全解析:从原理到企业级部署

1. 为什么你需要一个剪贴板管理工具? 在日常工作中,我经常遇到这样的场景:刚复制了一段重要代码,转头就被新的复制操作覆盖;或者需要反复在不同窗口间复制粘贴相同内容;甚至更糟的是,不小心关闭…

2026/8/10 23:59:02 阅读更多 →
浏览器渲染全流程解析与性能优化实践

浏览器渲染全流程解析与性能优化实践

1. 从URL到页面:浏览器渲染的完整流程解析 当我们在地址栏输入一个网址并按下回车键,背后发生的是一系列精妙而复杂的操作。这个过程看似瞬间完成,实则包含了多个关键阶段,每个阶段都可能成为性能优化的关键点。 浏览器首先会进行…

2026/8/10 23:59:02 阅读更多 →
StarRocks与LSM-Tree架构解析及性能优化实战

StarRocks与LSM-Tree架构解析及性能优化实战

1. StarRocks与LSM-Tree架构解析 StarRocks作为新一代MPP数据库,其底层存储引擎采用了经过深度优化的LSM-Tree结构。这种设计在金融、电商等需要高吞吐写入的场景中表现出色,单节点实测可达到10万行/秒的写入速度。与传统的B树结构相比,LSM-T…

2026/8/10 23:59:02 阅读更多 →
SpringBoot+Vue+MySQL构建大学生服务平台全栈实践

SpringBoot+Vue+MySQL构建大学生服务平台全栈实践

1. 项目概述 这个毕业设计项目构建了一个基于SpringBootVueMySQL技术栈的大学生一体化服务平台。作为全栈开发项目,它涵盖了从后端API开发到前端界面实现,再到数据库设计的完整流程。平台主要面向高校学生群体,整合了课程管理、成绩查询、校园…

2026/8/10 23:58:02 阅读更多 →

日新闻

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南 【免费下载链接】graphql-css A blazing fast CSS-in-GQL™ library. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-css GraphQL-CSS是一个基于GraphQL的CSS-in-GQL™库&#xff0…

2026/8/10 0:00:02 阅读更多 →
告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.com/…

2026/8/10 0:00:02 阅读更多 →
BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾经因为游戏插件的复杂…

2026/8/10 0:00:02 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/10 1:05:29 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/10 1:05:29 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/10 1:05:29 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/10 1:05:29 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →