打印

printf函数不能打印出float型变量

[复制链接]
2834|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lclxjy|  楼主 | 2017-5-23 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看官网给出的例子
配置如下:
asm (".global _printf_float");
{
    int i;
    for (i = 0; i < len; i++)
{
    UART_UartPutChar(*ptr++);
}
    return(len);
}
并且heap size改为0x200后,
printf函数打印float型变量,在串口助手上不能显示,而string或者int型能正常显示。请问有解决办法吗?
沙发
gll123| | 2017-5-25 11:41 | 只看该作者

你可以尝试直接复制下面的代码,进行运行。
你需要把浮点型的数做一个格式转换,这样就可以通过sprintf进行输出了。
/* ========================================
*
* Copyright YOUR COMPANY, THE YEAR
* All Rights Reserved
* UNPUBLISHED, LICENSED SOFTWARE.
*
* CONFIDENTIAL AND PROPRIETARY INFORMATION
* WHICH IS THE PROPERTY OF your company.
*
* ========================================
*/
#include <project.h>
#include <stdio.h>

#if defined (__GNUC__)
        /* Add an explicit reference to the floating point printf library to allow
        the usage of floating point conversion specifier. */
        asm (".global _printf_float");
        /* For GCC compiler revise _write() function for printf functionality */
        int _write(int file, char *ptr, int len)
        {
                int i;
                for (i = 0; i < len; i++)
                {
                UART_UartPutChar(*ptr++);
                }
                return(len);
        }
#elif defined(__ARMCC_VERSION)
        /* For MDK/RVDS compiler revise fputc() function for printf functionality */
        struct __FILE
        {
                int handle;
        };
        enum
        {
                STDIN_HANDLE,
                STDOUT_HANDLE,
                STDERR_HANDLE
        };
        FILE __stdin = {STDIN_HANDLE};
        FILE __stdout = {STDOUT_HANDLE};
        FILE __stderr = {STDERR_HANDLE};
        int fputc(int ch, FILE *file)
        {
                int ret = EOF;
                switch(file->handle)
                {
                        case STDOUT_HANDLE:
                        SCB_UartPutChar(ch);
                        ret = ch;
                        break;
                        Document Number: 001-92486 Rev. *A Page 143 of 171
                        case STDERR_HANDLE:
                        ret = ch;
                        break;
                        default:
                        file = file;
                        break;
                }
                return(ret);
        }
#elif defined (__ICCARM__)
        /* For IAR compiler revise __write() function for printf functionality */
        size_t __write(int handle, const unsigned char * buffer, size_t size)
        {
                size_t nChars = 0;
                for (/* Empty */; size != 0; --size)
                {
                        SCB_UartPutChar(*buffer++);
                        ++nChars;
                }
                return (nChars);
        }
#endif /* (__GNUC__) */

CY_ISR(UART_SCB_IRQ_Interrupt)
{
    if(UART_GetRxInterruptSourceMasked() & UART_INTR_RX_NOT_EMPTY)
    {
        UART_UartPutString("Wel \r\n");
    }
   
    UART_SpiUartClearRxBuffer();
    UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY);

}


int main()
{
        uint32 i = 444444444;
        float f = 55.555f;
    char *s;
    //UART_SetCustomInterruptHandler(&MyIntHandler);
   
    isr_StartEx(UART_SCB_IRQ_Interrupt);
        UART_Start(); /* Start communication component */
        CyGlobalIntEnable; /* Enable interrupts */
   
        /* Use printf() function which will send formatted data through
        * UART (SCB mode) */
   
        UART_UartPutString("Welcome\r\n");
    sprintf(s, "%10.3f", 3.1415626);
       
    printf("Test printf function. long: %ld, float: %s \n",i,s);
        for(;;)
        {

        }
}


使用特权

评论回复
板凳
leijixiaomile| | 2017-5-26 17:39 | 只看该作者
楼上大神指导的对,也可以参考下该链接:http://www.cypress.com/knowledge ... m-compiler-kba89724

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝