C 从管道中读取SPI

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

我正在和一个乌里克斯公司合作制作微咖啡

我对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;
}
*编辑谢谢你的快速回答。不要工作!跳过那个打印()。 **编辑哦,它的作品!泰克斯奥尔特曼。不能投赞成票

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);