2013-04-09 83 views
0

我有一个程序,我正在开发和停止伺服。我可以从命令行发出以下命令,它可以工作。 echo 2=120 > /dev/servoblaster将启动伺服运动。现在,我有以下程序如何写入文件C

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *fp; 


    fp = fopen("/dev/servoblaster", "w"); 
    if (fp == NULL) { 
     printf("Error opening file\n"); 
     exit(0); 
} 
    fprintf(fp, "2=120"); 
    fclose(fp); 
    fflush(fp); 
    return 0; 
} 

但是,当我执行它什么也不会发生,现在当我尝试echo 2=120 > /dev/servoblaster命令,它会说Bad input: 2=1202=120,但如果我重复同样的echo 2=120 > /dev/servoblaster命令它会再次工作。如果我尝试执行我的上述程序3次输出,当我尝试执行echo命令时,它的输出将是Bad input 2=1202=1202=120 2=120对我来说,好像该文件没有写完成在我的程序中。有人能指出我是否错过了一些东西吗?

+0

'fflush(FP)'不能后'FCLOSE(FP)来完成'因为关闭指针后不再有效。你应该交换两个电话。 – 2013-04-09 01:48:28

回答

3

您需要的命令后添加一个换行符,像echo作用:

fprintf(fp, "2=120\n"); 

据推测,伺服的驱动程序等待,直到它作用于命令之前看到一个换行符。

0

程序有没有问题,我运行下面的代码

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *fp; 
    fp = fopen("/home/syler/servoblaster", "w"); 
    if (fp == NULL) { 
     printf("Error opening file\n"); 
     exit(0); 
    } 
    fprintf(fp, "2=120"); 
    fclose(fp); 
    fflush(fp); 
    return 0; 
} 

结果是

cat /home/syler/servoblaster 
2=120 

所以,必须有“servoblaster”内核驱动模块的问题。

+0

他没有使用'fwrite'。 – nneonneo 2013-04-09 01:39:20

+0

谢谢nneonneo,我修改了答案。 – syler 2013-04-09 01:51:22

0

这是一个古老的线程,但我遇到了同样的问题,所以张贴我所知道的。从我所看到的,需要“\ n”,但是下一次需要将缓冲区拧紧(即将“\ n”放入缓冲区,以便下一次写入看起来是不好的数据,即使它很好数据)。我目前的工作是在字符串前后添加“\ n”。这确保了它每次都能正常工作,但由于“\ n”,我总是收到“错误数据”消息。仍然在寻找正确的方法来做到这一点,但还没有找到来自C的调用来获得此代码的工作。

-3

对我来说这做工精细:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *fp; 
    fp = fopen("/home/syler/servoblaster", "w"); 
    if (fp == NULL) { 
     printf("Error opening file\n"); 
     exit(0); 
} 
fprintf(fp, "2=120"); 
fprintf(fp, "\n"); 
fclose(fp); 
fflush(fp); 
return 0; 
} 
+0

为什么你回答一个2岁的问题而不添加任何新东西? – 2015-04-09 07:32:32

+0

不,我确实添加了这一行“fprintf(fp,”\ n“);”解决那个“\ n”的问题。 – wanjijul 2015-04-10 01:57:45

+0

好的...我的意思是你没有添加任何新的尊重其他答案,并尊重被接受的。 – 2015-04-10 06:30:10