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

建站一条龙/互联网营销师是干什么

建站一条龙,互联网营销师是干什么,wordpress登陆后段后端,网店有哪些平台为什么需要printf函数 标准库的 printf函数 能方便的输出格式化的字符串 而单片机只有串口,只能打印int型数。如果能借用标准库 stdio.h 文件里的 printf函数,那么单片机输出格式化字符串就方便了。 printf函数原理 printf函数 的底层会调用字符输出函…

为什么需要printf函数

标准库的 printf函数 能方便的输出格式化的字符串

而单片机只有串口,只能打印int型数。如果能借用标准库 stdio.h 文件里的 printf函数,那么单片机输出格式化字符串就方便了。

printf函数原理

printf函数 的底层会调用字符输出函数,我们只需要把这个字符输出函数给重新实现为我们的单片机串口输出函数,就可以实现 printf函数 功能了。

stdio.h有两种:

keil用的是armcc编译器(只支持stm32)

MDK\ARM\ARMCC\include这个目录下的stdio.h

armcc这个stdio.h里的 printf函数 的底层调用的 字符输出函数 是fputc(int ch, FILE *f)函数,所以我们重新实现该函数即可。(见附录中的方案2的解释)

//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ int handle; 
}; FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif

关于半主机,参考附录的解决方案2

其它IDE用的是gcc编译器

GNU-Tools-ARM-Embedded\arm-none-eabi\include里面的stdio.h

gcc编译器这个stdio.h里的 printf函数 的底层调用的 字符输出函数 是print_char(char c)函数,所以我们重新实现该函数即可

#include <stdio.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdarg.h>#undef errno
extern int errno;
extern int _end;
//extern void print_char(char);//这样重新定义一下即可
void print_char(char c)
{HAL_UART_Transmit(&handle, (uint8_t *) (&c), 1, 1); //我们单片机的串口输出函数
}caddr_t _sbrk(int incr)
{static unsigned char *heap = NULL;unsigned char *prev_heap;if (heap == NULL){heap = (unsigned char *) &_end;}prev_heap = heap;heap += incr;return (caddr_t) prev_heap;
}int link(char *old, char *new)
{return -1;
}int _close(int file)
{return -1;
}int _fstat(int file, struct stat *st)
{st->st_mode = S_IFCHR;return 0;
}int _isatty(int file)
{return 1;
}int _lseek(int file, int ptr, int dir)
{return 0;
}int _read(int file, char *ptr, int len)
{return 0;
}void abort(void)
{/* Abort called */while (1);
}int _write(int fd, char *pBuffer, int size)
{for (int i = 0; i < size; i++){if (pBuffer[i] == '\n'){print_char('\r');}print_char(pBuffer[i]);}return size;
}


附录

关于微库,半主机的解释:

半主机:专门用arm的,比如我们的开发板没有 键盘和屏幕 ,但是,使用半主机模式后,我们就可以利用仿真器或其他连接到电脑(主机),使用电脑(即主机)的屏幕和键盘通过printf() 和 scanf() 来与开发板交互。

单片机使用 printf() 和 scanf() 函数时 ,只是希望通过自身硬件带有的串口,打印或接收数据。所以此时的单片机并不是工作在半主机模式的

而我们通常使用的C库 中 printf() 和 scanf() 函数 是需要工作在半主机模式。如何解决这个矛盾?

方案1在KEIL中勾选 Use MicroLIB . 即使用微库. (因为微库是一个压缩库,而微库中的printf() 和 scanf() 函数 就不是工作在半主机模式下的),其实keil就是在编译参数里传入了一个
-D__MICROLIB 这个宏

方案2继续使用标准的C库,在代码中声明不使用半主机模式。所以就有了上面keil中stm32程序那段代码了。而gcc的stdio.h中的printf是不需要指明不使用半主机的。

参考博客:

配置CLion用于STM32开发【优雅の嵌入式开发】 - 知乎

STM32(3日学习总结|printf的重定向)_蒋同学高数不睡觉的博客-CSDN博客_#include <_ansi.h>

STM32使用printf函数的步骤和注意事项_石头牛的博客-CSDN博客_stm32使用printf

RT-Thread Studio生成的stm32f407裸机工程代码 

http://www.lbrq.cn/news/1479781.html

相关文章:

  • 绵阳手机网站制作/网站内部seo
  • 杭州网站建设宣盟网络/职业教育培训机构排名前十
  • 事业单位网站建设计划/电商代运营一般收多少服务费
  • 做资讯网站需要哪些资质/百度推广总部电话
  • 如何更改wordpress语言/优化网站的步骤
  • 济南做兼职网站/系统优化大师下载
  • 厦门网站建设680/sem竞价
  • wordpress 两栏主题/百度词条优化工作
  • 做网站需要注册哪类商标/整合网络营销是什么
  • 网站建设水平如何评价/东莞网站制作十年乐云seo
  • 塑料机械怎么做网站/软文推广新闻发布
  • 微信公众号微网站怎么做/百度优化软件
  • 我想自学建网站/seo助力网站转化率提升
  • 广州小企业网站制作/b站视频推广怎么买
  • 浦口区网站建设技术指导/宁波seo网站推广软件
  • wordpress语言包更新/昆山seo网站优化软件
  • 北京网站优化专家/推广图片制作
  • 科技创新的重要性和意义/优化大师免费版下载
  • 网站seo方案模板/微商软文范例大全100
  • 陕西网站建设品牌公司推荐/免费有效的推广网站
  • 山东微商网站建设/数据指数
  • 深圳微商城网站设计多少钱/免费的seo网站
  • 做网站宣传的公司/可以免费打广告的网站
  • b2c平台网站建设/培训机构哪家好
  • 自己建设网站模版/做网站建设的公司
  • 毕业设计题目怎么选题/品牌seo培训咨询
  • 泰州做网站需要多少钱/seo搜索引擎推广什么意思
  • wordpress做外贸站/怎么自己弄一个网站
  • 独立网站建设/网络营销服务平台
  • html网站的直播怎么做/windows优化大师收费吗
  • Go语言中的盲点:竞态检测和互斥锁的错觉
  • C#常见的转义字符
  • AR智能巡检系统:制造业设备管理的效率革新
  • 前端渲染三国杀:SSR、SPA、SSG
  • 【Flask基础②】 | 路由、响应与异常处理
  • PHP 与 MySQL 详解实战入门(1)