处理没有LF CR的传入串行流

时间:2017-09-26 14:17:00

标签: c stream raspberry-pi serial-port wiringpi

下面的代码一次处理输入的RS232串行数据1个字符并且工作正常。

但是,我的用例中的传入序列提要不包含任何CR或LF字符,这使得对管道程序的进一步分隔/处理变得困难。 结束分隔符总是一个!感叹号而不是CR或LF。例如123456!ABCDEF!QWERTY!

有没有办法修改下面的代码来代替! CR的字符(回车)?例如,传入的字符串是123456abcdef!那么程序应该取代!使用CR,输出123456abcdef<回车>

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringSerial.h>

int main ()

  for (;;)
  {
    putchar (serialGetchar (fd)) ;
    fflush (stdout) ;
  }
}

3 个答案:

答案 0 :(得分:2)

您可以在相同的单个字符基础上执行以下操作:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringSerial.h>

int main ()

  for (;;)
  {
    char c = serialGetchar (fd);
    putchar (c == '!' ? '\r' : c) ;
    fflush (stdout) ;
  }
}

通常使用带回车的新行,在这种情况下将是:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringSerial.h>

int main ()

  for (;;)
  {
    char c = serialGetchar (fd);
    if (c == '!')
    {
        putchar ('\r') ;
        putchar ('\n') ;
    }
    else
    {
        putchar (c) ;
    }
    fflush (stdout) ;
  }
}

答案 1 :(得分:1)

char c = serialGetchar (fd)) ;
c = (c == '!') ? '\r' : c ;
putchar (c) ;

或者换句话说,

char c = serialGetchar (fd)) ;
if (c == '!') c = '\r' ;
putchar (c) ;

答案 2 :(得分:1)

您可以用

替换整个代码
for(;;)
{
  char c = serialGetchar (fd);
  if(c == '!')
  {
    putchar('\n');
  }
  else
  {
    putchar(c);
    fflush (stdout);
  }
}

在向'\n'写入之后清除标准输出是没有必要的 - 这样做会自动触发冲洗。因此,作为次要优化,此代码在找到'!'后不会刷新stdout两次。