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

在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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版