LINUX.ORG.RU

Эмуляция сом-порта из юзерспейса

 , ,


0

1

Возможно ли из юзерспейса эмулировать /dev/ttyUSB0? Нарыл на счёт pty, но не понял как юзать это в одним bi-directional пайпом. Если откинуть проблемы установки параметров termios, то можно предположить, что mkfifo и делов. А не тут то было, фифа uni-directional, и то, что только что записал, можно на том-же конце и вычитать. Что создаёт некие проблемы. Собственно вопросы - как и каким способом?

★★★
Ответ на: комментарий от anonymous

в частности да, сокат ковырял. Но коим образом? Я так понял, сия утилита умеет создавать порт(интересно как) и перенаправлять его либо в сеть, либо в пайп. Но как мне это поможет? Прокидывать по сети, и юзать сокеты?

// нужно эмулировать одну девайсину, для отладки

vova7890 ★★★
() автор топика

оказалось всё тривиально просто, днём думать нельзя, определённо... Оставлю тут кусок кода.

int use_pty(const char *link_to)
{
    char ptyname[512];
    int ttyfd = -1;
    
    int ptyfd = open("/dev/ptmx", O_RDWR | O_NOCTTY, 0620);
    if( ptyfd < 0 ) {
	fprintf(stderr, "Can't open /dev/ptmx\n");
	return -1;
    }
    
    if( grantpt(ptyfd) ) {
	fprintf(stderr, "Failed to grantpt: %s\n", strerror(errno));
	close(ptyfd);
	return -1;
    }
    
    if( unlockpt(ptyfd) ) {
	fprintf(stderr, "Failed to unlockpt: %s\n", strerror(errno));
	close(ptyfd);
	return -1;
    }

    if( openpty(&ptyfd, &ttyfd, ptyname, NULL, NULL) ) {
	fprintf(stderr, "Failed to open pty device: %s\n", strerror(errno));
	close(ptyfd);
	return -1;
    }
    
    printf("ptyname: %s\n", ptyname);
    
    unlink(link_to);
    
    if( symlink(ptyname, link_to) ) {
	fprintf(stderr, "symlink '%s' -> '%s' failed: %s\n", ptyname, link_to, strerror(errno));
    } else {
	printf("pty linked to '%s'\n", link_to);
	chmod(link_to, 0777);
    }
    
    return ptyfd;
}
vova7890 ★★★
() автор топика
Последнее исправление: vova7890 (всего исправлений: 1)
Ответ на: комментарий от vova7890

Вот моя тема: socat без рута... Тупо открываю один из портов основной программой. А второй программой - эмулирую некое устройство, как будто оно есть, открыв другой порт этой связки точка-точка. При замене на реальный ttyUSB если эмуляция хорошо повторяет поведение устройства - всё продолжает работать.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
#!/bin/sh

case "$1" in
        run)
                sudo socat PTY,link=/dev/ttyO5,raw,echo=0,crnl PTY,link=/dev/ttyO6,raw,echo=0,crnl
        ;;
        chown)
                sudo chown 1000:100 /dev/ttyO{5,6}
        ;;
        kill)
                sudo killall socat
        ;;
        *)
                echo "hohoho"
        ;;
esac
exit 0;
dhampire ★★★
()
Ответ на: комментарий от vova7890

Ну и как твоя заглушка будет работать, если ioctl постоянно с ошибкой вываливаться будет? А если ioctl выдает ошибку, то и настраивающая порт программа выпадет в осадок.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

он в принципе понимает иоктлы, те которые он не умеет - игнорит или фековые значения даёт. В частности настройка порта работает, больше не нужно.

vova7890 ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

не сокат я начал использовать, а pseudoterminal аки pty.

vova7890 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.