2014-01-29 132 views
1

我正在使用一個microinla上的ulinux。從管道讀取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; 

    //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現代系統

+0

感謝您的及時答案。它的工作原理!^^ – hoherprotektor

+0

不客氣;) –

+0

@AlterMann:你的代碼中有緩衝區溢出。它應該是「ctrl = read(fd,rdata,sizeof(rdata) - 1);」。如果讀取的是完整的1500字節,則空字節將超出數組的範圍。 – DoxyLover