我正在尝试使用C程序来控制Ar.prone。在文本文件中编写了AT命令,然后将其直接传递给程序。但是,如果我尝试使用缓冲区和sprintf语句做到这一点,我会遇到分段错误。
我的程序是:
char cmd[MAX_MSG],cmd2[MAX_MSG],cmd3[MAX_MSG];
snprintf(cmd,"AT*CONFIG= %u,"general:navdata_demo","TRUE"",seq);
sendto(sd, cmd, MAX_MSG , flags, (struct sockaddr *) &droneAddr, sizeof(droneAddr));
seq++;
snprintf(cmd2,"AT*FTRIM=%u",seq);
sendto(sd, cmd2,MAX_MSG ,flags,(struct sockaddr *) &droneAddr, sizeof(droneAddr));
seq++;
snprintf(cmd3,"AT*PMODE= %u,2",seq);
sendto(sd, cmd3, MAX_MSG , flags, (struct sockaddr *) &droneAddr,sizeof(droneAddr));
seq++;
char cmd1[MAX_MSG];
for(i=0;i<100;i++)
{
cmd1[strlen(cmd1)-1] = 0x0d;//change last character from new line to carriagereturn
snprintf(cmd1,"AT*REF=%u,290718208",seq);
printf("%s: %sn",argv[0],cmd1);
rc = sendto(sd, cmd1, MAX_MSG , flags, (struct sockaddr *) &droneAddr, sizeof(droneAddr));
if(rc<0) {
printf("%s: can not send datan",argv[0]);
close(sd);
exit(EXIT_FAILURE);
}
seq++;
nanosleep(&wait_command , NULL);
}
错误是什么?任何人都可以帮忙吗?
第一期
snprintf的原型是:
snprintf ( char * s, size_t n, const char * format, ... );
所以你们所有:
snprintf(cmd, "somestring", seq);
应更改为:
snprintf(cmd, MAX_MSG, "somestring", seq);
第二期
char cmd1[MAX_MSG];
for(i=0;i<100;i++)
{
// here cmd1 contains garbage, hence the value of strlen(cmd1) is undefined
cmd1[strlen(cmd1)-1] = 0x0d;
}
您没有提供完整的程序,但至少有一个明显的问题。
缓冲液CMD1未初始化,所以
cmd1[strlen(cmd1)-1] = 0x0d;
可能导致segfault。
我想你想要的是
cmd1[sizeof(cmd1)-1] = 0x0d;