我正在通过串行端口将命令从Linux嵌入式设备发送到某些启用了串行的固件。为了方便调试和简化操作,我们使用了以换行符结尾的,人类可读的ascii命令。在这里使用规范模式是否合适,还是通常为交互式终端保留规范模式?我在网上找到的示例全部使用原始模式。
尤其是在规范模式下,如何在不阻塞的情况下检查整行是否可供读取。
答案 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()将不会阻塞并立即返回。