刚开始在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); |
增加了fflush(stdout);这个就可以立即输出了,所以我们在MDK Keil默认配置下编译的pritf的输出缓冲区是被禁用掉的吗?
重映射的代码也是参考如下,跟这个有关系吗?
#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;
}
KEIL MDK的映射内容和SW4STM32映射实现内容是一样的。能说明一下是哪里不一样吗?