因此,im与CAN一起使用这,CANopenNode,im,通过.c程序文件制作烛台。
我的接收器代码如下所示
char raw_message[47], message_id[4], message_data[17];
fp = popen("candump vcan0 -L", "r");
if( fp == NULL )
{
printf("Failed to run CANDUMP for VCAN0");
exit(1);
}
while ( fgets(raw_message, sizeof(raw_message), fp) )
{
if( isspace(raw_message[0]) )
{
}
else
{
//GETTING THE ACTUAL MESSAGE = ID+DATA
cid = 0;
cdata = 0;
for(i=26; i<46; i++)
{
if( i<29 )
{
message_id[cid] = raw_message[i];
cid++;
}
else if ( i==29 )
message_id[cid] = '\0';
else if ( i>29 )
{
message_data[cdata] = raw_message[i];
cdata++;
}
}
message_data[16] = '\0';
//END OF GETTING MESSAGE
fprintf(stdout,"%s\n",raw_message);
fflush(stdout);
}
}
pclose(fp);和我运行一个shell脚本来发送
echo "Start"
i=0;
while [ $i -le 5 ] ;
do
#echo "sent"
cansend vcan0 123#0801010101010101
let i=$i+1
done
exit 0我想要做的是将id从消息的实际数据中分离出来。问题是,正如你所看到的,只有在raw_message的第一个插槽不是空格的情况下,我才会这样做,因为我收到一条消息,我用fget得到它,然后我得到‘’然后消息,然后‘然后继续。只有当我使用if (isspace)时,如果我添加注释,命令"fprintf(stdout,"%s\n",raw_message)就停止工作了。我尝试了多种解决方案,但似乎没有任何效果。有什么特别的原因吗?我是做错了什么,还是做错了CANUtils?
使用issspace()时输出(输出与在bash上运行烛台时相同){}
(1585149182.549347) vcan0 123#0801010101010101
(1585149182.550713) vcan0 123#0801010101010101
(1585149182.555930) vcan0 123#0801010101010101
(1585149182.559413) vcan0 123#0801010101010101
(1585149182.560687) vcan0 123#0801010101010101
(1585149182.561604) vcan0 123#0801010101010101当我不使用它时输出
while ( fgets(raw_message, sizeof(raw_message), fpdump) )
{
// if( isspace(raw_message[0]) )
// {
// }
// else
{
//GETTING THE ACTUAL MESSAGE = ID+DATA
cid = 0;
cdata = 0;
for(i=26; i<46; i++)
{
if( i<29 )
{
message_id[cid] = raw_message[i];
cid++;
}
else if ( i==29 )
message_id[cid] = '\0';
else if ( i>29 )
{
message_data[cdata] = raw_message[i];
cdata++;
}
}
message_data[16] = '\0';
//END OF GETTING MESSAGE
fprintf(stdout,"%s\n",raw_message);
fflush(stdout);
}
}输出:
(1585149305.257591) vcan0 123#0801010101010101
(1585149305.258339) vcan0 123#0801010101010101
(1585149305.259055) vcan0 123#0801010101010101
(1585149305.259651) vcan0 123#0801010101010101
(1585149305.260280) vcan0 123#0801010101010101
(1585149305.260860) vcan0 123#0801010101010101发布于 2020-03-25 16:11:19
如问题中所示的示例数据
(1585149182.549347) vcan0 123#0801010101010101
(1585149182.550713) vcan0 123#0801010101010101..。
行长度为46个字符,没有换行符('\n')或包括换行符在内的47个字符。
fgets需要追加一个尾随NUL字符('\0')来终止字符串。这就是为什么第一个调用将在没有换行符的情况下读取该行,因为缓冲区已满。缓冲区将包含字符串。
"(1585149182.549347) vcan0 123#0801010101010101"下一次调用只会读取换行符,因为这是行的末尾。缓冲区将包含
"\n"您必须将raw_message的大小增加到至少48。那你就会得到
"(1585149182.549347) vcan0 123#0801010101010101\n"在一个fgets电话里。
注意,最好使用socketcan接口来读取二进制CAN消息,而不是解析candump的文本输出。
https://stackoverflow.com/questions/60851068
复制相似问题