1

我有一台外部机器,可以在我的 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");
  ....
  ....
4

3 回答 3

1

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

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

仅供参考^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;
}
于 2013-06-07T07:07:25.917 回答
0

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

于 2013-06-07T07:12:45.087 回答
0

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

或者我从网站上得到这个。

#!/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()
于 2013-06-07T07:38:54.533 回答