2015-01-08 89 views
2

我正在做一個程序來打開,寫入和讀取端口ttyUSB0,我有下一個程序,我什麼都不寫。任何人都可以幫我嗎?打開,寫入和讀取ttyUSB0

我的問題是,我有寫或讀功能的問題,因爲我不能讀寫ttyUSB0端口,我搜索解決方案來寫和讀ttyUSB0端口。

#include <sys/time.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <string.h> 
#include <termios.h> 

#include <iostream> 
#include <sys/types.h> 
#include <sys/stat.h> 

using namespace std; 

int serial_open(char *serial_name, speed_t baud) 
{ 
     struct termios newtermios; 
     int fd; 
     fd = open(serial_name,O_RDWR | O_NOCTTY); 
     newtermios.c_cflag= CBAUD | CS8 | CLOCAL | CREAD; 
     newtermios.c_iflag=IGNPAR; 
     newtermios.c_oflag=0; 
     newtermios.c_lflag=0; 
     newtermios.c_cc[VMIN]=1; 
     newtermios.c_cc[VTIME]=0; 
     cfsetospeed(&newtermios,baud); 
     cfsetispeed(&newtermios,baud); 
     if (tcflush(fd,TCIFLUSH)==-1) return -1; 
     if (tcflush(fd,TCOFLUSH)==-1) return -1; 
     if (tcsetattr(fd,TCSANOW,&newtermios)==-1) return -1; 
     return fd; 
}  
void serial_send(int serial_fd, char *data, int size) 
{ 
    write(serial_fd, data, size); 
} 

int serial_read(int serial_fd, char *data, int size, int timeout_usec) 
{ 
     fd_set fds; 
     struct timeval timeout; 
     int count=0; 
     int ret; 
     int n; 
     do { 
     FD_ZERO(&fds); 
     FD_SET (serial_fd, &fds); 
     timeout.tv_sec = 0; 
     timeout.tv_usec = timeout_usec; 
     ret=select (FD_SETSIZE,&fds, NULL, NULL,&timeout); 
     if (ret==1) { 
      n=read (serial_fd, &data[count], size-count); 
      count+=n; 
      data[count]=0; 
    } 
} while (count<size && ret==1); 
return count; 
} 

void serial_close(int fd) 
{ 
    close(fd); 
} 

int main(int argc, char *argv[]) 
{ 
    int serial_fd, n, longitud,; 
    char *device=」at」; 
    char *data; 
    longitud=strlen(device); 

    serial_fd = serial_open("/dev/ttyUSB0",B38400); 
    if (serial_fd == -1) { 
      printf ("Error opening the serial device: %s\n",argv[1]); 
      perror("OPEN"); 
      exit(0); 
    } 
    printf("SERIAL OPEN:%s\n", device); 
    serial_send(serial_fd, device, longitud); 
    printf ("String sent------> %s\n",device); 
    n=serial_read(serial_fd,data,longitud,10000); 
    printf("Se ha recibido %s \n Tamaño: %d\n n:%d \n serial_fd:%d\n",data, longitud,n,serial_fd); 
puts(data); 
    serial_close(serial_fd); 
// cout << "Hello world!" << endl; 
    return 0; 
} 
+0

執行['read'(http://man7.org/linux/man-pages/man2/read.2.html)或['寫'](http://man7.org/linux/man-pages/man2/write.2.html)系統調用返回一個錯誤代碼?你有沒有檢查錯誤是什麼?總是檢查錯誤,並*錯誤是什麼(通過檢查['errno']完成(http://man7.org/linux/man-pages/man3/errno.3.html),使用[ 'perror'](http://man7.org/linux/man-pages/man3/perror.3.html)或者使用['strerror']獲取一個字符串(http://man7.org/linux/man-頁/ man3/strerror.3.html))。 –

+0

隨着開放我返回一個'3',與寫我不會返回任何東西,並閱讀我返回一個'0',這'0'是我沒有收到任何東西 – Igor

+0

當'read'返回零時,它意味着「連接」已關閉,或已達到「文件結束」。你真的需要檢查'寫'返回。並且所有其他系統調用(以及* do *記得在系統調用返回失敗時檢查'errno'(例如'-1'))。 –

回答

0

你的程序在寫入和閱讀時工作得很好,但是你有另一個問題:Undefined behavior

您的main函數名爲data中有一個指針變量,並將其傳遞給您的serial_read函數。但是你沒有任何地方可以將這個指針指向任何地方,所以當這個指針被解除引用時,你就有了未定義的行爲。

本地(非靜態)變量未初始化,它們的值是不確定的。你需要初始化變量,使其實際指向某個地方。我建議你把它變成一個數組。

然後當你打電話serial_read你只要求讀兩個字節(字符串"at"的長度),而不是數據的實際大小(目前是沒有的),你需要傳遞的實際大小代替緩衝區。

所以總結起來:

int main(void) 
{ 
    ... 
    char data[256]; 
    ... 
    n = serial_read(serial_fd, data, sizeof(data), 10000); 
    ... 
} 
+0

我這樣做我沒有收到任何東西,我使用Docklight來查看端口是否可以正常工作,並在Docklight中發送''並且我收到'0',表示沒問題 – Igor

+1

@Igor不應該代碼還會發送''字符嗎?看來你的代碼只發送「at」? – nos