Прочтите несколько байтов через последовательный порт

Я не могу прочитать байты 0x11 и 0x13 через последовательный порт. Источник:

    int fd; /* File descriptor for the port */
    fd = open(PORT_PATH, O_RDWR | O_NOCTTY);// ); | O_NDELAY
    if (fd == -1){//Could not open the port.
        fprintf(stderr, "open_port: Unable to open %s - %s\n", PORT_PATH, strerror(errno));
        return fd;
    }

    struct termios settings;
    tcgetattr(fd, &settings);
    cfsetispeed(&settings, B38400); // baud rate
    cfsetospeed(&settings, B38400); // baud rate
    settings.c_cflag &= ~PARENB; // no parity
    settings.c_cflag &= ~CSTOPB; // 1 stop bit
    settings.c_cflag &= ~CSIZE;
    settings.c_cflag &= ~CRTSCTS;
    settings.c_cflag |= (CS8 | CLOCAL | CREAD);
    settings.c_cc[VMIN] = 1;
    settings.c_cc[VTIME] = 0;
    tcflush(fd, TCIOFLUSH);
    tcsetattr(fd, TCSANOW, &settings);// apply the settings

    char data, rcv;
    data = 0x10;
    write(fd, &data, 1);
    read(fd, &rcv, 1);
    printf("rcv_data = 0x%02X\n", rcv);

    data = 0x12;
    write(fd, &data, 1);
    read(fd, &rcv, 1);
    printf("rcv_data = 0x%02X\n", rcv);

    data = 0x88;
    write(fd, &data, 1);
    read(fd, &rcv, 1);
    printf("rcv_data = 0x%02X\n", rcv);

    data = 0x13;
    write(fd, &data, 1);
    read(fd, &rcv, 1);
    printf("rcv_data = 0x%02X\n", rcv);

    data = 0x11;
    write(fd, &data, 1);
    read(fd, &rcv, 1);
    printf("rcv_data = 0x%02X\n", rcv);

    close(fd);

Tx и Rx связаны. В выходах консоли:

rcv_data = 0x10
rcv_data = 0x12
rcv_data = 0x88

И не более того. Невозможно получить переданный байт 0x13. На осциллографе я вижу переданный 0x13, но не могу понять, почему этот байт не принимается. То же самое с байтом 0x11. Остальные байты в порядке.


person vv_gulyaev    schedule 09.06.2014    source источник


Ответы (1)


0x11 и 0x13 - символы управления потоком XON / XOFF (Control-Q и Control-S). Вам нужно будет отключить управление потоком XON / XOFF, если вы хотите иметь возможность отправлять и получать эти символы, например

setting.c_iflag &= ~(IXOFF | IXON);
person Paul R    schedule 09.06.2014
comment
Рад, что это помогло - не забудьте проголосовать / принять ответы, если они вам полезны. - person Paul R; 09.06.2014