| 用printf一样可以用串口中断的,只需自己改一下putchar即可: 以前发的:
 第一步,改造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……编程就跟上位机一样方便。
 
 记得printf和sprintf共用了解析模块,对于51,大概1K字节Flash,20多Byte的RAM。不管调用多少次,基本都要增加这些资源。
 |