代码之家  ›  专栏  ›  技术社区  ›  Colin

串行通信规范模式无阻塞nl检测

  •  1
  • Colin  · 技术社区  · 7 年前

    我正在通过串行端口将命令从Linux嵌入式设备发送到一些支持串行的固件。为了便于调试和简化,我们使用以换行符结尾的ascii可读命令。在这里使用规范模式是否合适,或者规范模式通常是为交互终端保留的?我在网上找到的例子都使用raw模式。

    特别是在规范模式下,如何在不阻塞的情况下检查整行是否可供读取。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Nima Mohammadi    7 年前

    根据Linux串行编程文档:

    这是终端的正常处理模式,但对于 与其他dl输入的通信以行为单位进行处理,这意味着 一个read将只返回一个完整的输入行。默认情况下是一行 以nl(ascii lf)、文件结尾或行尾字符结尾。一个 CR(DOS/Windows默认行尾)不会以 默认设置。

    规范输入处理还可以处理擦除、删除单词和 重印字符,将CR翻译成NL等。

    弗斯特

    对串行通信使用规范模式是最好的选择,因为我们在数据传输和系统处理程序上有linux内核支持,这将有助于更好地读取串行文本。

    第二

    如果要使用规范模式,请确保在发送数据的设备中使用正确的行尾字符,否则不能使用规范功能

        2
  •  1
  •   sawdust    7 年前

    在这里使用规范模式是否合适,或者规范模式通常是为交互终端保留的?

    是的,您可以使用规范模式,但是您需要根据您的情况配置termios接口。
    默认的termios配置是针对交互式终端的,因此应该禁用响应输入等功能。
    由于您的设备不太可能发送退格和删除字符,因此可以忽略这些功能。


    我在网上找到的例子都使用raw模式。

    似乎有一些“专家”不知道终端的规范模式存在。
    查看对的评论 reading from serial port in c breaks up lines 是的。

    有关(阻塞)规范模式的示例,请参见 this answer (注意,还有另一个“专家评论”告诉操作人员他看不懂台词)。


    特别是在规范模式下,如何在不阻塞的情况下检查整行是否可供读取。

    你可以用 选择() 是的。
    这个 男人 页表示支持对终端设备的规范读取:

    中列出的文件描述符 可读性 将被监视以查看字符是否可供读取(更准确地说, 查看读取是否不会阻塞 …)

    如果timeval结构的两个字段都为零,则 选择() 不会阻塞并立即返回。