2014-03-26 50 views
0

嗨我寫了一個程序在c中與/ dev/ttyS0通信到設備。當我寫我能夠做到這一點,但我得到錯誤:資源暫時不可用,-1從read()返回。你可以請檢查我做錯了什麼。該端口應該是半雙工,9600bps,8N1和4ms的幀間字節延遲。也有人可以告訴我如何設置內部字節延遲毫秒。以下是我的代碼。無法讀取通過linux串行端口

#include<stdio.h> 
    #include<termios.h> 
    #include<fcntl.h> 
    #include<unistd.h> 
    #include<errno.h> 


    #define BAUDRATE B9600 
    #define PORT "/dev/ttyS0" 

    int main() 
    { 
     struct termios new_tio,old_new_tio; 
     int fd; 
     unsigned char msgS[5]="",msgR[10]=""; 

     fd = open(PORT,O_RDWR|O_NOCTTY|O_NDELAY); 
     if(fd == -1) 
      printf("Failed to open PORT: %s \n\n",PORT); 
     perror("Error:"); 
     tcgetattr(fd,&old_new_tio); 
     memset(&new_tio,0,sizeof(new_tio)); 

     new_tio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD|CSIZE|PARENB; 
     new_tio.c_oflag = 0; 
     new_tio.c_iflag = 0; 
     new_tio.c_cc[VMIN] = 10; 
     new_tio.c_cc[VTIME] = 0.004; 
     cfsetispeed(&new_tio,BAUDRATE); 
     cfsetospeed(&new_tio,BAUDRATE); 
     new_tio.c_cc[VINTR] = 0;  
      new_tio.c_cc[VQUIT] = 0; 
      new_tio.c_cc[VERASE] = 0; 
      new_tio.c_cc[VKILL] = 0; 
      new_tio.c_cc[VEOF]  = 4; 
     new_tio.c_cc[VSWTC] = 0;  /* '\0' */ 
      new_tio.c_cc[VSTART] = 0;  /* Ctrl-q */ 
      new_tio.c_cc[VSTOP] = 0;  /* Ctrl-s */ 
      new_tio.c_cc[VSUSP] = 0;  /* Ctrl-z */ 
      new_tio.c_cc[VEOL]  = 0;  /* '\0' */ 
      new_tio.c_cc[VREPRINT] = 0;  /* Ctrl-r */ 
      new_tio.c_cc[VDISCARD] = 0;  /* Ctrl-u */ 
      new_tio.c_cc[VWERASE] = 0;  /* Ctrl-w */ 
      new_tio.c_cc[VLNEXT] = 0;  /* Ctrl-v */ 
      new_tio.c_cc[VEOL2] = 0; 

     tcflush(fd,TCIFLUSH); 
     tcsetattr(fd,TCSANOW,&new_tio); 
     msgS[0] = '*'; 
     msgS[1] = 'G'; 
     msgS[2] = 'U'; 
     msgS[3] = 'S'; 
     msgS[4] = '\r'; 

     printf("Message to be sent : %s \n\n",msgS); 
     int i = write(fd,&msgS,5); 
     if(i != 5) 
      printf("error while writing to the port\n\n"); 

     int j = read(fd,&msgR,10); 
     if(j != 10) 
      printf("error while reading from port\n\n"); 

     printf("Message Recieved : %s\n\n",msgR); 

     return 0; 
    } 
+0

如果您使用的是非阻塞I/O,請使用select()在數據可用(用於讀取)時通知您,或者有空間輸出數據(用於寫入)。 –

回答

1

以非阻塞模式打開端口(使用O_NDELAY)。因此你的read絕不會阻塞,只能讀取已經到達的內容。您應該使用select先等待數據,或使用阻止模式。

我懷疑你可以微調字節間延遲。要增加它,可以使用兩個停止位而不是一個(CSTOPB)。

+0

,你能告訴我應該一次一個字節讀取字節或整個字符串?並且不能使用new_tio.c_cc [VTIME]來設置幀間字節延遲......有人可以告訴我一些參考資料,我可以在這裏找到關於此的信息 –