gpt4 book ai didi

c - 如何从 char * 切换到 const char *[beaglebone 中的 pwm]?

转载 作者:行者123 更新时间:2023-11-30 19:41:33 27 4
gpt4 key购买 nike

我正在与 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 不兼容。

那么有没有办法解决转换问题呢?

另外,popen() 在 C/C++ 程序中使用的频率如何?

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

同样,该代码与 popen() 完美配合。但后来我对 C 中的文件处理感到满意。所以我个人更喜欢 fopen() 而不是 popen() 。此外,我觉得在 C 中使用 popen() 是没有意义的。还不如使用 shell 脚本来实现 pwm。

最佳答案

暂时搁置 char*const char* 的问题(因为 char* 无论如何都可以传递给任何函数采用 const char*)。

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

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

由于文件仅被写入,而不是读取,因此考虑使用

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

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

关于c - 如何从 char * 切换到 const char *[beaglebone 中的 pwm]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33448139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com