|||
最近看学生编的单片机C程序,发现多个地方出现类似的下面两行:
len=sprintf(sdata,"@:%c %02u-%02u-%02u %02u:%02u:%02urn", DataBuf[0],
(unsigned int)DataBuf[4]+2000,(unsigned int)DataBuf[5],(unsigned int)DataBuf[6],
(unsigned int)DataBuf[7],(unsigned int)DataBuf[8],(unsigned int)DataBuf[9]);
for(i=0;i<len;i++) UART0_OP(sdata[i]);
第一行生成一个字符串,第二行将字符串通过单片机串口1输出。UART0_OP函数如下:
void UART0_OP (unsigned char opdata){
unsigned char outputdata;
outputdata=opdata;
ES0=0;
EA=0;
SBUF0=outputdata;
while(TI0==0);
TI0=0;
ES0=1;
EA=1;}
其实,可以把UART0_OP修改成putchar()函数,之后可以用printf等函数直接输出。在单片机编译器的LIB目录下,原有的putchar()函数内容如下:
/*
* putchar (full version): expands 'n' into CR LF and handles
* XON/XOFF (Ctrl+S/Ctrl+Q) protocol
*/
char putchar (char c) {
if (c == 'n') {
if (RI) {
if (SBUF == XOFF) {
do {
RI = 0;
while (!RI);
}
while (SBUF != XON);
RI = 0;
}
}
while (!TI);
TI = 0;
SBUF = 0x0d; /* output CR */
}
if (RI) {
if (SBUF == XOFF) {
do {
RI = 0;
while (!RI);
}
while (SBUF != XON);
RI = 0;
}
}
while (!TI);
TI = 0;
return (SBUF = c);
}
#if 0 // comment out versions below
/*
* putchar (basic version): expands 'n' into CR LF
*/
char putchar (char c) {
if (c == 'n') {
while (!TI);
TI = 0;
SBUF = 0x0d; /* output CR */
}
while (!TI);
TI = 0;
return (SBUF = c);
}
/*
* putchar (mini version): outputs charcter only
*/
char putchar (char c) {
while (!TI);
TI = 0;
return (SBUF = c);
}
#endif
这个函数有3个版本,最后一个函数是最简单的,我进行了如下修改:
/*
* putchar (mini version): outputs charcter only
*/
char putchar (char c) {
ES0=0;
EA=0;
SBUF0=c;
while(TI0==0);
TI0=0;
ES0=1;
EA=1;
return c;
}
然后把其它两个函数设置成不编译模式。将这个函数加入工程文件后,
前面一段程序可以作如下修改:
printf("@:%c %02u-%02u-%02u %02u:%02u:%02urn", DataBuf[0],
(unsigned int)DataBuf[4]+2000,(unsigned int)DataBuf[5],(unsigned int)DataBuf[6],
(unsigned int)DataBuf[7],(unsigned int)DataBuf[8],(unsigned int)DataBuf[9]);
也就是说,修改和加入putchar()函数后,我们可以用printf, puts等函数实现输出。
事实上,只要修改LIB下的getkey, 和putchar函数,让这两个函数实现单个字符的输入和输出,我们就可以用丰富的标准I/O函数实现字符串的输入和输出,而不用去编写专门的字符串输入和输出函数。
对学生编写的程序进行全面修改后,编译后的代码少了10%以上,对字符的输出也更加方便和灵活了,也去掉了专门的数组sdata.
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 12:53
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社