Не может прочитать данные с терминала, пока не будет перезапущен другим процессом - PullRequest
0 голосов
/ 22 апреля 2020

Перед добавлением опции O_NOCTTY мой процесс был убит один раз неизвестным при каждой загрузке. Я не знаю, почему процесс был убит :( и я подумал, что у инициализации есть некоторые проблемы. , поэтому я добавил опцию O_NOCTTY, и процесс не был убит. Но он не может прочитать данные из буфера, пока перезапущен другим процессом. Пожалуйста, помогите мне :( Ниже приведен код инициализации и чтения.

void Init() {
    mFd = open("/dev/ttyS2", O_RDWR | O_NOCTTY);

    if (mFd > 0)
    {
        (void)tcgetattr(mFd, &mTermios_p);
        speed = B115200;
        mTermios_p.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
        mTermios_p.c_oflag &= ~OPOST;
        mTermios_p.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
        mTermios_p.c_cflag &= ~(CSIZE | PARENB);
        mTermios_p.c_cflag |= CS8;
        mTermios_p.c_cc[VMIN] = 0U;
        mTermios_p.c_cc[VTIME] = 0U;
        (void)cfsetispeed(&mTermios_p, speed);
        (void)cfsetospeed(&mTermios_p, speed);
        (void)tcflush(mFd, TCIOFLUSH);
        (void)tcsetattr(mFd, TCSANOW, &mTermios_p);
    }
    else
    {
        LOGE("uart open failed %s", strerror(errno));
    }
}
int32_t Read() {
    int32_t bytes = -1;
    if (mFd > 0)
    {
        (void)pthread_mutex_lock(&mMutexLock);
        bytes = static_cast<int32_t>(read(mFd, buf, nMaxRead));
        (void)pthread_mutex_unlock(&mMutexLock);
    }

    if (bytes < 0)
    {
        LOGE("read failed");
    }

    return bytes;
}

1 Ответ

1 голос
/ 23 апреля 2020

Инициализация вашего последовательного терминала практически эквивалентна cfmakeraw () плюс установка скорости передачи.
Однако этого недостаточно для полной инициализации последовательного терминала.

По крайней мере, приемник также должен быть включен:

mTermios_p.c_cflag |= CREAD;

Чтобы устранить любые проблемы рукопожатия модема (особенно когда модема нет):

mTermios_p.c_cflag |= CLOCAL;

Чтобы устранить любые проблемы аппаратного рукопожатия:

mTermios_p.c_cflag &= ~CRTSCTS;

BTW

    mTermios_p.c_cc[VMIN] = 0U;
    mTermios_p.c_cc[VTIME] = 0U;

Установка обоих VMIN и VTIME на ноль равна необдуманная конфигурация.
В этом руководстве эта конфигурация описывается как конфигурация, которую следует использовать только в том случае, если «вы действительно, действительно знаете, что делаете».
Код, который вы опубликовали для чтения, не способен (эффективно) обрабатывать последствия установки на ноль VMIN и VTIME . Если ваша программа не синхронизирована с передающей программой, ваш код чтения, скорее всего, «успешно» прочитает ноль байтов, т.е. не будет данных.

...