我有一台外部机器,可以将结果发送给我的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");
....
....
答案 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
参数中添加^J
和char *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()