单片机的printf重定向到OLED/UART/SEGGER_RTT

2019-04-15 12:38发布

以前在单片机上使用OLED或者做串口通信都是写第层驱动函数,然后使用底层函数显示/发送数据,但是这样的话使用起来始终感觉不是很方便。所以前两天开始琢磨有没有更方便的方式来显示数据,最好能够像printf一样输出格式化字符。到网上一查还真有,但是大多数说的都做串口的重定向,而且说的也不是很详细,但是经过两天的研究也大概了解了怎么去做printf的重定向。首先要了解什么是重定向,简单来说printf的重定向就是把原本要输入到控制台的内容输出到其他的地方去,这个其他的地方可以是串口,也可以是液晶屏,甚至是重定向到jlink上输出到电脑(使用RTT)。我的目最初的目的是想让液晶屏显示数据能用上printf所以就先研究了OLED上的printf重定向,在网上查资料发现printf的重定向实际上是有两种方式,一种是通过重新定义一个int fputc(int ch, FILE *f){ //里面是要重定向的设备显示/发送一个字节的代码 };
  • 1
  • 2
  • 3
具体我是这么去实现的://printf 函数重定向到OLED显示 int fputc(int ch, FILE *f) { static uint8_t x = 0, y = 0; if(ch == ' ') //换行 { x = 0; y += 1; return ch; } if(x + 6 > 128) //宽不能超过128 { x = 0; //x置零 y += 1; //y移至下一行 } if(y + 1 > 7) //行不超过7 { y=0; OLED_Fill(0x00); //直接清屏 重头开始 x = 0; } OLED_P6x8char(x, y, (uint8_t)ch); //打印字符ch x += 6; //跳转到下一个位置, 是否越界有上面函数判断 return ch; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
这样的一个函数。另一种方式就是自己去写一个printf函数,我是这么写的:signed int OLED_printf(uint8_t x,uint8_t y,const char *pFormat, ...){ char pStr[25] = {'