Serial port 有时串行写入操作会在初始化后阻塞

Serial port 有时串行写入操作会在初始化后阻塞,serial-port,embedded-linux,Serial Port,Embedded Linux,我有一个带2个串行端口的嵌入式linux机箱应用程序,它使用环绕电缆测试所有串行端口(只有Rx连接到Tx,没有其他引脚)。 第二个(非控制台)端口工作正常。 第一个(控制台)端口有时可以工作,但有时会做一些无法解释的事情。 为了测试第一个通道,我在打开它之前先停止运行“getty”。重生也是被禁止的。 然后,我做以下工作: system("killall getty"); Sleep(1000); if ((fd = open(Name, O_RDWR | O_NOCTT

我有一个带2个串行端口的嵌入式linux机箱应用程序,它使用环绕电缆测试所有串行端口(只有Rx连接到Tx,没有其他引脚)。 第二个(非控制台)端口工作正常。 第一个(控制台)端口有时可以工作,但有时会做一些无法解释的事情。 为了测试第一个通道,我在打开它之前先停止运行“getty”。重生也是被禁止的。 然后,我做以下工作:

    system("killall getty");
    Sleep(1000);
    if ((fd = open(Name, O_RDWR | O_NOCTTY | O_NONBLOCK)) <= 0)
    MsgFatal("Serial '%s' open error %d.", Name, errno);
    BRN = B115200;
    tcgetattr(fd, &Opts);
    cfsetispeed(&Opts, BRN);
    cfsetospeed(&Opts, BRN);
    cfmakeraw(&Opts);
    Opts.c_cflag |= PARENB;
    Opts.c_cflag |= PARODD;
    Opts.c_cflag &= ~CSTOPB;
    Opts.c_cflag &= ~CRTSCTS;    /* no HW flow control */
    Opts.c_cflag |= CLOCAL | CREAD;
    tcsetattr(fd,TCSANOW,&Opts));
system(“killall getty”);
睡眠(1000);

如果((fd=open(Name,O|RDWR | O|NOCTTY | O|unblock))首先,一个
getty
进程的死亡应该立即由其父进程
init
BusyBox
的一个方面获得并重新启动。所需的时间可能会有所不同,但通常相当快。但这不会影响对端口的写入


您如何知道写入被阻止?请显示该代码。

这似乎只是一个注释,而不是答案。谢谢,wallyk。我删除了inittab中的“respawn”。我还发现我无法在应用程序运行后登录。这还不够吗?关于阻止写入:我在写入操作周围放置了printf。还可以在调试器中运行应用程序(通过以太网进行远程调试)。同样,当所有测试都按预期运行时,也会出现一些无法避免的情况!我发送测试消息并将其正确读回数十分钟。但有些测试在第一次写入时就开始执行块。代码并不简单:写入(fd,test_STR,sizeof(test_STR));@leonp:tcsetr()之间发生了什么(在显示的代码末尾)和
write()
?是否有足够的延迟使更改的设置生效?是否有任何其他模式更改?@wallyk:我想-是的。有第二个ttyS1初始化,然后过一段时间,直到一切开始…我想大约50-100毫秒通过了…此外,当应用程序进入此状态时(写块)我在调试器下重新运行了几次,在“写”之前有一个断点,然后是一步-写,永远不会结束。使用
cfmakeraw()
并指定奇偶校验是非常不常规的(但这不会影响是否写块)。你说的“包线”可能是指环回吗
真的按照它的名字去做吗?这个例程来自哪个库(4页谷歌搜索结果什么都没有),还是你自己的代码?你应该检查所有系统调用的返回代码,比如
tcgetattr()
tcsetattr()
。谢谢。我在没有奇偶校验和偶数校验的情况下重新检查了两者-完全相同。顺便说一句,为什么它是非常规的?MsgFatal是我的日志程序,它打印消息并退出应用程序。我进行了返回码检查,但它始终为零。但现在我返回并重新检查了-所有返回都为零。奇偶校验检查将产生一个错误的假设ive表示2位错误。但奇偶校验错误实际上很少见;通常它只表示配置错误,而不是字符损坏。
cfmakeraw()
最常用于采用二进制协议的非文本数据。消息包通常使用数据包校验和进行验证,这更有可能检测错误。覆盖整个数据包的CRC32等强校验和可能导致奇偶校验多余。请注意,IEEE 802.3(以太网)帧不使用奇偶校验。随机成功或失败表明存在竞争条件,可能是
getty
释放串行端口。请尝试不带O_非块的
open()
,然后使用
fcntl()
获取并设置O_非块。请注意,Linux手册页提到了这一点“O_NONBLOCK标志表示希望打开,但不一定有读取或写入的意图。“我不知道这是否可以被视为一个答案,因此我把它作为一个评论,同时…我注意到,当从flash运行时,我的调试输出被馈送到ttyS0-逻辑!当从NFS和telnet/gdb运行时,情况并非如此,后者会阻止写入,但这显然是不正确的-我对自己说。然后插入fclose(stdout)转换为ttyS0初始化代码。从现在起,我既不能从flash也不能从NFS/telnet进行阻塞写入。因此,问题似乎得到了解决,尽管我不知道如何以及为什么。