Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как читать и записывать данные в последовательный порт с помощью потоков

Автор вопроса: tejendraОтветов: 2

Я создаю приложение для последовательного порта, в котором я создаю два потока: один - WRITER THREAD, который будет записывать данные в последовательный порт, и READER THREAD, который будет читать данные из последовательного порта. Я знаю, как открывать, настраивать, читать и записывать данные на последовательный порт, но как это сделать с помощью потоков.

Я использую LINUX (ubuntu) и пытаюсь открыть программирование порта ttyS0 на C.

cmultithreadingserial-port

Ответы

Ответ 1 · рейтинг 1 · Jonathan

Раньше я делал это так, чтобы настроить порт для асинхронного ввода-вывода с использованием VMIN 0 и VTIME, скажем, 5 децисекунд. Цель этого заключалась в том, чтобы позволить потоку заметить, когда пришло время для завершения работы приложения, поскольку он мог попытаться прочитать, время ожидания, проверить флаг выхода, а затем попытаться прочитать еще.

Вот пример функции чтения:

size_t myread(char *buf, size_t len) {
    size_t total = 0;
    while (len > 0) {
        ssize_t bytes = read(fd, buf, len);
        if (bytes == -1) {
            if (errno != EAGAIN && errno != EINTR) {
                // A real error, not something that trying again will fix
                if (total > 0) {
                    return total;
                }
                else {
                    return -1;
                }
            }
        }
        else if (bytes == 0) {
            // EOF
            return total;
        }
        else {
            total += bytes;
            buf += bytes;
            len -= bytes;
        }
    }

    return total;
}

Функция записи будет выглядеть так, как и следовало ожидать.

В функции настройки обязательно установите:

struct termios tios;
...
tios.c_cflag &= ~ICANON;
tios.c_cc[VMIN] = 0;
tios.c_cc[VTIME] = 5; // You may want to tweak this; 5 = 1/2 second, 10 = 1 second, ...
...

Ответ 2 · рейтинг 1 · SKi

Использование последовательного порта из 2 потоков просто, если только один поток читает, а другой только пишет.

Вы должны использовать один файловый дескриптор для последовательного порта.

Откройте и инициализируйте его в одном потоке, используя обычные функции open, tcsetattr и т. Д. Затем доставьте дескриптор файла другому потоку (ам).

Теперь поток чтения может использовать read() функцию, а писатель может использовать write() функцию без дополнительной синхронизации. Вы также можете использовать select() в обоих потоках.

Закрытие файлового дескриптора требует внимания, во избежание проблем вы должны делать это в одном потоке.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы