STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK)

已有 12456 次阅读2011-6-29 23:29 |

在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。
下面就说一下使用printf需要做哪些配置。
有两种配置方法:
一、对工程属性进行配置,详细步骤如下
1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。
2、在main文件中重定义<fputc>函数    如下:
// 发送数据
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
}
// 接收数据
int GetKey (void)  {

while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
   }

这样在使用printf时就会调用自定义的fputc函数,来发送字符。
3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"”
MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。
至此完成配置,在工程中可以随意使用printf向串口发送数据了。
二、第二种方法是在工程中添加“Regtarge.c”文件
1、在main文件中包含 “stdio.h” 文件
2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中
在文件中输入如下内容(直接复制即可)
#include <stdio.h>
#include <rt_misc.h>
#pragma import(__use_no_semihosting_swi)
extern int  SendChar(int ch); // 声明外部函数,在main文件中定义
extern int  GetKey(void);
struct __FILE {
  int handle;                 // Add whatever you need here 
};
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
  return (SendChar(ch));
}
int fgetc(FILE *f) {
  return (SendChar(GetKey()));
}
void _ttywrch(int ch) {
 SendChar (ch);
}
int ferror(FILE *f) {                            // Your implementation of ferror
  return EOF;
}
void _sys_exit(int return_code) {
label:  goto label;           // endless loop
}
3、在main文件中添加定义以下两个函数
int SendChar (int ch)  {
while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口
  USART1->DR = (ch & 0x1FF);
return (ch);
}
int GetKey (void)  {
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
至此完成配置,可以在main文件中随意使用 printf 。

STM32串口通信中使用printf发送数据配置方法 开发环境 Keil相关推荐

  1. java 采用串口通信实现LED屏发送数据中文乱码问题

    java 采用串口通信实现LED屏发送数据中文乱码问题 1.定义:Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(1024)) ...

  2. c++学习 | MFC —— 串口通信(四)发送数据

    文章目录 一.写串口函数 1.源函数 2.API 函数详解 (1)ClearCommError()函数--读取串行端口现在的状态 (2)PurgeComm()函数--清空缓冲区 (3)WriteFil ...

  3. c51单片机串口通信电脑向单片机发送数据

    main.c #include <REGX52.H> #include "UART.H"void Delay(int t) { while(--t); }void ma ...

  4. STM32串口通信中的USART_RecieveData函数分析

    拿这个中断函数为例 void USART1_IRQHandler() {u8 rec;if(USART_GetITStatus(USART1,USART_IT_RXNE)){rec = USART_R ...

  5. STM32串口通信详解(嵌入式学习)

    STM32串口通信 1.通信基础知识 1.1 时钟信号区分 同步通信 异步通信 波特率 总线协议(电气协议) 1.2 通信方式划分 串行通信 并行通信 1.3 通信方向划分 单工通信 半双工通信 全双 ...

  6. Arduino中Serial.print()与Serial.write()函数的区别,以及串口通信中十六进制与字符串的收发格式问题和转换过程详解

    1.串口通信中十六进制和字符数据的区别 串口收发数据时字符.十六进制.二进制格式详细区分 ASCII码查询表格 在使用串口发送数据时可以选择字符串(ASCII)发送或者十六进制(Hex)发送,通常情况 ...

  7. 嵌入式作业(七):基于Ardunio的STM32串口通信

    嵌入式作业(七) 0 作业要求 1 Ardunio 完成STM32的串口通信 (1)安装Ardunio IDE (2)stm32串口通信 2 基于串口通信的标准库与hal库的区别 (1)hal库 (2 ...

  8. java串口发送十六进制数,本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下1.介绍使用Java实现的串口通信程序,支持十六进制数据的发送与接收。 源码:...

    本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下 1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码:SerialPortDemo 效果图如下: ...

  9. C#解决串口通信中接收数据时延迟处理与缓存处理的方法

    转载连接: http://blog.csdn.net/yaoliang11/article/details/6885768 C#解决串口通信中接收数据时延迟处理与缓存处理的方法 时间:2011-1-2 ...

最新文章

  1. 时间序列(四)ARIMA模型与差分
  2. C++向量 vector动态数组
  3. SDN自定义网络讲解(内部学习专用)
  4. jqGrid如何设置jqGrid第一次初始化时不加载任何数据?实现方法!
  5. 腾飞答不忘初心的三个问题
  6. VS2010安装异常中断后无法安装的解决方法(安装时发生严重错误)
  7. oracle修改某个数据类型,Oracle 修改某个字段的数据类型三种方式
  8. python 并列条形图_python – 来自两个pandas数据框的分组条形图
  9. [Windows Server 2012] 安装PHP+MySQL方法
  10. 学习:MOSS2007 实现单点登陆(转)
  11. mysql慢查询优化方案
  12. windows c++ 原子操作_高分辨质谱数据处理操作篇
  13. matplotlib动态图和视频保存
  14. ASP.NET理论知识及面试题
  15. AWS AI网络研讨会 webinar - Case 分享
  16. js基础-22-基本数据类型不是对象
  17. Photoshop学习之旅--通道抠图
  18. Ubuntu用apt-get下载csh
  19. 可爱精灵宝贝 DP/爆搜
  20. LDA模型中文文本主题提取丨可视化工具pyLDAvis的使用

热门文章

  1. MQ 之 RocketMQ
  2. Kong Api 初体验、Kong安装教程
  3. HTTP 协议是无状态协议,怎么理解
  4. WinForms多线程编程之摇奖程序
  5. css样式变 及实际用法
  6. MessageBox 弹框
  7. Struts2的工作原理及工作流程
  8. oracle建库及plsql建表空间的用法
  9. 解决win7的outlook打不开的问题
  10. 国产毫米波雷达领域的领头羊,木牛科技将在明年量产77GHz汽车雷达