添加串口打印信息 && 串口工具使用中出现的问题 && printk改造

      任何CODE都能添加串口打印信息,来方便调试,不一定要有printf语句,简单的方式可以这样实现。首先需要完成的是串口寄存器初始化,包括输入输出使能、数据位和停止位、波特率、中断优先级等。

typedef unsigned char uchar;

(1)输出单个ASCII字符。因为字符也是用ASCII码表示

void WriteByte(uchar input) //输出单个uchar
{
       TDATA_URTDAT2=input;     //丢值发送寄存器
       while(TXEND_URSTS2!=1); //发送结束标志位的查询
}

(2)输出字符数组

void UU_send(uchar *p,uchar num) //p数组首址,num长度
{
       uchar i;   
       for(i=0;i<num;i++)
      {
             WriteByte (p[i]); 

      } 
}

(3)输出字符串

void RS232_WriteStr(uchar *tpStr) //tpStr字符串首址
{
       uchar i;
       for(i = 0; i < 60; i++)
       {
             if(tpStr[i] == '/0') //结束符
             {
                   break;  //计算字符串长度
             }

        }
        UU_send(tpStr, i);
}

(4)输出8位BCD数据。(BCD:0->0000,...9->1001)

void RS232_WriteHex81(uchar tbInNum)  //把BCD码的参数转化成ASCII字符输出。

{
        uchar i,gpbTmpBuf[8];
        for(i = 0; i < 2; i++)
        {
             gpbTmpBuf[i] = (tbInNum & 0xf0);

             gpbTmpBuf[i]>>=4;
             if(gpbTmpBuf[i]>9)
             {
                   gpbTmpBuf[i]-=10;
                   gpbTmpBuf[i]+='A';
              } 
              else
                   gpbTmpBuf[i]+='0';
              tbInNum <<= 4;
        }
        UU_send(gpbTmpBuf,2);
}

(5)输出打印语句和单个变量。比如:send_asc("j2=",j);
void send_asc(uchar *str,uchar num)

{
      RS232_WriteStr(str);
      RS232_WriteHex81(num);
      RS232_WriteStr("/n"); //换行
}

(6)输出打印语句和多个变量。比如:js[2]={2,3};send_buf("j1+j2",js,2);

void send_buf(uchar *str,uchar *buf,uchar num)//输出一连串数组数据
{
       uchar i;
       RS232_WriteStr(str);
       for(i=0;i<num;i++)
            RS232_WriteHex81(buf[i]);
       RS232_WriteStr("/n");
}

(7)输出16位BCD数据。比如send_dsa("value is",0xf332);

void send_dsa(uchar *str,Uint16 num)//输出16位数据
{
       RS232_WriteStr(str);
       RS232_WriteHex81((uchar) (num>>8));
       RS232_WriteHex81( (uchar) num);
       RS232_WriteStr("/n");
}

(8)输出32位BCD数据。比如:send_long("value is",0xe4336f9)

void send_long(uchar *str,U32 num)//输出32位数据
{
       RS232_WriteStr(str);
       RS232_WriteHex81((uchar) (num>>24));
       RS232_WriteHex81( (uchar) (num>>16));
       RS232_WriteHex81((uchar) (num>>8));
       RS232_WriteHex81( (uchar) num);
       RS232_WriteStr("/n");
}

=======================================================================================================================

        在使用串口工具时碰到的若干问题

(1)在使用secureCRT这个工具中,出现了串口只能输出不能输入的状况。比如只能打印trace不能输入命令,一个可能的原因是要关掉RTS/CTS流控。

(2)如果串口工具的输入有效,按键时应该会有低电平出现。另说明一点:RXD,TXD,GND三者是必接的,前两者是默认高电平的。如果工具硬件上没有完全接入,就算按键,在线上也不会有低电平。

=======================================================================================================================

       printk是linux默认的打印trace的语句,可以通过一定的改造方式让其输出更精确的调试信息,包括行号、函数名等,而这些信息是内核中有定义宏的。简单的举例说明如下:

普通的语句是printk("zhangcheng: %d %d %d \n\r\t",acc[MMA8452Q_AXIS_X], acc[MMA8452Q_AXIS_Y], acc[MMA8452Q_AXIS_Z]);

改造后的语句是printk("%s <%d> %s(), zhangcheng: %d %d %d \n\r\t",__FILE__,__LINE__,__func__, acc[MMA8452Q_AXIS_X], acc[MMA8452Q_AXIS_Y], acc[MMA8452Q_AXIS_Z]);

阅读更多
文章标签: 工具 input linux file
个人分类: 数据通讯和网络
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭