5750|10

13

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

TM4C里的UARTPrintf();无法使用 [复制链接]

系统提示 但是头文件里明明有这个函数的声明。

最新回复

之所以不能用,其实这个函数是由以下函数写的,把下面的函数所在的文件链接进去就可以用了 void UARTprintf(const char *pcString, ...) {     va_list vaArgP;     //     // Start the varargs processing.     //     va_start(vaArgP, pcString);     UARTvprintf(pcString, vaArgP);     //     // We're finished with the varargs now.     //     va_end(vaArgP); } void UARTvprintf(const char *pcString, va_list vaArgP) {     uint32_t ui32Idx, ui32Value, ui32Pos, ui32Count, ui32Base, ui32Neg;     char *pcStr, pcBuf[16], cFill;     //     // Check the arguments.     //     ASSERT(pcString != 0);     //     // Loop while there are more characters in the string.     //     while(*pcString)     {         //         // Find the first non-% character, or the end of the string.         //         for(ui32Idx = 0;             (pcString[ui32Idx] != '%') && (pcString[ui32Idx] != '\0');             ui32Idx++)         {         }         //         // Write this portion of the string.         //         UARTwrite(pcString, ui32Idx);         //         // Skip the portion of the string that was written.         //         pcString += ui32Idx;         //         // See if the next character is a %.         //         if(*pcString == '%')         {             //             // Skip the %.             //             pcString++;             //             // Set the digit count to zero, and the fill character to space             // (in other words, to the defaults).             //             ui32Count = 0;             cFill = ' ';             //             // It may be necessary to get back here to process more characters.             // Goto's aren't pretty, but effective.  I feel extremely dirty for             // using not one but two of the beasts.             // again:             //             // Determine how to handle the next character.             //             switch(*pcString++)             {                 //                 // Handle the digit characters.                 //                 case '0':                 case '1':                 case '2':                 case '3':                 case '4':                 case '5':                 case '6':                 case '7':                 case '8':                 case '9':                 {                     //                     // If this is a zero, and it is the first digit, then the                     // fill character is a zero instead of a space.                     //                     if((pcString[-1] == '0') && (ui32Count == 0))                     {                         cFill = '0';                     }                     //                     // Update the digit count.                     //                     ui32Count *= 10;                     ui32Count += pcString[-1] - '0';                     //                     // Get the next character.                     //                     goto again;                 }                 //                 // Handle the %c command.                 //                 case 'c':                 {                     //                     // Get the value from the varargs.                     //                     ui32Value = va_arg(vaArgP, uint32_t);                     //                     // Print out the character.                     //                     UARTwrite((char *)&ui32Value, 1);                     //                     // This command has been handled.                     //                     break;                 }                 //                 // Handle the %d and %i commands.                 //                 case 'd':                 case 'i':                 {                     //                     // Get the value from the varargs.                     //                     ui32Value = va_arg(vaArgP, uint32_t);                     //                     // Reset the buffer position.                     //                     ui32Pos = 0;                     //                     // If the value is negative, make it positive and indicate                     // that a minus sign is needed.                     //                     if((int32_t)ui32Value < 0)                     {                         //                         // Make the value positive.                         //                         ui32Value = -(int32_t)ui32Value;                         //                         // Indicate that the value is negative.                         //                         ui32Neg = 1;                     }                     else                     {                         //                         // Indicate that the value is positive so that a minus                         // sign isn't inserted.                         //                         ui32Neg = 0;                     }                     //                     // Set the base to 10.                     //                     ui32Base = 10;                     //                     // Convert the value to ASCII.                     //                     goto convert;                 }                 //                 // Handle the %s command.                 //                 case 's':                 {                     //                     // Get the string pointer from the varargs.                     //                     pcStr = va_arg(vaArgP, char *);                     //                     // Determine the length of the string.                     //                     for(ui32Idx = 0; pcStr[ui32Idx] != '\0'; ui32Idx++)                     {                     }                     //                     // Write the string.                     //                     UARTwrite(pcStr, ui32Idx);                     //                     // Write any required padding spaces                     //                     if(ui32Count > ui32Idx)                     {                         ui32Count -= ui32Idx;                         while(ui32Count--)                         {                             UARTwrite(" ", 1);                         }                     }                     //                     // This command has been handled.                     //                     break;                 }                 //                 // Handle the %u command.                 //                 case 'u':                 {                     //                     // Get the value from the varargs.                     //                     ui32Value = va_arg(vaArgP, uint32_t);                     //                     // Reset the buffer position.                     //                     ui32Pos = 0;                     //                     // Set the base to 10.                     //                     ui32Base = 10;                     //                     // Indicate that the value is positive so that a minus sign                     // isn't inserted.                     //                     ui32Neg = 0;                     //                     // Convert the value to ASCII.                     //                     goto convert;                 }                 //                 // Handle the %x and %X commands.  Note that they are treated                 // identically; in other words, %X will use lower case letters                 // for a-f instead of the upper case letters it should use.  We                 // also alias %p to %x.                 //                 case 'x':                 case 'X':                 case 'p':                 {                     //                     // Get the value from the varargs.                     //                     ui32Value = va_arg(vaArgP, uint32_t);                     //                     // Reset the buffer position.                     //                     ui32Pos = 0;                     //                     // Set the base to 16.                     //                     ui32Base = 16;                     //                     // Indicate that the value is positive so that a minus sign                     // isn't inserted.                     //                     ui32Neg = 0;                     //                     // Determine the number of digits in the string version of                     // the value.                     // convert:                     for(ui32Idx = 1;                         (((ui32Idx * ui32Base) 1) && (ui32Count < 16))                     {                         for(ui32Count--; ui32Count; ui32Count--)                         {                             pcBuf[ui32Pos++] = cFill;                         }                     }                     //                     // If the value is negative, then place the minus sign                     // before the number.                     //                     if(ui32Neg)                     {                         //                         // Place the minus sign in the output buffer.                         //                         pcBuf[ui32Pos++] = '-';                     }                     //                     // Convert the value into a string.                     //                     for(; ui32Idx; ui32Idx /= ui32Base)                     {                         pcBuf[ui32Pos++] =                             g_pcHex[(ui32Value / ui32Idx) % ui32Base];                     }                     //                     // Write the string.                     //                     UARTwrite(pcBuf, ui32Pos);                     //                     // This command has been handled.                     //                     break;                 }                 //                 // Handle the %% command.                 //                 case '%':                 {                     //                     // Simply write a single %.                     //                     UARTwrite(pcString - 1, 1);                     //                     // This command has been handled.                     //                     break;                 }                 //                 // Handle all other commands.                 //                 default:                 {                     //                     // Indicate an error.                     //                     UARTwrite("ERROR", 5);                     //                     // This command has been handled.                     //                     break;                 }             }         }     } } 都在uartstdio.c里面  详情 回复 发表于 2014-11-18 17:32
 
点赞 关注

回复
举报

30

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
楼主你好,我准备电赛一结束就学习TM4C123X,但是现在什么资料也没有,连编译软件是什么都不知道,网上说用CCS,有的说用KEIL MDK,我现在有块TI给的LaughPad,请问楼主当初是怎么下手的呀,求解答,求拯救,谢谢啦!

点评

都可以用的,只是要把头文件和库函数给加进去。两者是不同的,个人觉得最好用ccs。  详情 回复 发表于 2014-8-14 08:34
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
我也是相同的问题,不知道楼主的问题解决没??
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
需要
#include "stdio.h"
并添加函数
int fputc(int ch, FILE *f)
{
  UARTCharPut(UART0_BASE,ch);
  return (ch);
}

点评

大哥,一针见血,其实这个问题,我之前看人家的stm32的视频也发现了,人家用printf就是多了这么个函数,能否给我简单的将下这个函数的作用,以及执行过程,谢谢大哥  详情 回复 发表于 2014-11-10 11:22
 
个人签名奋斗
 
 

回复

20

帖子

1

TA的资源

一粒金砂(中级)

5
 
CCS没有keil好用,总是容易出各种问题。你可以新建一个工程试试
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

6
 
青稚 发表于 2014-8-10 20:17
楼主你好,我准备电赛一结束就学习TM4C123X,但是现在什么资料也没有,连编译软件是什么都不知道,网上说用 ...

都可以用的,只是要把头文件和库函数给加进去。两者是不同的,个人觉得最好用ccs。
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

7
 
注意UARTprintf()中的p是小写的
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

8
 
ZzmNO1 发表于 2014-8-13 17:24
需要
#include "stdio.h"
并添加函数

大哥,一针见血,其实这个问题,我之前看人家的stm32的视频也发现了,人家用printf就是多了这么个函数,能否给我简单的将下这个函数的作用,以及执行过程,谢谢大哥

点评

在单片机里边用 printf 有点 "杀鸡用牛刀" 的感觉。printf 是最常用的输出函数,但其实它的体积相对于 MCU 的 FLASH 容量来讲是不小的。 所以,在 TIVA Ware 里为什么就搞了一个 UARTprintf(); 这个函数能实现 pri  详情 回复 发表于 2014-11-10 14:59
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

9
 
sayato 发表于 2014-11-10 11:22
大哥,一针见血,其实这个问题,我之前看人家的stm32的视频也发现了,人家用printf就是多了这么个函数, ...

在单片机里边用 printf 有点 "杀鸡用牛刀" 的感觉。printf 是最常用的输出函数,但其实它的体积相对于 MCU 的 FLASH 容量来讲是不小的。
所以,在 TIVA Ware 里为什么就搞了一个 UARTprintf();
这个函数能实现 printf 里边最常用的格式化输出,所以大大减小了负担,用最小的代价完成了任务。
当然,直接用 printf 也可以,通常 IDE 可以对其进行配置,已进行功能的裁剪。

 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

10
 
谢谢大哥,明白了uarprintft和那个printf的区别,那么按照你说,我是不是可以改变printf里面的东西呢,不知道怎么说,我就是想实现一个用printf能把内容直接输出到单片机上的12864屏幕上,不知道怎么修改下面这个函数,如果大哥会的话,能指点下吗,(假设屏幕的驱动函数都有)
int fputc(int ch, FILE *f)
{
  UARTCharPut(UART0_BASE,ch);
  return (ch);
}

 
 
 

回复

5

帖子

3

TA的资源

一粒金砂(中级)

11
 
之所以不能用,其实这个函数是由以下函数写的,把下面的函数所在的文件链接进去就可以用了
void
UARTprintf(const char *pcString, ...)
{
    va_list vaArgP;

    //
    // Start the varargs processing.
    //
    va_start(vaArgP, pcString);

    UARTvprintf(pcString, vaArgP);

    //
    // We're finished with the varargs now.
    //
    va_end(vaArgP);
}
void
UARTvprintf(const char *pcString, va_list vaArgP)
{
    uint32_t ui32Idx, ui32Value, ui32Pos, ui32Count, ui32Base, ui32Neg;
    char *pcStr, pcBuf[16], cFill;

    //
    // Check the arguments.
    //
    ASSERT(pcString != 0);

    //
    // Loop while there are more characters in the string.
    //
    while(*pcString)
    {
        //
        // Find the first non-% character, or the end of the string.
        //
        for(ui32Idx = 0;
            (pcString[ui32Idx] != '%') && (pcString[ui32Idx] != '\0');
            ui32Idx++)
        {
        }

        //
        // Write this portion of the string.
        //
        UARTwrite(pcString, ui32Idx);

        //
        // Skip the portion of the string that was written.
        //
        pcString += ui32Idx;

        //
        // See if the next character is a %.
        //
        if(*pcString == '%')
        {
            //
            // Skip the %.
            //
            pcString++;

            //
            // Set the digit count to zero, and the fill character to space
            // (in other words, to the defaults).
            //
            ui32Count = 0;
            cFill = ' ';

            //
            // It may be necessary to get back here to process more characters.
            // Goto's aren't pretty, but effective.  I feel extremely dirty for
            // using not one but two of the beasts.
            //
again:

            //
            // Determine how to handle the next character.
            //
            switch(*pcString++)
            {
                //
                // Handle the digit characters.
                //
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                {
                    //
                    // If this is a zero, and it is the first digit, then the
                    // fill character is a zero instead of a space.
                    //
                    if((pcString[-1] == '0') && (ui32Count == 0))
                    {
                        cFill = '0';
                    }

                    //
                    // Update the digit count.
                    //
                    ui32Count *= 10;
                    ui32Count += pcString[-1] - '0';

                    //
                    // Get the next character.
                    //
                    goto again;
                }

                //
                // Handle the %c command.
                //
                case 'c':
                {
                    //
                    // Get the value from the varargs.
                    //
                    ui32Value = va_arg(vaArgP, uint32_t);

                    //
                    // Print out the character.
                    //
                    UARTwrite((char *)&ui32Value, 1);

                    //
                    // This command has been handled.
                    //
                    break;
                }

                //
                // Handle the %d and %i commands.
                //
                case 'd':
                case 'i':
                {
                    //
                    // Get the value from the varargs.
                    //
                    ui32Value = va_arg(vaArgP, uint32_t);

                    //
                    // Reset the buffer position.
                    //
                    ui32Pos = 0;

                    //
                    // If the value is negative, make it positive and indicate
                    // that a minus sign is needed.
                    //
                    if((int32_t)ui32Value < 0)
                    {
                        //
                        // Make the value positive.
                        //
                        ui32Value = -(int32_t)ui32Value;

                        //
                        // Indicate that the value is negative.
                        //
                        ui32Neg = 1;
                    }
                    else
                    {
                        //
                        // Indicate that the value is positive so that a minus
                        // sign isn't inserted.
                        //
                        ui32Neg = 0;
                    }

                    //
                    // Set the base to 10.
                    //
                    ui32Base = 10;

                    //
                    // Convert the value to ASCII.
                    //
                    goto convert;
                }

                //
                // Handle the %s command.
                //
                case 's':
                {
                    //
                    // Get the string pointer from the varargs.
                    //
                    pcStr = va_arg(vaArgP, char *);

                    //
                    // Determine the length of the string.
                    //
                    for(ui32Idx = 0; pcStr[ui32Idx] != '\0'; ui32Idx++)
                    {
                    }

                    //
                    // Write the string.
                    //
                    UARTwrite(pcStr, ui32Idx);

                    //
                    // Write any required padding spaces
                    //
                    if(ui32Count > ui32Idx)
                    {
                        ui32Count -= ui32Idx;
                        while(ui32Count--)
                        {
                            UARTwrite(" ", 1);
                        }
                    }

                    //
                    // This command has been handled.
                    //
                    break;
                }

                //
                // Handle the %u command.
                //
                case 'u':
                {
                    //
                    // Get the value from the varargs.
                    //
                    ui32Value = va_arg(vaArgP, uint32_t);

                    //
                    // Reset the buffer position.
                    //
                    ui32Pos = 0;

                    //
                    // Set the base to 10.
                    //
                    ui32Base = 10;

                    //
                    // Indicate that the value is positive so that a minus sign
                    // isn't inserted.
                    //
                    ui32Neg = 0;

                    //
                    // Convert the value to ASCII.
                    //
                    goto convert;
                }

                //
                // Handle the %x and %X commands.  Note that they are treated
                // identically; in other words, %X will use lower case letters
                // for a-f instead of the upper case letters it should use.  We
                // also alias %p to %x.
                //
                case 'x':
                case 'X':
                case 'p':
                {
                    //
                    // Get the value from the varargs.
                    //
                    ui32Value = va_arg(vaArgP, uint32_t);

                    //
                    // Reset the buffer position.
                    //
                    ui32Pos = 0;

                    //
                    // Set the base to 16.
                    //
                    ui32Base = 16;

                    //
                    // Indicate that the value is positive so that a minus sign
                    // isn't inserted.
                    //
                    ui32Neg = 0;

                    //
                    // Determine the number of digits in the string version of
                    // the value.
                    //
convert:
                    for(ui32Idx = 1;
                        (((ui32Idx * ui32Base) <= ui32Value) &&
                         (((ui32Idx * ui32Base) / ui32Base) == ui32Idx));
                        ui32Idx *= ui32Base, ui32Count--)
                    {
                    }

                    //
                    // If the value is negative, reduce the count of padding
                    // characters needed.
                    //
                    if(ui32Neg)
                    {
                        ui32Count--;
                    }

                    //
                    // If the value is negative and the value is padded with
                    // zeros, then place the minus sign before the padding.
                    //
                    if(ui32Neg && (cFill == '0'))
                    {
                        //
                        // Place the minus sign in the output buffer.
                        //
                        pcBuf[ui32Pos++] = '-';

                        //
                        // The minus sign has been placed, so turn off the
                        // negative flag.
                        //
                        ui32Neg = 0;
                    }

                    //
                    // Provide additional padding at the beginning of the
                    // string conversion if needed.
                    //
                    if((ui32Count > 1) && (ui32Count < 16))
                    {
                        for(ui32Count--; ui32Count; ui32Count--)
                        {
                            pcBuf[ui32Pos++] = cFill;
                        }
                    }

                    //
                    // If the value is negative, then place the minus sign
                    // before the number.
                    //
                    if(ui32Neg)
                    {
                        //
                        // Place the minus sign in the output buffer.
                        //
                        pcBuf[ui32Pos++] = '-';
                    }

                    //
                    // Convert the value into a string.
                    //
                    for(; ui32Idx; ui32Idx /= ui32Base)
                    {
                        pcBuf[ui32Pos++] =
                            g_pcHex[(ui32Value / ui32Idx) % ui32Base];
                    }

                    //
                    // Write the string.
                    //
                    UARTwrite(pcBuf, ui32Pos);

                    //
                    // This command has been handled.
                    //
                    break;
                }

                //
                // Handle the %% command.
                //
                case '%':
                {
                    //
                    // Simply write a single %.
                    //
                    UARTwrite(pcString - 1, 1);

                    //
                    // This command has been handled.
                    //
                    break;
                }

                //
                // Handle all other commands.
                //
                default:
                {
                    //
                    // Indicate an error.
                    //
                    UARTwrite("ERROR", 5);

                    //
                    // This command has been handled.
                    //
                    break;
                }
            }
        }
    }
}

都在uartstdio.c里面
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表