在其他进程重新启动之前无法从终端读取数据

Cannot read data from terminal until restarted by other process

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

您的串行终端初始化基本上相当于 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 都设置为零是不明智的配置。
This guide 将此配置描述为仅在 "you really, really know what you're doing."
时才应使用的配置 您为阅读而发布的代码无法(有效地)处理将 VMINVTIME 都设置为零的后果。除非您的程序与传输程序同步,否则您的读取代码很可能 "successfully" 读取零字节,即没有数据。