2016-07-08 3 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; 
    } 

Иногда сообщение написано загрязнен или неполное. Конфигурация правильная?

ответ

0

Ваш код не соответствует Setting Terminal Modes Properly и Serial Programming Guide for POSIX Operating Systems

Попробуйте этот код:

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 предназначен для сохранения копии исходных параметров терминалов и должен использоваться для восстановления последовательного порта до закрытия последовательного порта. Но ваша подпрограмма объявляет oldtio как локальный, поэтому он не имеет области вне процедуры инициализации.