在STM32学习中,我们肯定会学到串口的使用。其中关于串口数据的接收和发送,我们其实可以用 printf() 函数和 getchar() 函数来简化传输。我们只需要做一些简单的前期工作即可。
在 C 语言标准库中,fputc 函数是 printf 函数内部的一个函数,功能是将字符 ch 写入到文件指针 f 所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。我们使用 USART 函数重新修改 fputc 函数内容,达到类似“写入”的功能。
fgetc 函数与 fputc 函数非常相似,实现字符读取功能。在使用 scanf 函数时需要注意字符输入格式。
还有一点需要注意的,使用 fput 和 fgetc 函数达到重定向 C 语言标准库输入输出函数必须在 MDK 的工程选项把“Use MicroLIB”勾选上,MicoroLIB 是缺省 C 库的备选库,它对标准 C 库进行了高度优化使代码更少,占用更少资源。为使用 printf、scanf 函数需要在文件中包含 stdio.h 头文件
代码如下:
/*重定向c库函数printf到串口,重定向后可使用printf函数*/
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
//DEBUG_USARTx改成你想用的USART端口
/* 等待发送完毕 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
//DEBUG_USARTx改成你想用的USART端口
return (ch);
}
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
//DEBUG_USARTx改成你想用的USART端口
return (int)USART_ReceiveData(DEBUG_USARTx);
//DEBUG_USARTx改成你想用的USART端口
}
如果你用的是STM32的固件库,应该可以直接复制粘贴,只需要改DEBUG_USARTx即可。如果你是其他的,呢么你只要把这两段代码里的发送和接受函数,换成你自己的函数即可。
当然,有的小伙伴会发现,自己在重定向的时候可能会出错,达不到预期的效果。(排除你重定向函数写错的可能)
首先,记得包含头文件 #include 其次,如果你用的是 KEIL,你还需要设置一个东西 点击这个魔术棒,进入到设置页面 然后点击使用Use MicroLIB 一般注意这两点的话,就可以成功的实现重定向
上一篇:STM32笔记 (九)串口通讯USART(串口发送接收编程)
下一篇:STM32重定向C库printf/scanf
推荐阅读
史海拾趣
Cogent_Computer_Systems公司在成立之初,便以其独特的技术创新在电子行业中崭露头角。公司研发团队成功开发出一款高性能的计算机芯片,该芯片在运算速度和能效比方面均达到了行业领先水平。这一技术突破迅速吸引了众多客户的关注,Cogent_Computer_Systems公司也因此获得了大量的订单。随着市场需求的不断增长,公司逐渐扩大生产规模,优化供应链管理,实现了业务的快速扩张。
Cogent_Computer_Systems公司在成立之初,便以其独特的技术创新在电子行业中崭露头角。公司研发团队成功开发出一款高性能的计算机芯片,该芯片在运算速度和能效比方面均达到了行业领先水平。这一技术突破迅速吸引了众多客户的关注,Cogent_Computer_Systems公司也因此获得了大量的订单。随着市场需求的不断增长,公司逐渐扩大生产规模,优化供应链管理,实现了业务的快速扩张。
AMRI Enterprise Co Ltd注重与高校和研究机构的产学研合作,通过引进先进技术和人才,推动公司的技术创新。公司与多所知名高校建立了紧密的合作关系,共同开展科研项目和技术攻关。这些合作不仅为AMRI带来了前沿的技术成果,还提升了公司的研发能力和创新能力。在产学研合作的推动下,AMRI不断推出具有创新性和竞争力的新产品,为公司的持续发展提供了强有力的支撑。
随着公司的发展,技术创新成为推动重庆平洋电子有限公司不断前进的重要动力。公司不断加大对研发的投入,引进高端人才,积极研发新技术、新产品。经过多年的努力,公司在电子元器件领域取得了重大突破,产品性能和质量得到了显著提升,赢得了市场的广泛认可。
在快速发展的同时,GSR Technology Ltd始终关注可持续发展和社会责任。公司积极推动绿色生产,采用环保材料和工艺,减少对环境的影响。同时,公司积极参与公益事业,为贫困地区提供技术支持和教育援助。此外,公司还加强知识产权保护,维护行业健康发展。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。
请注意,以上故事均为虚构内容,旨在展示一个类似公司在电子行业中的可能发展路径。实际情况可能因公司具体策略、市场环境等因素而有所不同。
在激烈的市场竞争中, Friedrich Lütze GmbH 深知品牌建设的重要性。公司不断加大品牌宣传力度,通过参加国内外知名展会、举办技术研讨会等方式,提升品牌知名度和影响力。同时,公司注重客户服务体验,建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。这些举措有效提升了公司在市场上的竞争力和客户满意度。
在杭州的同行谁有S3C2450的开发板,12M 晶振, 64M DDR2 内存的板子,我想借用下测试下代码。我现在的板子DDR2内存没有工作,我用Samsung WinCE NBoot 和 测试代码的配置初始化DDR2都不能正常工作,我想确认下是代码问题还是硬件问题。大家交个朋友 ...… 查看全部问答∨ |
小弟使用2.6.28内核因为用了新的创建设备节点方式。其中调用了class_device_create函数,并且引用了linux/device.h 但是在编译时却提示class_device_create为隐士声明! 请帮助小弟。… 查看全部问答∨ |
FATUTIL_COMPONENTS=fatutil_ui fatutil_main exfatutil GWE1_COMPONENTS=wmbase gweshare gwesmain immthunk msgque GSetWinLong CePtr foregnd idle kbdui uibase msgbeep audio GWE2_COMPONENTS=mgbase mgbitmap mgblt mgblt2 mgdc mgdibsec m ...… 查看全部问答∨ |
我想转投嵌入式Linux系统开发,可是不知道嵌入式Linux是在Linux下用C/C++开发,还是用Linux本身的语法在Shell中开发?另外如果是用C/C++开发的话是用C开发的多还是用C++多?我有一点C和C++的基础,但是不多,不知道这两个语言在Linux ...… 查看全部问答∨ |
我设置的都是一通道都行但是我设置其它通道就不行了,这个是为啥子啊! 例如我设置的是P6SEL=0x01;//AD0通道 那么我设置P6SEL=0x02;//AD1通道啊。 咋个我设置了P6.0依然还是在采集数据,我现在想的就是用其它端口采集数据!… 查看全部问答∨ |
|
#include \"msp430f5525.h\" #define READBIT(y,x) (x & (y)) if(!READBIT(STAT_F_DELAY_AFTER_RESET_IN,usSTATUS_FLAGS)) 我在看一个程序,但看到IF这里就看不懂了。请问下是怎么回事 这里的usS ...… 查看全部问答∨ |
对MSP430系列单片机进行编程的方式有以下3种:利用JTAG接口,利用BSL固件和利用用户自定义的升级固件。由于利用自定义升级固件进行程序升级的方式比较灵活,且用途广泛,因此本文将对其作重点介绍。 1 利用JTAG接口 MSP430系列 ...… 查看全部问答∨ |