Odczytuję dane przez połączenie USB jako port szeregowy ze sterownikiem PL2303. Zwraca on pomyślnie, wykonując numer open
i po ustawieniu opcji TTY i braku blokowania. Kiedy próbuję zamknąć połączenie, zawiesza się. W tym stanie odczytuje " " zamiast znaków.Program zawiesza się podczas zamykania portu szeregowego
Mogę podłączyć urządzenie do urządzenia idealnie z wycinarką. Oto dziwna część:
- Jeśli po raz pierwszy połączę się z urządzeniem przez cutecom (monitor szeregowy), mój program połączy się i zamknie idealnie dokładnie za każdym razem. Czyta postacie tak, jak oczekuję, że zostaną przeczytane. (Nie ).
- Po odłączeniu i ponownym podłączeniu sprzętu mój program zawiesi się ponownie, dopóki nie uruchomię cutecom.
Ponieważ działa po tym, jak używam cutecom, to powoduje, że myślę, że brakuje mi czegoś w początkowym połączeniu lub ustawieniach połączenia. Oto co mogę użyć do podłączenia:
baud_rate = 38400;
fd = open (device_path, O_RDONLY | O_NOCTTY);
W moim set_tty_options
funkcję:
struct termios tty_options;
memset (&tty_options, 0, sizeof(tty_options));
tcgetattr (fd, &tty_options);
cfsetispeed(&tty_options, baud_rate); // set baud rate
tty_options.c_cflag = (tty_options.c_cflag & ~CSIZE) | CS8; // 8 bit msgs
tty_options.c_cflag |= (CLOCAL | CREAD); // enable reading
tty_options.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty_options.c_cflag |= parity;
tty_options.c_cflag &= ~CSTOPB;
tty_options.c_cflag &= ~CRTSCTS;
if (tcsetattr (fd, TCSANOW, &tty_options) != 0)
{
printf("error %d from tcsetattr\n", errno);
return TTY_ERROR;
}
W set_blocking
funkcja:
if (tcgetattr (fd, &tty) != 0)
{
printf("error %d from tggetattr", errno);
return FAILURE;
}
// 0 or 1 byte is enough to return from read
tty.c_cc[VMIN] = should_block ? 1 : 0;
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
if (tcsetattr (fd, TCSANOW, &tty) != 0)
{
printf("error %d setting term attributes", errno);
return FAILURE;
}
Widzę 2 problemy z kodem. Po pierwsze, funkcja 'set_tty_options' nie wydaje się w pełni inicjować struktury' tty_options'. To może wyjaśnić, że "mój program działa, jeśli uruchomię X jako pierwszy, ale zawiesza się/zawiedzie, jeśli uruchomi się solo". Jest to klasyczny objaw programu, który nie inicjuje poprawnie ani w pełni jego środowiska. Po drugie, funkcja 'set_blocking' jest fałszywa dla danych wejściowych kanonicznych. 'c_cc [VMIN]' i 'c_cc [VTIME]' powinny być używane tylko dla ** niekanonicznego ** (również surowego) wejścia. Aby nie blokować 'read()' wejścia kanonicznego, użyj 'fcntl()', aby to ustawić. – sawdust