Значение нового символа строки в связи через последовательный порт

Мы тестируем связь через последовательный порт. На устройстве есть два tty-узла /dev/ttyUSB8 и /dev/ttyUSB9.

Когда я передаю буфер из /dev/ttyUSB8 в /dev/ttyUSB9, я не получаю данные о вызове чтения /dev/ttyUSB9, если буфер не содержит новой строки.

Передать код

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

void write_func()
{
    int fdw;
    int i;
    fdw = open("/dev/ttyUSB8", O_RDWR);
    printf("fdw : %d\n",fdw);

    printf("%ld\n", write(fdw, "Hello", 6));
    close(fdw);
}

int main()
{
    int i;
    write_func();
    return 0;
}

Получить код

void read_thread()
{

    int fdr;
    char buf[] = "NoData";

    fdr = open("/dev/ttyUSB9", O_RDWR);
    printf("fdr : %d\n",fdr);

    printf("%s: %ld\n", __func__, read(fdr, buf, 6));

    printf("%s\n", buf);
    close(fdr);
}

int main()
{
    int i;
    read_thread();
    return 0;
}

Я не получаю данные с помощью вышеуказанного вызова, но когда я добавляю '\n в вызов записи, я получаю данные в вызове блока чтения.

 printf("%ld\n", write(fdw, "Hello\n", 7));

Каково значение символа новой строки в этом..

Обновлять:

Я добавил код для сброса канонического режима, но это не сработало:

void write_thread()
{

    int fdw;
    int i;
    struct termios config;
    fdw = open("/dev/ttymib24", O_RDWR);
    printf("fdw : %d\n",fdw);
    tcgetattr(fdw, &config);
    config.c_lflag &= ~ICANON;
    tcsetattr(fdw, TCSANOW, &config);    
    printf("%ld\n", write(fdw, "Hello", 6));
    close(fdw);
}

person md.jamal    schedule 09.11.2018    source источник
comment
Возможно, tty буферизован. Пробовали прошивать после написания?   -  person Gerhardh    schedule 09.11.2018
comment
Чтобы разобраться в такого рода проблемах, важно проверить, не написан ли текст или не получен. Вы проверяли с помощью терминальной программы, отправляются ли данные или нет?   -  person Gerhardh    schedule 09.11.2018
comment
Проверено с котом и эхом, работает   -  person md.jamal    schedule 09.11.2018
comment
Что работает? Что именно ты сделал? Что-то вроде cat xyz> /dev/tty или что-то вроде cat < /dev/tty?   -  person Gerhardh    schedule 09.11.2018
comment
Кот /dev/ttyusb   -  person md.jamal    schedule 09.11.2018
comment
В чем разница между двумя вышеуказанными командами cat   -  person md.jamal    schedule 09.11.2018
comment
Давайте продолжим обсуждение в чате.   -  person Gerhardh    schedule 09.11.2018


Ответы (1)


Ваш tty, вероятно, находится в каноническом режиме.

Попробуйте сбросить ICANON с помощью tcsetattr(). Что-то вроде этого:

struct termios termiosv;
tcgetattr(fd, &termiosv);
termiosv.c_lflag &= ~ICANON;
tcsetattr(fd, TCSANOW, &termiosv);

Дополнительная информация на справочной странице termios:

   In canonical mode:

   * Input is made available line by line.  An input line is available
     when one of the line delimiters is typed (NL, EOL, EOL2; or EOF at
     the start of line).  Except in the case of EOF, the line delimiter
     is included in the buffer returned by read(2).
person SKi    schedule 09.11.2018
comment
@md.jamal Вы прочитали фрагмент страницы руководства? Ввод затронут. Вам нужно добавить его в ветку чтения. - person Gerhardh; 09.11.2018