Прочитать 0 байтов после записи в / dev / ttyS0 - PullRequest
1 голос
/ 24 октября 2019

Я пытался установить последовательную связь с Linux через устройства / dev / ttyS, но когда я пытаюсь прочитать их после записи, я не читаю данные.

У меня есть следующий код

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>

int main() {
    printf("hello world\n");
    int n;
    int fd;
    char c;
    int bytes;

    char buffer[10];
    char *bufptr;
    int nbytes;
    int tries;
    int x;
    struct termios options;

    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
    if(fd == -1) {
        perror("open_port: Unable to open:");
    } else

    tcgetattr(fd, &options);

    // Set the baudrate, same speed for both I/O
    cfsetispeed(&options, B150);
    cfsetospeed(&options, B150);

    // Enable reading
    options.c_cflag |= (CLOCAL | CREAD);

    // Set 'RAW' mode
    cfmakeraw(&options);

    // Set byte size
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;

    // Set parity
    // options.c_cflag &= ~PARENB;
    options.c_cflag |= PARENB;
    options.c_cflag |= PARODD;
    options.c_cflag &= ~CSTOPB;

    // Set StopBits, @Linux no OneHalf is supproted, so OneHalf and Two are the same
    options.c_cflag &= ~CSTOPB;

    // Set Handshake options
    // options.c_iflag |= CRTSCTS;
    // options.c_iflag &= ~CRTSCTS;
    // options.c_cflag &= ~( IXON | IXOFF | IXANY );
    options.c_cflag |= IXON | IXOFF | IXANY;

    // Set Timeouts 
    options.c_cc[VMIN] = 0; // read() will return after receiving  character
    options.c_cc[VTIME] = 10; // == 0 - infinite timeout, != 0 - sets timeout in deciseconds

    tcsetattr(fd, TCSANOW, &options);
    tcflush(fd, TCIOFLUSH);

    bytes = write(fd, "ATZ\r",4);
    printf(" wrote %d bytes\n", bytes);
    bufptr = buffer;

    bytes = read(fd, bufptr, sizeof(buffer));
    printf("number of bytes read is %d\n", bytes);
    perror ("read error:");

    for (x = 0; x < 10 ; x++) {
        c = buffer[x];
        printf("%d  ",c);
    }

    tcflush(fd, TCIOFLUSH);
    close(fd);
    printf("\n");
    return (0);
}

Вывод программы следующий:

hello world
 wrote 4 bytes
number of bytes read is 0
read error:: Success
0  0  0  0  0  0  0  0  0  0

Хотя я ожидал, что он прочитает 4 символа, которые я только что написал, похоже, что чтение читает 0 байтов. В случае, если я поставлю VTIME на 0, тогда читаю блоки навсегда. Я пытался сделать echo /dev/ttyS0, но ничего не выходит. Любая идея, что может вызвать это и как это можно исправить?

1 Ответ

0 голосов
/ 26 октября 2019

Ваш код, видимо, в порядке, за исключением следующих фактов:

  • Вы звоните perror("read error"); после звонка printf(3), а не сразу после read(2) таким образом, возможная ошибка (если произошла) маскируется вызовом read(2) вызовом printf(3). Если вы хотите напечатать количество прочитанных символов, сохраните значение errno и возвращаемое значение из read(2) перед вызовом printf(3), а затем, если возвращаемая ошибка - neg, вызовите perror(3).

  • В любом случае. c_cc[VTIME] = 10 налагает тайм-аут на одну секунду , и это слишком сортировка для сброса модема. Настройки вашей линии:

    CS8, Parity ODD, one STOP bit, and 150 baudrate
    

    Обычно модемы отвечают на ATZ\r команду после сброса , что занимает некоторое время (часто более секунды) и по умолчаниюскорость модема (потому что вы его сбросили) и не со скоростью, с которой вы посылаете команду AT.

    По этой причине сброс модемакак обычно вслепую, и затем вы отправляете простую команду AT\r, чтобы запросить ответ \r\nOK\r\n. Ответ на команду AT\r обычно является немедленным, а не ответом на команду сброса, и позволяет модему регулировать свои параметры связи в соответствии с полученными символами.

    Модемы всегда адаптируют свою скорость, когда Aи T последовательность получена путем выборки прямоугольных импульсов, полученных с высокой частотой дискретизации, затем они переключают скорость на обнаруженную и обычно выполняют преобразование скорости (что позволяет говорить с модемом с другой скоростью, чем согласованная дистанционно)

...