MCU中printf重定向实现
// 添加头文件 #include "stdio.h" #include "stdarg.h" //全局变量 bit TI_busy; unsigned char idata putBuf[100]; //最大数量 /* idata注释: 定义一个字节型的变量,这个变量保存在RAM的idata区.单片机的存储主要分为四个区域:data、idata、code、xdata。
data区:单片机能直接访问的 直接寻址RAM区,00H-7FH
idata区:单片机间接防问的RAM区,80H-FFH
code区:单片机的内部程序存储区,也就是单片机内置的FALSH
xdata区:单片机外部寻址区,一般指片外的存储器,0000H-FFFFH */ // 串口打印函数实现 void debug_printf(char* fmt,...) { unsigned char i,len; va_list ap; //定义变量为字符指针 va_start(ap, fmt); //获取可变参数列表的第一个参数的地址 len = vsprintf((char*)putBuf, fmt, ap); //将可变列表拷贝至缓冲区 va_end(ap); //清空va_list可变参数列表 for(i = 0; i < len; i++) //把缓存内的字符发送出去 { while( TI_busy ); //等待前面的数据发送完成 TI_busy = 1; SBUF = putBuf[i]; //发送一个字节 } memSet(putBuf, 0, sizeof(putBuf)); //清空缓存(自己实现) } //main入口函数 void main() { unsigned int i; UartInit(); //串口初始化 EA=1; //开总中断 while(1) { debug_printf(" Hello World ! "); debug_printf(" i = %03d, 0x%03X\r\n", i, i++); delayMs(1000); } } //中断处理函数 void Uart1() interrupt 4 { if(RI) //接收 RI = 0; //清标志 else //发送 { TI = 0; //清标志 TI_busy = 0; //非忙 } }
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄
data区:单片机能直接访问的 直接寻址RAM区,00H-7FH
idata区:单片机间接防问的RAM区,80H-FFH
code区:单片机的内部程序存储区,也就是单片机内置的FALSH
xdata区:单片机外部寻址区,一般指片外的存储器,0000H-FFFFH */ // 串口打印函数实现 void debug_printf(char* fmt,...) { unsigned char i,len; va_list ap; //定义变量为字符指针 va_start(ap, fmt); //获取可变参数列表的第一个参数的地址 len = vsprintf((char*)putBuf, fmt, ap); //将可变列表拷贝至缓冲区 va_end(ap); //清空va_list可变参数列表 for(i = 0; i < len; i++) //把缓存内的字符发送出去 { while( TI_busy ); //等待前面的数据发送完成 TI_busy = 1; SBUF = putBuf[i]; //发送一个字节 } memSet(putBuf, 0, sizeof(putBuf)); //清空缓存(自己实现) } //main入口函数 void main() { unsigned int i; UartInit(); //串口初始化 EA=1; //开总中断 while(1) { debug_printf(" Hello World ! "); debug_printf(" i = %03d, 0x%03X\r\n", i, i++); delayMs(1000); } } //中断处理函数 void Uart1() interrupt 4 { if(RI) //接收 RI = 0; //清标志 else //发送 { TI = 0; //清标志 TI_busy = 0; //非忙 } }

更多精彩