Почему rx не получает данные из loopback tx по UART? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть система , работающая под управлением Linux, подключившая rx к tx (loopback) из UART1 и выполнив этот код:

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

int main(void) {
    int iFd = open("/dev/ttyTHS0", O_RDWR);
    if (iFd < 0) {
        fprintf(stdout, "Error when opening file.\n");
        return -1;
    }

    while (1) {
        if (write(iFd, "A", strlen("A")) == -1) {
            fprintf(stdout, "Failed to write\n");
            return -1;
        }

        char buff[10] = {
            0
        };

        if (read(iFd, buff, sizeof(buff)) < 0) {
            fprintf(stdout, "Failed to read.\n");
            return -1;
        }

        fprintf(stdout, "read: %s\n", buff);

    }
    close(iFd);

    return 0;
}

Дело в том, что это не похоже наполучить любые данные.Код просто блокируется на read.Я могу видеть данные, передаваемые по линии TX, когда смотрю на нее с помощью осциллографа, но RX ничего не получает.Я также попытался разделить этот код на 2 процесса: один процесс для передачи и другой для приема, но это тоже не работает.

1 Ответ

1 голос
/ 22 апреля 2019

Это логично. Вы, вероятно, ничего не отправляете, так как он находится в буфере отправки. Другая проблема в том, что вы пытаетесь получить 10 байтов, но отправляете только один. Во многих системах последовательные тайм-ауты установлены на бесконечное время, и вы будете ждать вечно следующие 9 байтов.

что делать (пункт 2 имеет несколько вариантов):

  1. очистить файл UART

2a. читать только столько байтов, сколько вы отправили ioctl(ifd, FIONREAD, &bytes_ready_to_read);, а затем читать только доступное число.

2в. изменить время ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...