C 从管道中读取SPI
我正在和一个乌里克斯公司合作制作微咖啡 我对SPI有些问题。 我的代码工作,我看到管道被读出。但是如何检查数据(rdata)printf不工作 这是我的密码C 从管道中读取SPI,c,linux,spi,C,Linux,Spi,我正在和一个乌里克斯公司合作制作微咖啡 我对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
//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;
}
*编辑谢谢你的快速回答。不要工作!跳过那个打印()。
**编辑哦,它的作品!泰克斯奥尔特曼。不能投赞成票
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);
注意,在现代系统中,更倾向于
读取。@AlterMann:代码中存在缓冲区溢出。它应该是“ctrl=read(fd,rdata,sizeof(rdata)-1;”。如果读取的是完整的1500字节,则空字节将超出数组的界限。@DoxyLover,我认为您错了:,请看最后的示例。@AlterMann:区别在于,在该示例中,他们没有写入额外的空字节。在您的代码中,read()可以读取填充缓冲区的1500字节(sizeof(rdata))。在这种情况下,您的上一次分配将写入rdata[1500],这会使数组溢出。我坚持我的意见@DoxyLover,ops,你是对的,现在我明白我的错误了,谢谢你的纠正。是的,堆栈溢出了。又来了^^看看我的答案的编辑,它是不正确的
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);