2016-07-08 11 views
0

ラズベリーのシリアルポート設定をC++で完了しようとしています。私はこのパラメータを設定する必要があります: - ボーレート38400、 - データビット8、 - パリティなし、 - ハンドシェークなし。 読み取りは正常に動作するとは限りません。ここ は私のコードです:シリアルポートの設定C++

int set_interface_attribs (int fd) 
{ 
    struct termios oldtio,newtio; 
    /* Save current settings */ 
    tcgetattr(fd,&oldtio); 
    /* clear struct for new settings */ 
    bzero(&newtio, sizeof(newtio)); 
    if (tcgetattr (fd, &oldtio) != 0) 
    {  
      std::cout<<"[WARNING]Error from tcgetattr: "<<errno<<" \n \r"<<std::endl; 
      return -1; 
    } 
newtio.c_cflag |= (CLOCAL | CREAD); 
newtio.c_cflag |= BAUDRATE; 
newtio.c_cflag &= ~CRTSCTS; 
/* Set no parity */ 
newtio.c_cflag &= ~(PARENB | PARODD); 
newtio.c_cflag &= ~CSTOPB; 
newtio.c_cflag &= ~CSIZE; /* Mask the character size bits */ 
newtio.c_cflag |= CS8; /* Select 8 data bits */ 
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
newtio.c_iflag &= ~(IXON | IXOFF | IXANY); 
    newtio.c_lflag = 0;    // no signaling chars, no echo, 
             // no canonical processing 
     newtio.c_oflag = 0;    // no remapping, no delays 
    newtio.c_cc[VMIN] = 0;   // read doesn't block 
    newtio.c_cc[VTIME] = 5;   // 0.5 seconds read timeout 
    /* Clear */ 
    tcflush(fd, TCIFLUSH); 
    /* Enable the settings */ 
    tcsetattr(fd,TCSANOW,&newtio); 
    if (tcsetattr (fd, TCSANOW, &newtio) != 0) 
    { 
        std::cout<<"[WARNING]Error from tcgetattr: "<<errno<<" \n \r"<<std::endl; 
      return -1; 
    } 
    return 0; 
    } 

時々書かれたメッセージが汚れていたり、不完全です。設定は正しいですか? Setting Terminal Modes ProperlySerial Programming Guide for POSIX Operating Systems

このコードを試してみ

答えて

0

あなたのコードが準拠していない:上記の問題が解決しない場合は、書き込み操作を実行しようとすると、あなたのコードを投稿

struct termios oldtio; 

int set_interface_attribs(int fd) 
{ 
    struct termios newtio; 
    speed_t spd; 
    int rc; 

    rc = tcgetattr(fd, &oldtio); 
    if (rc < 0) {  
     std::cout<<"[WARNING]Error from tcgetattr: "<<errno<<" \n \r"<<std::endl; 
      return -1; 
    } 
    newtio = oldtio; 

    spd = B38400; 
    cfsetospeed(&newtio, spd); 
    cfsetispeed(&newtio, spd); 

    cfmakeraw(&newtio); 
    newtio.c_cflag |= (CLOCAL | CREAD); 
    newtio.c_cflag &= ~CRTSCTS; 
    newtio.c_cflag &= ~CSTOPB; 

    /* pure timed read */ 
    newtio.c_cc[VMIN] = 0; 
    newtio.c_cc[VTIME] = 5; 
    /* Clear */ 
    tcflush(fd, TCIFLUSH); 
    /* Enable the settings */ 
    rc = tcsetattr(fd, TCSANOW, &newtio); 
    if (rc < 0) { 
     std::cout<<"[WARNING]Error from tcgetattr: "<<errno<<" \n \r"<<std::endl; 
     return -1; 
    } 
    return 0; 
} 

BTW oldtioは、元のtermios設定のコピーを保持するためのもので、シリアルポートを閉じる前にシリアルポートを復元する必要があります。しかし、ルーチンはoldtioをローカルとして宣言しているため、初期化ルーチン外のスコープはありません。

関連する問題