Обработка User-Break (UART) Перерыв на / Dev / TTY устройства в Linux

голоса
2

Вот некоторые примеры кода, но проблема в том , что обработчик сигнала не вызывается , когда «разрыв» передаются по последовательной линии с «замазкой».

#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>

void signal_handler(int status);

int main(void)
{
    FILE* f = fopen(/dev/ttyS0, r+b);

    struct sigaction saio; /* definition of signal action */
    saio.sa_handler = signal_handler;
    // saio.sa_mask = 0;
    saio.sa_flags = 0;
    saio.sa_restorer = NULL;
    sigaction(SIGINT,&saio,NULL);

    struct termios options;

    tcgetattr (fileno(f), &options);

    cfsetispeed(&options, B9600);
    cfsetospeed(&options, B9600);

    options.c_iflag &= ~IGNBRK; // & ~IGNPAR;
    options.c_iflag |= BRKINT; // | PARMRK | INPCK;
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 1;

    if (tcsetattr(fileno(f), TCSAFLUSH, &options) == -1)
    {
        printf(port setup failure\n);
        return -1;
    }

    ioctl(fileno(f), TIOCSCTTY, (char *)NULL);
    while (1) {
        int ch = fgetc(f);
        switch (ch) {
        case EOF: break;
        case EAGAIN: printf([EAGAIN]); break;
        case EBADF: printf([EBADF]); break;
        case EINTR: printf([EINTR]); break;
        case EIO: printf([EIO]); break;
        case EOVERFLOW: printf([EOVERFLOW]); break;
        default:
            if (isprint(ch))
                putchar(ch);
            else
                printf([%02x], ch);
        }
    }
}

void signal_handler(int status)
{
    printf(received SIGINT %d signal.\n, status);
    exit(0);
}

Вот мои настройки Запущенная:

user@dev:~/$ sudo stty -F /dev/ttyS0
speed 9600 baud; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>;
lnext = <undef>; flush = <undef>; min = 0; time = 1;
-imaxbel
-opost -onlcr
-icanon -iexten -echo -echoe -echok -echoctl -echoke

Что я упускаю / почему я не получаю сигнал? Я использую USB-2-последовательный преобразователь и я могу видеть, что перерыв отправляется снова, но ничего не срабатывает вообще на данном клиентском конце.

Задан 10/06/2009 в 22:29
источник пользователем
На других языках...                            


1 ответов

голоса
1

Дайте ему попробовать под Трассированием наблюдения. Добавьте вызов tcgetattrпосле того как ваш , tcsetattrи убедитесь , что все изменения , которые вы запросили были сделаны
Вы должны также избавиться от управляющего терминала до приобретения нового. По словам человека , TTY-IOCTL:

   Controlling tty
       TIOCSCTTY int arg
              Make  the given tty the controlling tty of the calling process.  The calling process must be a session leader and not have a controlling tty already.  If
              this tty is already the controlling tty of a different session group then the ioctl fails with EPERM, unless the caller is root  and  arg  equals  1,  in
              which case the tty is stolen, and all processes that had it as controlling tty lose it.

       TIOCNOTTY void
              If  the  given tty was the controlling tty of the calling process, give up this controlling tty.  If the process was session leader, then send SIGHUP and
              SIGCONT to the foreground process group and all processes in the current session lose their controlling tty.
Ответил 11/06/2009 в 08:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more