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

Terminal 在其他进程重新启动之前,无法从终端读取数据,terminal,uart,termios,Terminal,Uart,Termios,在添加O_NOCTTY选项之前,我的进程在每次启动时都会被unknown终止一次。我不知道进程被终止的原因:(并且我认为初始化有一些问题。因此我添加了O_NOCTTY选项,进程没有被终止。但是在其他进程重新启动之前,它无法从缓冲区读取任何数据。请帮助我:( 下面是关于初始化和读取的代码 void Init() { mFd = open("/dev/ttyS2", O_RDWR | O_NOCTTY); if (mFd > 0) { (void)tc

在添加
O_NOCTTY
选项之前,我的进程在每次启动时都会被unknown终止一次。我不知道进程被终止的原因:(并且我认为初始化有一些问题。因此我添加了
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\u t Read(){
int32_t字节=-1;
如果(mFd>0)
{
(void)pthread_mutex_lock(&mMutexLock);
字节=静态_转换(读取(mFd、buf、nMaxRead));
(void)pthread_mutex_unlock(&mMutexLock);
}
如果(字节<0)
{
LOGE(“读取失败”);
}
返回字节;
}

串行终端初始化基本上相当于cfmakeraw()加上波特率设置。
但是,这不足以完全初始化串行终端

至少还必须启用接收器:

mTermios_p.c_cflag |= CREAD;
要消除任何调制解调器握手问题(尤其是在没有调制解调器时):

要消除任何硬件握手问题,请执行以下操作:

mTermios_p.c_cflag &= ~CRTSCTS;

顺便说一句

VMINVTIME设置为零是一种不明智的配置。
将此配置描述为仅当“您真的、真的知道自己在做什么”时才应使用的配置。

您为读取而发布的代码无法(有效)处理将VMINVTIME设置为零的后果。除非您的程序与传输程序同步,否则读取的代码可能会“成功”读取零字节,即无数据。

我想知道以下两种设置之间存在哪些差异。1.
mFd=open(…,…,O|u NONBLOCK)…mTermios_p.c_cc[VMIN]=1U
2.
d=open(…,…)…mTermios_p.c_cc[VMIN]=0U
这两种设置都是在非阻塞模式下运行的???@John可以返回不同的代码,例如-1,errno=EAGAIN与0。请参阅,谢谢您的回答。顺便说一下,正如我在原始问题中提到的,在添加
O_NOCTTY
标志后,进程无法通过uart读取任何内容,并且在被其他进程杀死一次后运行良好。我不知道应该首先在哪里调试。@John--您有过吗提供了有关所涉及流程的零详细信息。流程通常不会相互交互或干扰。您以某种方式创建了流程之间的依赖关系。您没有发布本网站预期的最小可复制示例。显然,您的代码大量使用了全局变量,并且未解释地使用了互斥锁。我不会猜测如何调试这些未知项。您发布了termios初始化,我指出它不完整。您发布了一些读取代码,我指出了它的局限性。我已经为您的读取问题提供了termios方面的解决方案。处理间冲突海事组织是一个单独的问题。
mTermios_p.c_cflag |= CLOCAL;
mTermios_p.c_cflag &= ~CRTSCTS;
    mTermios_p.c_cc[VMIN] = 0U;
    mTermios_p.c_cc[VTIME] = 0U;