2014-01-29 4 views
1

나는 microblaze에서 ulinux로 작업하고 있습니다.SPI 용 파이프에서 읽기

Ive SPI에 약간의 문제가 있습니다. 내 코드는 파이프가 읽혀진 것을 볼 수 있습니다. 하지만 printf가 작동하지 않는 데이터 (rdata)를 어떻게 확인할 수 있습니까? 당신을 위해

# ./spiread 
openend /dev/spi/pipe9 
fd = 3 
Initialisation complete! 
try to set! 
fd_set set! 
Select is 1! 
Wait: 
Check1 
Check2 

* 편집 덕분에 빠른 대답 :

여기

//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; 
} 

터미널 내 코드입니다. 일하지 마! 그 print() 위로 뛰어 넘기. ** 편집 오 작품! Thx Alter Mann. -.-

+0

내 대답의 편집을 살펴 보자, 그것은 정확하지 않았습니다 –

답변

2
uint8_t rdata[1500]; 
... 
ctrl = read(fd, &rdata, 1500); 
printf("entered data: %s", rdata); //DOESN'T WORK 

을 투표 질수 내가로 변경하는 것이 좋습니다 : recv이 현대적인 시스템에 read에 선호되는

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

하는 것으로

+0

신속한 답변을 주셔서 감사합니다. 작동합니다! ^^ – hoherprotektor

+0

당신은 환영합니다;) –

+0

@AlterMann : 코드에 버퍼 오버플로가 있습니다. "ctrl = read (fd, rdata, sizeof (rdata) - 1);"이어야합니다. 전체 1500 바이트를 읽으면 Null 바이트가 배열의 경계를 벗어납니다. – DoxyLover

관련 문제