Я создаю приложение для последовательного порта, в котором я создаю два потока: один - WRITER THREAD, который будет записывать данные в последовательный порт, и READER THREAD, который будет читать данные из последовательного порта. Я знаю, как открывать, настраивать, читать и записывать данные на последовательный порт, но как это сделать с помощью потоков.
Я использую LINUX (ubuntu) и пытаюсь открыть программирование порта ttyS0 на C.
Ответ 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() в обоих потоках.
Закрытие файлового дескриптора требует внимания, во избежание проблем вы должны делать это в одном потоке.