首页 > 解决方案 > 在被其他进程重新启动之前,无法从终端读取数据

问题描述

在添加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;
}

标签: terminaluarttermios

解决方案


您的串行终端初始化本质上几乎等同于cfmakeraw()加上设置波特率。
但是,这不足以完全初始化串行终端。

至少还必须启用接收器:

mTermios_p.c_cflag |= CREAD;

要消除任何调制解调器握手问题(尤其是在没有调制解调器时):

mTermios_p.c_cflag |= CLOCAL;

要消除任何硬件握手问题:

mTermios_p.c_cflag &= ~CRTSCTS;

顺便提一句

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

VMINVTIME都设置为零是不明智的配置。
本指南将此配置描述为仅在“您真的、真的知道自己在做什么”时才应使用的配置。
您发布以供阅读的代码无法(有效地)处理将VMINVTIME都设置为零的后果。除非您的程序与发送程序同步,否则您的读取代码可能会“成功”读取零字节,即没有数据。


推荐阅读