如何删除linux中的^ M ^ J字符

时间:2013-06-07 06:52:44

标签: c newline codeblocks raspberry-pi raspbian

我有一台外部机器,可以将结果发送给我的Raspberry pi。在我的模拟器Cutecom我有逐行的结果没有问题。我使用Codeblocks,我编写了自己的C应用程序,每隔10秒读取一次这些数据。但奇怪的事情发生了。有时我会逐行得到结果,有时候我会在每一行的末尾都有奇怪的字符^ M ^ J,结果我得到了糟糕的决赛结果。我认为这些EOF字符是因为外部机器是在Windows中开发的。

好结果

+PARAMETERS: 45 BYTES FROM 0000:0000 (063)
MACHINE_1:(AN=23.45,H=34.56,D=12.34)

糟糕的结果

+PARAMETERS: 45 BYTES FROM 0000:0000 (063)^M^JMACHINE_1:
(AN=21.45,H=33.56,D=10.34)

好的,直到这里唯一的问题是命令行显示结果的方式,但我的结果还可以。但是,如果我尝试使用strtok获取一些令牌,那么由于这些特征,我会遇到严重的问题。我能做什么?我可以添加一些东西来逃避这些字符吗?这是我用来从机器读取数据的代码的一部分

char buff[300];
memset(buff, 0, sizeof(buff));
for (;;)
{
  n=read(fd,buff,sizeof(buff));
  sleep(1);
  printf("%s", buff);
  printf("\n");
  ....
  ....

3 个答案:

答案 0 :(得分:1)

您只是阅读300个字符的块,因此没有字符串终止\0

您必须查看n以查看您已阅读的数据量,然后在打印前处理数据,即查找^J^M并终止该行,然后继续阅读其余内容的数据。

FYI ^J^M是Windows行终止(它只是^J来自linux)

以下内容应该读取多条消息并将^和J转换为\ n并忽略^ M.

注意这使用STDIN,而不是串口。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int fd=STDIN_FILENO;
    int i,n;
    int c=0;

    char buff[300];
    memset(buff, 0, sizeof(buff));
    for (;;)
    {
        n=read(fd,buff,sizeof(buff));
        for (i=0; i<n; i++) 
        {
            switch(buff[i])
            {
            case '^':
                if(c) 
                {
                    // ^^ so output first ^
                    putchar('^');
                }
                else
                {
                    // Possible ^M or ^J
                    c++;
                }
                break;

            case 'M':
                if (c)
                {
                    // ignore ^M
                    c=0;
                }
                else
                {
                    // just M 
                    putchar(buff[i]);
                }
                break;

            case 'J':
                if (c)
                {
                    // ^J is \n
                    putchar('\n');
                    c=0;
                }
                else 
                {
                    // just J
                    putchar(buff[i]);
                }
                break;

            default:
                if (c)
                {
                    // ^ followed by other than J or M
                    putchar('^');
                    c=0;
                }

                putchar(buff[i]);
            }
        }

    }
    return 0;
}

答案 1 :(得分:0)

我认为你仍然可以使用strtok()。只需在^M参数中添加^Jchar *delimiters

答案 2 :(得分:0)

只需执行命令“sed -e's / \ ^ \ M $ // g'filename”

或者我是从网站上得到的。

#!/usr/bin/python
while True:
  file = raw_input('Input file name:(input "q" to quit)')
  if file == 'q':
      break
  file_ = open(file).read()
  list_ = list(file_)
  new_file = ''
  for x in list_:
      if x != '^' and x != 'M':
          new_file = new_file + x
  file_ = open(file,'w')
  file_.write(new_file)
  file_.close()