任何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]);