Я пишу простой эмулятор для последовательного устройства с использованием псевдотерминала (под Linux). Программа, которая пишет на последовательное устройство, пишет на ведомую сторону, в то время как эмулятор (эта программа) находится на главной стороне.
Я создаю обычную пару ведущий / ведомый с:
posix_openpt
grantpt
unlockpt
Затем я создаю мягкую ссылку в / tmp / emulator на любое имя ptsname. Небольшая проблема заключается в том, что когда ведомое устройство закрывается, select возвращает, а read () возвращает EIO. Что несколько раздражает, поэтому я сам открываю ptsname, чтобы предотвратить это (обычно я делаю то же самое с конвейерами).
Я использую tcsetattr, чтобы установить ICANON на главной стороне, поэтому я (должен) читать строку за раз. Протокол линейный.
Пока все хорошо. За исключением того, что это не работает, как ожидалось. Если отправить один байт на ведомую сторону PTY, select () возвращается и read () читает этот один байт. Это совсем не канонично! Он должен ждать до получения \ n!
Я протестирую реальный последовательный порт и Arduino, чтобы проверить, происходит ли это и там.