好吧,我几乎已经解决了这个问题,但陷入了最后一个障碍。我想我会展示我所做的事情,因为它可能会帮助别人。
I found 这另一篇文章关于堆栈溢出,列出了 3 种可能的方法来实现此目的。当 PPP(以我有限的经验)可以很好且轻松地处理这个问题时,我不想通过 AT 命令控制 gprs。 RPi 只有一个串行端口,因此我无法在多个串行接口上进行复用。
因此,我只能通过单个串行接口进行多路复用,希望 SIM900 支持此功能。我发现here使用GSM07.10标准的SIM900复用器的用户手册。
我找不到太多关于如何设置多路复用的信息,但最终在深入研究后我发现this有关 Linux 内核中 n_gsm 模块的文档。我只能大致理解它所说的内容,但不足以编写自己的程序来设置多个虚拟串行端口。
值得庆幸的是,经过更多的谷歌搜索,我发现这位非凡的绅士有创建了一个 C 程序使用n_gsm模块为我们设置虚拟串口。
我按照说明下载、配置和构建了程序,并尝试加载 n_gsm 模块。不幸的是,RPi 默认不包含 n_gsm 模块,因此我必须构建一个新内核,并将 n_gsm 添加为模块。我跟着操作说明RPi 网站上的内容非常好。
对于 SIM900,我必须更改第 322 行以删除&w
的末尾的AT+IPR
命令。它应该知道看起来像:
if (send_at_command(serial_fd, "AT+IPR=115200\r") == -1)
errx(EXIT_FAILURE, "AT+IPR=115200: bad response");
我还将第 128 行编辑为sleep(1.5)
在尝试读取响应之前,因为它有时会返回错误,因为它没有及时得到响应。
因此,我运行 cmux 程序(使用 sudo,因为它需要创建新的 /dev/ttyGSM* 设备),它通过 AT 命令运行,设置线路规则并创建新的虚拟串行设备,但是当我尝试打开串行设备时终端与screen /dev/ttyGSM1 115200
屏幕刚刚返回[screen is terminating]
.
I did sudo fuser /dev/ttyGSM1
它没有返回任何内容,因此没有其他进程正在使用它。
然后我尝试了echo AT > /dev/ttyGSM1
返回的-bash: /dev/ttyGSM1: Level 2 halted
.
我不确定这指的是什么,也找不到有关此消息的任何信息。难道是在谈论 OSI 模型的第 2 层(即数据链路层)吗?
无论如何,这就是我已经走了多远。我决定暂时把它放在一边,只使用 NTP,但我希望这对其他人有帮助。如果您确实找到了解决方案,或者可以提出一些我可能错过的建议,请说出来。谢谢