如何从char *切换到const char * [pwm in beaglebone]?

时间:2015-10-31 04:46:18

标签: c embedded-linux fopen popen beagleboneblack

我正在与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 charpwmi.period只需char。另一个问题popen()sprint()const char不兼容。

那么有没有办法解决转换?

在C / C ++程序中使用popen()的频率是多少?

PS: 不是专家编码员,我不是计算机科学背景。我正在逐步学习。

同样,代码完美地与popen()一起使用。但后来我对C中的文件处理感到满意。所以我希望亲自fopen()而不是popen()。此外,我觉得在C中使用popen()是没有意义的。不妨使用pwm的shell脚本。

1 个答案:

答案 0 :(得分:0)

暂时搁置char*const char*的问题(因为char*可以传递给任何使用const char*的函数。

您是否检查过fopen的返回值是非NULL?

请注意,使用fopen调用r+时,该文件必须存在。如果没有,fopen将返回NULL,从而生成段错误。

由于文件只是被写入而未被阅读,因此请考虑使用

fp = fopen(pwmi.period,"w");

如果一个新文件已经存在,它将创建一个新文件。