这涉及在 Windows XP 下运行的 cygwin。我在这台机器上有一个真正的串行端口 (COM1)。
启动后,我编写的程序在尝试通过串行端口进行通信时会收到乱码响应。如果我运行超级终端并设置“波特”率,然后退出,此后一切都会正常工作。
我首先尝试从程序中设置速度(使用 termios 调用),但没有成功。因此,我决定尝试使用现有实用程序更改速度。可以使用类似 的命令stty -F /dev/ttyS0 9600
,如果我尝试不同的速度,我可以在用 检查时看到变化stty -F /dev/ttyS0
。但它对实际速度没有明显的影响。
我很难想象,如果 cygwin 不能改变比特率,我在搜索中找不到这样的语句。但我没有找到这样的语句。
我想可能是除了每秒位数之外的某些设置需要理顺。但我在返回的报告中没有看到任何表明这一点的内容。也许我会通过尝试发现它以什么速率出现来测试它。
编辑:我用示波器检查了一下,波特率(至少是输出)确实按照我的预期变为了 9600。因此,我现在要查看可能干扰通信的其他可能设置。
解决方案:有一件事对我帮助很大,那就是我发现每次拔掉 USB 虚拟串行端口时,它都会重新初始化。这样就无需重新启动主机来撤消 HyperTerminal 为修复问题所做的任何操作。这样我就能在短时间内进行许多测试。
stty -F /dev/ttyS0 -a
当我找到获取所有端口参数的命令时,解决方案就出现了。我在让 HyperTerminal “修复”问题之前和之后运行了它,将输出捕获到文件中,然后对结果使用 diff。结果: cs7
。这是每个字符中的位数。默认情况下,某些东西将串行端口初始化为 N-7-1。解决方案很简单:
stty -F /dev/ttyS0 9600 cs8
注意:最初的问题始于 termios 调用。相同的解决方案可以应用于那里。但这是 Stackoverflow 上要解决的问题。
答案1
使用此命令,
stty -F /dev/ttyS0
要得到全部端口设置。然后查看端口开始工作后发生了什么变化。