搜索
bottom↓
回复: 6
打印 上一主题 下一主题

CYPRESS BLE学习心得(四):如何在CYPRESS BLE中使用printf函数重...

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2016-7-1 12:19:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、前言
    最近在使用PSOC BLE,为了调试方便把信息通过串口打印出来。所以想要用printf函数重定向至串口,由于PSOC Creator默认用的是GCC编译器,所以我们只需要重写_write()函数即可,因为GCC编译环境下printf函数最终调用的是_write()函数。但是为了兼容其他编译器,常规的写法如下所示:
#if 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:
            UART_DEB_UartPutChar(ch);
            ret = ch ;
            break ;
        case STDERR_HANDLE:
            ret = ch ;
            break ;
        default:
            file = file;
            break ;
    }
    return ret ;
}
#elif defined (__ICCARM__)      /* IAR */
/* 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;
    if (buffer == 0)
    {
        /*
         * This means that we should flush internal buffers.  Since we
         * don't we just return.  (Remember, "handle" == -1 means that all
         * handles should be flushed.)
         */
        return (0);
    }
    for (/* Empty */; size != 0; --size)
    {
        UART_DEB_UartPutChar(*buffer++);
        ++nChars;
    }
    return (nChars);
}
#else  /* (__GNUC__)  GCC */
/* For GCC compiler revise _write() function for printf functionality */
int _write(int file, char *ptr, int len)
{
    int i;
    file = file;
    for (i = 0; i < len; i++)
    {
        UART_DEB_UartPutChar(*ptr++);//这里替代成UART的发送单字节的函数即可
    }
    return len;
}
#endif  /* (__ARMCC_VERSION) */

重写了_write()函数,最后编译即可使用printf()函数通过串口打印出串口信息了。切记,必须还要把Heap Size(Bytes)设大点的值,不然printf函数没法打印串口消息,但是必须要小于芯片的RAM大小。修改Heap Size(Bytes)如下图所示:

至此,现在就可以用Printf函数打印串口消息。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

2
发表于 2016-7-20 13:30:26 | 只看该作者
请问是使用SCB模块的么。能否共享一下工程实例?非常感谢!

出0入0汤圆

3
 楼主| 发表于 2016-7-20 21:47:13 | 只看该作者
frank117 发表于 2016-7-20 13:30
请问是使用SCB模块的么。能否共享一下工程实例?非常感谢!

加我Q:530584571。我传给你工程,太大了,附件传不上

出0入0汤圆

4
发表于 2016-7-20 22:02:25 来自手机 | 只看该作者
什么型号

出0入54汤圆

5
发表于 2016-7-20 22:07:28 | 只看该作者
Cypress 的蓝牙芯片通用,不限型号

出0入0汤圆

6
 楼主| 发表于 2016-7-21 09:27:48 | 只看该作者
本帖最后由 xiaolong_ba 于 2016-7-21 12:28 编辑


这个不用管啥型号,只要是PSOC4,不管是BLE还是不是BLE,只要用是SCB组件都能这么用


不对,应该是目前决大多数MCU都能这样用

出0入0汤圆

7
 楼主| 发表于 2016-7-21 09:29:16 | 只看该作者
mutoudonggua 发表于 2016-7-20 22:07
Cypress 的蓝牙芯片通用,不限型号

这个不用管啥型号,只要是PSOC4,不管是BLE还是不是BLE,只要用是SCB组件都能这么用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 23:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表