以前在单片机上使用OLED或者做串口通信都是写第层驱动函数,然后使用底层函数显示/发送数据,但是这样的话使用起来始终感觉不是很方便。所以前两天开始琢磨有没有更方便的方式来显示数据,最好能够像printf一样输出格式化字符。到网上一查还真有,但是大多数说的都做串口的重定向,而且说的也不是很详细,但是经过两天的研究也大概了解了怎么去做printf的重定向。首先要了解什么是重定向,简单来说printf的重定向就是把原本要输入到控制台的内容输出到其他的地方去,这个其他的地方可以是串口,也可以是液晶屏,甚至是重定向到jlink上输出到电脑(使用RTT)。我的目最初的目的是想让液晶屏显示数据能用上printf所以就先研究了OLED上的printf重定向,在网上查资料发现printf的重定向实际上是有两种方式,一种是通过重新定义一个
int fputc(int ch, FILE *f){
};
具体我是这么去实现的:
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)
{
x = 0;
y += 1;
}
if(y + 1 > 7)
{
y=0;
OLED_Fill(0x00);
x = 0;
}
OLED_P6x8char(x, y, (uint8_t)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] = {'