Как правильно установить параметры последовательного порта в структуре termios на Raspberry PI? - PullRequest
0 голосов
/ 12 декабря 2018

Я подключил Raspberry PI к ноутбуку через последовательный порт.Я написал программу, которая обеспечивает связь между устройствами в c на PI.Для проверки связи я использовал программное обеспечение терминала на ноутбуке.Я должен установить следующие параметры для связи:

Скорость передачи: 300, Биты данных: 8, Четность: ODD, Стоповый бит: 1, Подтверждение связи: Нет, Тайм-аут чтения: 5 с.

У меня есть несколько вопросов:

1) Правильно ли установлены необходимые параметры соединения?

2) Почему я ничего не получаю в терминале на ноутбуке?

3) Почему, если я отправляю один байт после наступления 2-х тайм-аутов, все остальные получаемые байты мгновенно равны 0 (без спада по таймауту)?

См. Мой код ниже:

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

int main ()
{
    struct termios RSopt;
    char byte = -1;
    char str[2] = {0,0};
    int fd;

    fd = open( "/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY );    

    tcgetattr(fd, &RSopt);
    cfsetospeed (&RSopt, (speed_t)B300);
    cfsetispeed (&RSopt, (speed_t)B300);

    cfmakeraw(&RSopt);

    RSopt.c_cflag &= ~CSIZE;
    RSopt.c_cflag &=  ~CRTSCTS; 
    RSopt.c_cflag |= O_NONBLOCK;
    RSopt.c_cflag |=  CREAD;
    RSopt.c_cflag |=  CLOCAL;
    RSopt.c_cflag |=  CS8; 
    RSopt.c_cflag |= PARENB;
    RSopt.c_cflag |= PARODD;  
    RSopt.c_cflag |= ~CSTOPB; 
    RSopt.c_iflag |= IGNPAR; 

    tcflush( fd, TCIFLUSH );
    tcsetattr (fd, TCSANOW, &RSopt); 

    struct timeval timeout;
    fd_set read_fds;

    for (int ii=0;ii<10;++ii)
    {
        FD_ZERO(&read_fds);
        FD_SET(fd, &read_fds);
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;    
        str[0] = 0x5;
        write(fd, str, 1);

        if (select(fd + 1, &read_fds, NULL, NULL, &timeout) == 1)
        {
            read(fd, &byte, 1);
            printf("Recive: %x\n", byte);
        }
        else
        {
            printf("Timeout.\n");
        }
    };
    close(fd);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...