完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
串口通信作为拓展单片机功能的一个外设,其本身还有一个常用的功能就是用于调试使用,通过对一个值的输出从而观察所要的值是否正确,比较形象,但是自己在写串口的时候写出来的程序不能像当初VC++里的C语言一样利用printf()函数还输出汉字,而是一堆乱码的东西或者16进制数字,看着很难受,于是就决定把这个东西的原理给搞懂;串口的配置就不多说了,主要是针对STM32来说,printf()函数该怎么写;
printf()的重定向(三个步骤) 步骤一: 重定向: 简单来说就是用户写了一个跟C标准库一模一样的函数,在进行工程编译时,连接器检查到用户自己编写的有某个和C库函数同名的用户写的函数,就会优先采用用户编写的函数,这就叫重定向; 而且这里我们为了实现重定向printf()函数,我们重写了fputc(int ch,FILE *f)这个C标准库函数,因为printf()在C标准库函数中实质上是个宏定义,最终调用的是fputf(int ch,FILE *f)这个函数; //重定向C库函数printf()到串口,重定向后可使用printf(); int fputc(int ch,FILE *f) { USART_SendData(USART1,(uint8_t)ch); while(!(USART_GetFlagStatus(USART1,USART_FLAG_TC))); return ch; } printf()对应的底层函数接口在"stdio.h"中的第673行 注:
#include "stm32f10x.h" #include "usart.h" #include "stdio.h" //标准输入输出头文件; #include "systick.h" int main() { systick_Init(); USART1_Init(115200); while(1) { printf("无语尊wuyuzunn"); delay_ms(100); } } 完成上面这两个操作后,就可以通过串口助手软件看输出了: 扩展 在对STM编程时,除了可以对printf进行重定向之外,还可以对scanf重定向; scanf()重定向函数如下: int fgetc(FILE *stream) { while(!(USART1->SR & (1 << 5)));//等待数据接收完成 return USART1->DR; } scanf()对应的底层函数接口在"stdio.h"中的第649行: 同理,还可以拓展C库中其他函数; #define printf(FORMAT,...) { sprintf(printf_buff,FORMAT,##__VA_ARGS__); HAL_UART_Transmit(&huart2,(uint8_t *)printf_buff,strlen(printf_buff),0xFFFF); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 17:25 , Processed in 0.726501 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号