您的串行终端初始化使用不良编码实践。将termios结构清零不符合POSIX。
什么是Zeroing the termios结构?
只需在您的代码中搜索“zero”,您就会发现有问题的陈述:
bzero(&newtio, sizeof(newtio));
参考 正确设置终端模式 和 POSIX操作系统的串行编程指南 正确的初始化串行终端的方法。
此代码也用于几年前工作,因为在以前的研究中使用了遍历机制,最近它无法使用此代码。
这是代码编写不好的问题。它不可移植,可能无法在不同的系统或不同的日子工作。
问题来自于read函数,其中使用当前代码我无法读取来自RS232的任何值。
对于与注释或文本描述不匹配的代码,分析会受到一些阻碍。 但是代码的三个问题显而易见。
如前所述,串行终端初始化不符合POSIX。
日志表明您正在某些神秘输出例程和您发布以供审阅的输入例程之间循环。 每次执行输入例程都会执行 的 打开() 强> ,初始化和 的 关() 强> 串行终端上的序列。 据推测,输出例程(尚未发布)执行类似的操作 的 打开() 强> ,初始化和 的 关() 强> 串行终端上的序列。
串行终端的这种重复的打开,初始化和关闭顺序非常低效,并且通过适当的程序设计是完全不必要的。 这是第二个问题。
第三个问题是前一个问题的直接后果。 作为读取初始化的一部分,您可以显式丢弃可能位于接收缓冲区中的任何数据:
tcflush(fdi, TCIFLUSH);
你的后续 的 读() 强> (无论您如何配置VMIN和VTIME)只能返回刷新操作后收到的数据。 丢失到您的程序是串行终端未打开时和/或刷新操作之前收到的任何和所有数据。
如果您的程序在读取和写入时只打开并初始化串行终端一次,那么第三个问题就会消失。