我有一个基于 Buildroot 的嵌入式系统,它使用 3G 调制解调器 (Cinterion PH8-P) 和 PPP 连接到互联网。 3G 调制解调器是一个 USB 设备,提供 4 个 ttyUSB 端口。其中一个用于 PPP,而另一个用于 GPS。
有时,3G 调制解调器会停止工作,需要重新启动。为此,我首先停止 PPP 和 GPSd 守护程序,然后重新启动调制解调器,然后再次重新启动守护程序。不幸的是,如果预先运行 PPP,它似乎会以某种方式影响串行端口,以便其他程序无法再使用它们。
例如,如果我在尚未运行 PPP 的新启动系统上运行以下命令:
cat /dev/ttyUSB3&
echo "AT" > /dev/ttyUSB3
我收到了预期的OK
AT 响应。如果我然后运行 PPP 一会儿(通过调用 pon),然后停止它(通过调用 poff),重新启动调制解调器并尝试再次发送相同的 AT 命令,终端似乎只是回显我发送到调制解调器的内容我没有得到OK
回应。结果,GPS 将无法工作,因为我停止从 GPS tty 端口接收 NMEA 消息。这几乎就像 PPP 正在配置所有串行端口以将其输出重定向到其他地方。尽管如此,在调制解调器重新启动后,PPP 完全没有问题 - 根据日志,聊天脚本愉快地发送其 AT 命令并获得预期的响应。
什么可能导致此问题?
答案1
事实证明,PPP是影响它自己的串行端口,并且由于这是用于配置 GPS 的串行端口,因此这就是导致问题的原因。
stty -F /dev/ttyUSB3
通过比较运行PPP前后的结果,很明显PPP是以原始模式配置串行端口的,这意味着我无法使用它来配置GPS端口。有趣的是,即使由于调制解调器重置而删除并重新创建 ttyUSBx 设备节点,这些设置仍然存在。
只需运行stty sane -F /dev/ttyUSB3
恢复到默认设置,我就可以毫无问题地配置 GPS 端口。