【问题标题】:Process incoming serial stream without LF CR处理没有 LF CR 的传入串行流
【发布时间】:2017-09-26 14:16:59
【问题描述】:

下面的代码一次处理传入的 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) ;
  }
}

【问题讨论】:

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


    【解决方案1】:

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

    #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) ;
      }
    }
    

    【讨论】:

    • c == '!' ? '\r' : c 引入了对int 的隐式提升,这是不希望的。使用if 语句来避免这种情况(同时使代码更易于阅读)。
    • 3个在线来源表明serialGetchar()返回intputchar() 讲述int。推荐int c = serialGetchar (fd);
    • 非常感谢大家的回答。问题解决了。
    • putchar() 名义上采用int,但仅使用低端字节:int 被转换为unsigned char。我会假设serialGetchar() 做相反的事情:将unsigned char 转换为int。类似地,c == '!' ? '\r' : c 语句隐式地将所有内容提升为 int,因为字符文字在 c 中是 ints,但这实际上不是问题,因为提升始终丢弃除低端字节之外的所有内容。由于整数溢出,并不是 256 次中的 1 次将0xff 变成0x00。演员的行为绝对可以预测。
    • @Lundin 传递给putchar() 的任何有效参数都将提升为int。我完全不明白为什么这是“不希望的”。
    【解决方案2】:
    char c = serialGetchar (fd)) ;
    c = (c == '!') ? '\r' : c ;
    putchar (c) ;
    

    或者,换一种说法,

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

    【讨论】:

    【解决方案3】:

    您可以将整个代码替换为

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

    在写入'\n' 后不必刷新标准输出 - 这样做会自动触发刷新。所以作为一个小的优化,这段代码在找到'!'时不会刷新标准输出两次。

    【讨论】:

    猜你喜欢
    • 2011-03-07
    • 2019-03-14
    • 2011-03-07
    • 1970-01-01
    • 2019-08-06
    • 2012-03-22
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多