第一步,改造putchar函数,把TI简单替换成Uart0_Send_Ready: unsigned char Uart0_Send_Ready;//这个是中断方式使用printf的关键 /* * putchar (basic version): expands '\n' into CR LF */ char putchar (char c) { LED_TXD = light;//点亮发送指示灯 if (c == '\n') { while (!Uart0_Send_Ready) ; Uart0_Send_Ready = 0; SBUF0 = 0x0d; /* output CR */ } while (!Uart0_Send_Ready) ; Uart0_Send_Ready = 0; return (SBUF0 = c); } 第二步,在串口中断里,把TI的值传递给Uart0_Send_Ready: void Uart0_Int(void) interrupt 4 { char ch; if(TI) { Uart0_Send_Ready=1;//把TI的值传递给Uart0_Send_Ready TI=0;//清TI } if(RI) { RI=0; ch = SBUF0; LED_RXD = light;//点亮接收LED //干该干的事...... } } 这样,printf就工作在中断方式下了,跟串行接收中断没有冲突。 实际项目中我还用了单工的RS485总线(那样还要继续改造putchar,主要是485的换向)...... 适当改造一下putchar,还可以把printf的输出重定向到某个I/O口,LCD......编程就跟上位机一样方便。 出处:mohanwei |
RE:在串口中断方式下使用printf。