你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在macos下SW4STM32编译,调用printf 异常

[复制链接]
ThomasZhong 提问时间:2019-10-14 21:02 /
刚开始在MACOS下开发STM32的程序,现在出现了一些很奇怪的问题,看是否大家有遇到这样的问题。
开发配置如下
1.STM32cube427,STM32Cube FW_F4 V1.21.0
       2.Version: Neon.3 Release (4.6.3)  Build id: 20170314-1500
在while(1)中的源代码
void TASK(void){
      double b = 2.2f;
      HAL_UART_Transmit(&huart1,(uint8_t *)”matlab_uart\r\n”,13,0xffff);
      printf(“MATLAB_UART\r\n”);
      printf(“%d,”,123);
      printf(“1+1=%.2f\r\n”,b);
     while(1){
        LED_Flash();
        HAL_Delay(200);
        printf(“%.2f,”,1.1);
      }
}
程序一运行就能够在串口收到以下的信息:
matlab_uart
      MATLAB_UART
     123,1+1=2.20

但出当运行到while(1)里面的语句时候会出现,LED指示能够在200ms的时候闪烁一次,而printf函数没有正确输出数据。
在while(1)函数运行几分钟以后,串口能够一次收到一大串的的字符串
1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10,1.10
程序没有死机,就是都要等等几分钟才能够接收到一次串口发过来的一大串字符。

有谁能够解决一下这样的问题吗?


解决办法:1.在程序中禁止printf的缓冲机制:setbuf(stdout, NULL);
2.在printf语句后面加上更新缓冲区语句:fflush(stdout);



收藏 评论6 发布时间:2019-10-14 21:02

举报

6个回答
maxtch 回答时间:2019-10-15 10:03:39
printf 内部有缓冲机制的,一般来说是碰到一个换行符清理一次内部缓冲区。你这样属于长期不输出换行符,如果需要及时输出,要么需要手工清缓冲区,要么需要禁掉输出缓冲区。
ThomasZhong 回答时间:2019-10-15 16:28:13
maxtch 发表于 2019-10-15 10:03
printf 内部有缓冲机制的,一般来说是碰到一个换行符清理一次内部缓冲区。你这样属于长期不输出换行符,如 ...

增加了fflush(stdout);这个就可以立即输出了,所以我们在MDK Keil默认配置下编译的pritf的输出缓冲区是被禁用掉的吗?
废鱼 回答时间:2019-10-15 21:17:12
printf重映射怎么写的?
freeelectron 回答时间:2019-10-16 09:32:32
不同的平台,printf的重映射不一样的
ThomasZhong 回答时间:2019-10-17 13:19:00
安 发表于 2019-10-15 21:17
printf重映射怎么写的?

重映射的代码也是参考如下,跟这个有关系吗?

#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif /* __GNUC__ */

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART3 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100);

  return ch;
}

GETCHAR_PROTOTYPE
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1,&ch, 1, 100);
  return ch;
}
ThomasZhong 回答时间:2019-10-17 13:20:48
freeelectron 发表于 2019-10-16 09:32
不同的平台,printf的重映射不一样的

KEIL MDK的映射内容和SW4STM32映射实现内容是一样的。能说明一下是哪里不一样吗?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版