• 普通串口打印函数模板


    /***************************************************
     *作     者:温子祺
     *联系方式:wenziqi@hotmail.com
     *说   明 :普通串口函数模板

     *开发环境:RealView MDK 

     *处理器  :LPC2103

     ***************************************************/

     

        在串口打印过程中,都是以字符串输出为主,但是在某些时候,我们需要打印变量的值,并以10进制或16进制输出。为了使用上更加方便,本人制作出口打印函数模板,大家使用该模板,只需要对UARTInit与UARTSendByte进行修改就可以了。

       

    串口打印模板:

    代码
    /******************************************************
    *文件名称:UARTInit
    *输 入:unFpclk 外设时钟频率
    unBaud 波特率
    *输 出:无
    *功能说明:串口初始化
    ******************************************************
    */
    void UARTInit(UINT32 unFpclk,UINT32 unBaud)
    {
    UINT16 usFdiv;

    PINSEL0
    &=~0x0F;
    PINSEL0
    |= 0x05;

    U0LCR
    = 0x83;

    usFdiv
    = (unFpclk / 16) / unBaud;

    U0DLM
    = usFdiv / 256;
    U0DLL
    = usFdiv % 256;

    U0LCR
    = 0x03;
    }
    /******************************************************
    *文件名称:UARTSendByte
    *输 入:ucByte 字节
    *输 出:无
    *功能说明:串口 发送单个字节
    ******************************************************
    */
    void UARTSendByte(UINT8 ucByte)
    {
    U0THR
    = ucByte;
    while ((U0LSR & 0x40) == 0);
    }
    /******************************************************
    *文件名称:UARTPrintf
    *输 入:pcStr 字符串
    *输 出:无
    *功能说明:串口 打印字符串
    ******************************************************
    */
    void UARTPrintfString(CHAR *pcStr)
    {
    while(pcStr && *pcStr)
    {
    UARTSendByte(
    *pcStr++);
    }
    }
    /*************************************************************
    * 函数名称:UARTPrintfVal
    * 输 入:pstr 字符串
    val 变量值
    DecOrHex 10/16进制
    * 输 出:无
    * 说 明:从串口打印字符串,支持10/16进制数据打印
    *************************************************************
    */
    void UARTPrintfVal(CHAR *pstr,
    UINT32 val,
    UINT32 DecOrHex)
    {
    INT32 i
    =0;
    INT8 buf[
    10]={0};

    UARTPrintfString((
    char *)pstr);

    if(10 == DecOrHex)
    {
    for(i=0; i<10 ;i++)
    {
    buf[i]
    =(UINT8)('0'+val%10);
    val
    /=10;
    }

    for(i=9;i>=0;)
    {
    if('0' == buf[i])
    {
    if(i)i--;
    else break;
    }
    else
    {
    break;
    }
    }

    while(1)
    {

    UARTSendByte(buf[i]);

    if(!i)
    {
    break;
    }

    i
    --;
    }

    }
    else if(16 == DecOrHex)
    {
    UARTSendByte(
    '0');
    UARTSendByte(
    'x');

    i
    =28;

    while(i)
    {
    if(0 == ((val>>i) &0x0f))
    {
    i
    =i-4;

    }
    else
    {
    break;
    }
    }

    while(1)
    {
    UARTSendByte(g_cHexTbl[(val
    >>i) &0x0f]);

    if(!i)
    {
    break;
    }

    i
    =i-4;
    }

    }

    UARTPrintfString(
    " ");
    }

          在使用UARTPrintfString和UARTPrintfVal这两个函数时,本人都喜欢这样用宏进行字符替换,由于宏的加入,代码显得更加灵活,即当前工程为调试模式时,打印信息正常输出,反之打印信息屏蔽。

     

    代码
    #define EN_DEBUG (0)

    #if EN_DEBUG

    #define DEBUGMSG UARTPrintfString
    #define DEBUGMSGEx UARTPrintfVal

    #else
    #define DEBUGMSG(x) (void)0
    #define DEBUGMSGEx(x,y,z) (void)0

    #endif

      

          从上面的代码可以知道,只要通过设置宏EN_DEBUG就能够很轻易控制打印信息的输出。当EN_DEBUG=1,打印信息正常输出;当EN_DEBUG=0,打印信息得到屏蔽。有一点要注意的是EN_DEBUG=0时,DEBUGMSG和DEBUGMSGEx的设置,它们必须以(void)0进行替换,当编译代码时,编译器会自动忽略(void)0的。一旦DEBUGMSG和DEBUGMSGEx不用(void)0进行字符替换,直接编写为

    #define DEBUGMSG
    #define DEBUGMSGEx

    编译器就会出现烦人的waring。

     

      使用方法:  

    (1)打印普通字符串

     

          DEBUGMSG("Hello Wenziqi");

          串口输出字符串:Hello Wenziqi

     

    (2)打印10进制

     

           i=12;

           DEBUGMSGEx("i=",i,10);

     

           串口输出字符串:i=12

     

    (3)打印16进制

     

          i=31;

          DEBUGMSGEx("i=",i,16);

     

           串口输出字符串:i=0x1F

     转载请注明出处,谢谢!

  • 相关阅读:
    例行性工作排程 (crontab)
    数组
    继续我们的学习。这次鸟哥讲的是LVM。。。磁盘管理 最后链接文章没有看
    htop资源管理器
    转:SSL协议详解
    转:SSL 握手协议详解
    转:Connection reset原因分析和解决方案
    使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
    转:logback的使用和logback.xml详解
    转:Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2
  • 原文地址:https://www.cnblogs.com/wenziqi/p/1777199.html
Copyright © 2020-2023  润新知