进口小开关 发表于 2013-3-22 23:19:25

我重定向了printf,加入'\r',为何有些首字符不显示呢?

用的是51单片机,因为打开了串口的中断,printf无法显示了,于是我重定向了printf中的putchar,
可是,char putchar(char c)
{
    g_TI_flag = 0;
    if(c=='\n')
    {
      //SBUF = '\r';          // send LF before CR
      //while(0==g_TI_flag);   
    }
    SBUF = c;
    while(0==g_TI_flag);
   return c;
}

如果注释掉上面的两行(在换行'\n',前面加上回车'\r'),就能够正常显示,如下printf("net_weight\r\n");
printf("net_weight\r\n");如果不注释掉上面的两行,则有些printf种的第一个字符就消失了。printf("x----------------------x\n", in_buff);

进口小开关 发表于 2013-3-22 23:21:15

下面是中断函数void uart_interrupt(void) interrupt 4
{   
    if(RI)
    {
      RI = 0;
      in_buff = SBUF;
      if('\r'==in_buff)
      {
             in_buff = 0;
             g_cmd_arrive = 1;
      }
      g_in_buf_pointer++;
      if(25==g_in_buf_pointer)
      {
            g_in_buf_pointer = 0;
            memset(in_buff, 0, sizeof(in_buff));
      }
      LED1 = 0;
    }
    if(TI)
    {
      TI = 0;
      g_TI_flag = 1;
      LED2 = 0;
    }
}

进口小开关 发表于 2013-5-15 23:40:00

顶一下吧

zjk 发表于 2013-5-16 09:05:34

额,看不太懂,帮顶一下

sevenchrist 发表于 2013-5-16 09:22:16

char putchar(char c)
{
    if(c=='\n')
    {
      g_TI_flag = 0;
      SBUF = '\r';          // send LF before CR
      while(0==g_TI_flag);   
    }
    g_TI_flag = 0;
    SBUF = c;
    while(0==g_TI_flag);
   return c;
}

不用解释了吧。。。。。。

xiefy21 发表于 2013-8-15 12:50:32

mark…
顶一个…

nicksean 发表于 2013-8-15 13:04:41

我觉得这个是串口软件的问题,你换一个试试。我隐约记得windows下要 "\r\n", unix下只要"\n"就可以换行了。谁来证实一下,免得误导了其他人。

nicksean 发表于 2013-8-15 13:21:42

百度了一下,证实了我的观点。
在代码中写的 "\n" 在windows下有时会被自动转换为 "\r\n",而有时就不会。我记得Edit 控件就需要显式地输出 "\r\n",而写文本文件时就会自动转换。
页: [1]
查看完整版本: 我重定向了printf,加入'\r',为何有些首字符不显示呢?