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

时间:2018-12-11 16:52:59

标签: serial-port serial-communication

我正在通过串行端口将命令从Linux嵌入式设备发送到某些启用了串行的固件。为了方便调试和简化操作,我们使用了以换行符结尾的,人类可读的ascii命令。在这里使用规范模式是否合适,还是通常为交互式终端保留规范模式?我在网上找到的示例全部使用原始模式。

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

2 个答案:

答案 0 :(得分:1)

根据Linux串行编程文档:

  

这是终端的正常处理模式,但对   与其他dl输入的通信以行为单位进行处理,这意味着   读取将仅返回整行输入。默认情况下有一行   以NL(ASCII LF),文件结尾或行尾字符终止。一种   CR(DOS / Windows默认行尾)不会以   默认设置。

     

规范输入处理还可以处理擦除,删除单词和   重印字符,将CR转换为NL等。

第一

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

第二

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

答案 1 :(得分:1)

  

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

是的,您可以使用规范模式,但是您需要根据情况配置termios界面。
termios的默认配置是用于交互式终端的,因此应禁用诸如回显输入之类的功能。
由于您的设备不太可能发送退格键和删除字符,因此可以忽略此类功能。


  

我在网上找到的示例全部使用原始模式。

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

有关(阻止)规范模式的示例,请参见this answer(请注意,还有另一条“专家评论”告诉OP他无法读取行)。


  

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

您可以使用 select()
man 页面表示支持终端设备的规范阅读:

  

将监视 readfds 中列出的文件描述符,以查看字符是否可用于读取(更准确地说, 以查看读取是否会阻塞 < / strong> ...)

当timeval结构的两个字段均为零时, select()将不会阻塞并立即返回。