0

伙计们,这可能是一个愚蠢的问题,我在许多网站上进行了搜索,但我的程序无法正常工作:(

我从连接到 Raspberry Pi 的 MCP3008 中读取了一些值,然后使用以下 python 脚本将它们发送到 PureData:

 os.system("echo '" + value + ";' | pdsend 3000 localhost")

其中“值”包含传感器的读数。但是脚本太慢了,所以我决定搬到C

    int main() {
  for ( ; ; )
  {
    int value = mcp3008_value(0, 18, 23, 24, 25);
    char  message[]="";
    char str[50];
    sprintf( str, "%d", value );
    strcpy(message, "echo '");
    strcat(message, str);
    strcat(message, ";' | pdsend 3000 localhost");
    printf(message);

  }
  return 0;

}

但是当我执行它时,我得到:分段错误

有没有一种简单的方法来连接 int 和 python 中的字符串?你认为它会比python更快吗?

多谢你们 ;)

4

3 回答 3

2

你的线

 char  message[]="";

是错的。

您需要为它分配内存,因为它只会分配 1 个字节。您可以使用以下内容,

 char  message[1000]="";
于 2013-09-27T14:12:59.613 回答
1

这个:

int value = mcp3008_value(0, 18, 23, 24, 25);
char  message[]="";
char str[50];
sprintf( str, "%d", value );
strcpy(message, "echo '");
strcat(message, str);
strcat(message, ";' | pdsend 3000 localhost");
printf(message);

可以更好(更快、更短、更清晰)写成:

char message[512];
const int value = mcp3008_value(0, 18, 23, 24, 25);

sprintf(message, "echo '%d;' | pdsend 3000 localhost", value);

这会在一次调用中构建字符串。如果你有它(我不确定 Pi),你应该使用snprintf()更多的保护:

snprintf(message, sizeof message, "echo '%d;' | pdsend 3000 localhost", value);

但我严重怀疑这一点处理是你的瓶颈所在。这可能是启动(通过system())两个新进程的行为,以便实际上传输一个整数,这会扼杀你的表现。

研究与 Pd 交谈的其他方式,这种方式不涉及pdsend每次你想发送东西时都产生一个新的。

于 2013-09-27T14:19:15.797 回答
0

错误发生在以下行:

strcpy(message, "echo '");

因为消息缓冲区只有一个字节大小。

于 2013-09-27T14:39:55.910 回答