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

单片机使用串口(usart) , 封装( print )函数 .

( 此代码在AT32F421c8t7上测试通过 )

首先 : 需要本身就有一个串口发送函数,并且必须要有阻塞模式.( 上个数据没发送完毕,就阻塞 )

//串口发送字节函数
void usart_data_transmit(usart_type* usart_x, uint16_t data)
{// 等待发送缓冲区为空(可以放入新数据)while(usart_flag_get(usart_x, USART_TDBE_FLAG) == RESET){// 等待直到发送缓冲区为空}usart_x->dt = (data & 0x01FF);
}//使用示例
usart_data_transmit (USART1, 0x66);

第二步: 加入以下头文件和print函数.

#include <stdarg.h>
/* 自定义串口打印函数 */
void usart_print(usart_type* USARTx, const char* format, ...) {va_list args;char buffer[128];int length;int i;const char* p;int precision;  // 精度控制变量/* 使用正确的 va_list 处理 */va_start(args, format);length = 0;/* 手动实现简单的格式化输出 */p = format;while (*p != '\0') {if (*p == '%') {p++;  // 跳过 '%'// 检查是否有精度指定(如 .3)precision = -1;  // -1 表示使用默认精度if (*p == '.') {p++;  // 跳过 '.'precision = 0;while (*p >= '0' && *p <= '9') {precision = precision * 10 + (*p - '0');p++;}}switch (*p) {case 'd': {  // 整数int num = va_arg(args, int);length += sprintf(&buffer[length], "%d", num);break;}case 'f': {  // 浮点数double num = va_arg(args, double);if (precision >= 0) {// 使用自定义精度char format_str[8];sprintf(format_str, "%%.%df", precision);length += sprintf(&buffer[length], format_str, num);} else {// 使用默认精度(3位)length += sprintf(&buffer[length], "%.3f", num);}break;}case 's': {  // 字符串char* str = va_arg(args, char*);length += sprintf(&buffer[length], "%s", str);break;}case 'c': {  // 字符char ch = (char)va_arg(args, int);buffer[length++] = ch;break;}default:buffer[length++] = *p;break;}} else {buffer[length++] = *p;}p++;}va_end(args);/* 发送数据 */for (i = 0; i < length; i++) {// 添加忙等待检测while(usart_flag_get(USARTx, USART_TDBE_FLAG) == RESET);usart_data_transmit(USARTx, buffer[i]);}
}

最后:使用示例,和发送展示效果

		// 默认精度(3位小数)usart_print(USART1, "默认精度: %f\r\n", 3.14159);  // 输出: 默认精度: 3.142// 自定义精度usart_print(USART1, "1位小数: %.1f\r\n", 3.14159);  // 输出: 1位小数: 3.1usart_print(USART1, "2位小数: %.2f\r\n", 3.14159);  // 输出: 2位小数: 3.14usart_print(USART1, "4位小数: %.4f\r\n", 3.14159);  // 输出: 4位小数: 3.1416// 混合使用usart_print(USART1, "温度: %.1f°C, 电压: %.2fV\r\n", 25.5, 3.141);

http://www.dtcms.com/a/457965.html

相关文章:

  • 外贸网站建设和优化做网站要不要学ps
  • 福建省建设厅网站 企业三网一体网站建设
  • 湖南做网站大连凯杰建设有限公司网站
  • 吴恩达机器学习课程(PyTorch适配)学习笔记:2.4 激活函数与多类别处理
  • 【PAG】PAG简介
  • hutool交并集
  • 赣州建设公司网站权威网站有哪些
  • Python制作12306查票工具:从零构建铁路购票信息查询系统
  • 《道德经》第十三章
  • 东莞做网站网络公司官网建设的重要性
  • Docker 容器操作
  • 小说网站建设源码潜江网络
  • 做网页游戏网站html网页设计大赛作品
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(8):语法 +考え方21+2022年7月N1
  • 维基框架 (Wiki Framework) v1.1.2 | 企业级微服务开发框架
  • 做的网站提示不安全个人网站的名字
  • 用wordpress建站会不会显得水平差喜迎二十大作文
  • 我已经把 Cookie 的值从 zhangfei 改成了 guanyu,为什么再次获取时还是 zhangfei?”
  • C++回调函数的设计以及调用者应注意的问题
  • 上海推广网站公司网站搭建什么意思
  • 美团-Mtgsig4.0.4逆向-Js逆向
  • 巩义推广网站哪家好制作网站设计的技术有
  • 孝感房地产网站建设建设总承包网站
  • 杭州网站建设服务公司小程序商城源代码
  • SSH运维操作:从基础概念到高级
  • WinSCP下载和安装教程(附安装包,图文并茂)
  • Linux环境基础开发工具
  • 备案期间网站wordpress个人简历主题
  • AI智能体(Agent)大模型入门【8】--关于ocr文字识别图片识别
  • 商城版网站建设网站开发的经验