我正在微型飞机上使用ulinux。
我有一些SPI问题。 我的代码工作,我看到管道被读出。但是我如何检查数据(rdata)printf不起作用。
这是我的代码
//slavetool
int main(int argc, char **argv)
{
uint8_t rdata[1500];
int ctrl = 0;
int fd;
int pipenr = 9;
int n;
char device[15];
fd_set socks;
//open codec
sprintf(device,"/dev/spi/pipe%d", pipenr);
fd = open(device, O_RDWR);
if(fd < 0)
{
printf("Failed to open pipe %s\n", device);
return 0;
} else
{
printf("openend %s\n", device);
}
printf("fd = %i\n", fd);
printf("Initialisation complete!\n");
while(1)
{
printf("try to set!\n");
FD_ZERO(&socks);
FD_SET(fd, &socks);
printf("fd_set set!\n");
n = select(fd + 1, &socks, NULL, NULL, NULL);
//printf("Select is %i!\n", n);
if(FD_ISSET(fd, &socks))
{
ctrl = read(fd, &rdata, 1500);
printf("entered data: %s", rdata); //DOESN'T WORK
printf("ctrl: %i", ctrl); //DOESN'T WORK
printf("Check1\n"); // WORK
if(ctrl<0)
{
perror("read");
printf("Ende ctrl ist %i!\n",ctrl);
FD_ZERO(&socks);
close(fd);
return -1;
}
printf("Check2\n");
} else {printf("FD_ISSET not set");}
}
close(fd);
return 0;
}
终端:
# ./spiread
openend /dev/spi/pipe9
fd = 3
Initialisation complete!
try to set!
fd_set set!
Select is 1!
Wait:
Check1
Check2
*编辑感谢您的快速回答。不要工作!跳过那个打印()。 **编辑哦,它有效! Thx Alter Mann。不能投票-.-
答案 0 :(得分:2)
uint8_t rdata[1500];
...
ctrl = read(fd, &rdata, 1500);
printf("entered data: %s", rdata); //DOESN'T WORK
我建议将其更改为:
char rdata[1500];
...
ctrl = read(fd, rdata, sizeof(rdata) - 1);
if (ctrl == -1) {
perror("read");
exit(EXIT_FALURE);
}
rdata[ctrl] = '\0'; // read() doesn't add a trailing 0
printf("entered data: %s", rdata);
请注意recv优先于现代系统上的read