LINUX.ORG.RU

*music on-hold* к сожалению, все телепаты сейчас заняты. примерное время ожидания 100500 лет.

теперь по делу. а ты уверен, что никто, кроме тебя этот порт уже не открыл? ;)

и, да, куски кода. ;)

aol ★★★★★
()

фрагмент лога strace.

10:49:18.889244 write(3, «\x7f\x03\xfd\x7f», 4) = -1 EIO (Input/output error)

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

> теперь по делу. а ты уверен, что никто, кроме тебя этот порт уже не открыл? ;)

Да на 100%, кроме меня там больше никого нет, плюс одновременное открытие порта несколькими приложениями никак не связвано с I/O Error

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

кстати, собери loopback на коленке, проверь порт!
или проволочкой прям соедини rx с tx-ом, и терминалом открой порт. всё, что ты фигачишь должно появляться на экране. при включенном локальном эхе оно должно появляться в двойном объёме.

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

у меня нет начала трассы, так как я подключился strace-om к запущенному приложению после того как начали проявлятся глюки.
следующий такой глюк может быть завтра а может и через неделю.

в текущем вот этот фрагмент чиклически повторяется без какой либо дополнительной инфы:

11:02:15.067359 write(3, «\x7f\x03\xfd\x7f», 4) = -1 EIO (Input/output error)
11:02:15.069021 select(4, [3], NULL, NULL, {0, 0}) = 1 (in [3], left {0, 0})
11:02:15.069255 read(3, "", 4096) = 0
11:02:15.090703 select(4, [3], NULL, NULL, {0, 0}) = 1 (in [3], left {0, 0})
11:02:15.090946 read(3, "", 4096) = 0
11:02:15.322704 select(4, [3], NULL, NULL, {0, 0}) = 1 (in [3], left {0, 0})
11:02:15.322939 read(3, "", 4096) = 0
11:02:15.340753 select(4, [3], NULL, NULL, {0, 0}) = 1 (in [3], left {0, 0})
11:02:15.340992 read(3, "", 4096) = 0
11:02:15.578350 select(4, [3], NULL, NULL, {0, 0}) = 1 (in [3], left {0, 0})
11:02:15.578585 read(3, "", 4096) = 0
11:02:15.591063 select(4, [3], NULL, NULL, {0, 0}) = 1 (in [3], left {0, 0})
11:02:15.591302 read(3, "", 4096) = 0

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

это будет корректно работать оччень долго. этот сбой появляется изредка при невыясненых обстоятельствах.

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

Например дивайс воткнутый в этот порт мог сбросить DCD - как раз лечится переоткрытием порта.

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

speed 57600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 0; time = 0; -parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

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

У меня включен CLOCAL - следственно DCD должен игнорироватся. или я чтото не так понимаю.

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

А какая связь между CLOCAL, IXON/IXOFF и DCD? Вы не путаете с DSR/CTS? Впрочем, вас еще в 1м сообщение просили показать код, а так это все гадания на кофейной гуще.

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

Согласно «Terminal Concepts in GNU/Linux», раздел «Special Files», последние два абзаца установка CLOCAL выключает реагирование операционки на DCD.

cvv ★★★★★
() автор топика
watcher_port_t*watcher_open_port(const char*devfile, speed_t speed)
{
    if(!devfile)
        return NULL;

    watcher_port_t*port=malloc(sizeof(watcher_port_t));

    port->speed = speed;
    port->fd = open(devfile, O_RDWR | O_NOCTTY);
    if (port->fd == -1) {
        free(port);
        return NULL; 
    }
    
    if(strlen(devfile)<sizeof(wcd_port_t))
        strcpy(port->name,devfile);
    else
    {
        strncpy(port->name,devfile,wcd_port_size-1);
        port->name[wcd_port_size-1]='\0';
    }

    if (tcgetattr(port->fd, &ti) < 0)
    {  
        free(port);
        return NULL;
    }

    cfmakeraw(&ti);
    cfsetispeed(&ti, speed);
    cfsetospeed(&ti, speed);

    //c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
    ti.c_iflag |= IGNBRK;//???возможно имеет смысл оставить этот флаг снятым а вместо него поднять BRKINT???
    ti.c_iflag |= IGNPAR;//Ignore framing errors and parity errors.
    ti.c_iflag &= ~(INPCK | PARMRK);
    ti.c_iflag &= ~(IXOFF | IXON | IXANY);    /* disable start/stop i/o flow control*/

    //c_oflag &= ~OPOST;

    ti.c_cflag &= ~(PARENB | PARODD);  /* no parity */
    ti.c_cflag &= ~CSTOPB;             /* 1 stop bit */
    ti.c_cflag &= ~CRTSCTS;            /* no i/o rts/cts flow control */
    ti.c_cflag |= CLOCAL;
    ti.c_cflag |= HUPCL;
    ti.c_cflag |= CREAD;

    //c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
    //Disable  flushing  the  input and output queues when generating the SIGINT, SIGQUIT and SIGSUSP signals. 
    //ti.c_lflag &= ~(NOFLSH);//???возможно потребуется установить/снять???

    ti.c_cc[VMIN] = 0;
    ti.c_cc[VTIME] = 0;

    if (tcsetattr(port->fd, TCSANOW, &ti) < 0)
    {
        free(port);
        return NULL;
    }

    if (-1==tcflush(port->fd, TCIOFLUSH))///<@todo:подумать на тему целесообразности закрытия порта
    {
        free(port);
        return NULL;
    }

    return port;
}
cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

Перепроверил на железе: активирование DCD не приводит к исследуемой ситуации

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

Посмотри в драйвере, почему вообще бывает EIO.

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