我正在与Beaglebone合作开展四轴飞行器项目。
我需要帮助通过C程序在Beaglebone上使用pwm。
我附上了以下代码,
#include <stdio.h>
#include <string.h>
#include <unistd.h>
struct pwm
{
char period[100];
char duty[100];
char polarity[100];
char run[100];
}pwm1,pwm2,pwm3,pwm4;
char pwm_1[]="P9_21";
char pwm_2[]="P9_14";
char pwm_3[]="P8_13";
char pwm_4[]="P9_42";
int initialize(struct pwm &pwmi, char pwm_i[])
{
sprintf(path,"echo \"bone_pwm_%s\" >> /sys/devices/bone_capemgr.9/slots",pwm_i);
fp = popen(path,"r");
fflush(fp);
usleep(1000);
sprintf(path,"ls /sys/devices/ocp.3/pwm_test_%s.*/period",pwm_i);
fp = popen(path,"r");
while(fgets(path,100,fp)!=NULL)
strcpy(pwmi.period,path);
fflush(fp);
sprintf(path,"ls /sys/devices/ocp.3/pwm_test_%s.*/duty",pwm_i);
fp = popen(path,"r");
while(fgets(path,100,fp)!=NULL)
strcpy(pwmi.duty,path);
fflush(fp);
sprintf(path,"ls /sys/devices/ocp.3/pwm_test_%s.*/polarity",pwm_i);
fp = popen(path,"r");
while(fgets(path,100,fp)!=NULL)
strcpy(pwmi.polarity,path);
fflush(fp);
sprintf(path,"ls /sys/devices/ocp.3/pwm_test_%s.*/run",pwm_i);
fp = popen(path,"r");
while(fgets(path,100,fp)!=NULL)
strcpy(pwmi.run,path);
fflush(fp);
pclose(fp);
return 0;
printf("%s%s%s%s",pwmi.period,pwmi.duty,pwmi.polarity,pwmi.run)
}
int pwmperiod(struct pwm &pwmi, unsigned int period)
{
sprintf(path,"echo %d > %s", period, pwm.period);
fp = popen(path,"r");
usleep(1000);
pclose(fp);
return 0;
}
int main()
{
unsigned int period = 200000;
initialize(pwm1,pwm_1);
initialize(pwm2,pwm_2);
initialize(pwm3,pwm_3);
initialize(pwm4,pwm_4);
pwmperiod(pwm1,period);
return 0;
}
现在上面的代码完全正常。但我想稍微使用pwmperiod()
函数。我没有使用popen()
,而是使用fopen()
和fprintf()
作为函数pwmperiod()
。像这样的东西,
int pwmperiod(struct pwm &pwmi, unsigned int period)
{
fp = fopen(pwmi.period,"r+");
fseek(fp,0,SEEK_SET);
fprintf(fp,"%d",period);
fclose(fp);
return 0;
}
我尝试了修改过的代码,但是当它试图写入周期值时,它会输出“分段错误”。
我意识到fopen()
需要const char
而pwmi.period
只需char
。另一个问题popen()
和sprint()
与const char
不兼容。
那么有没有办法解决转换?
在C / C ++程序中使用popen()
的频率是多少?
PS: 不是专家编码员,我不是计算机科学背景。我正在逐步学习。
同样,代码完美地与popen()
一起使用。但后来我对C中的文件处理感到满意。所以我希望亲自fopen()
而不是popen()
。此外,我觉得在C中使用popen()
是没有意义的。不妨使用pwm的shell脚本。
答案 0 :(得分:0)
暂时搁置char*
与const char*
的问题(因为char*
可以传递给任何使用const char*
的函数。
您是否检查过fopen
的返回值是非NULL?
请注意,使用fopen
调用r+
时,该文件必须存在。如果没有,fopen
将返回NULL,从而生成段错误。
由于文件只是被写入而未被阅读,因此请考虑使用
fp = fopen(pwmi.period,"w");
如果一个新文件已经存在,它将创建一个新文件。