本文基于官方Raspbian的2018-03-13版。
之前买过一个A6 GSM模块,最近尝试装在树莓派3B下使用,折腾的够呛。网上资料有些是过时的,因此我决定抛砖引玉,供有兴趣的朋友们讨论。
由于一直搞不定这个模块接上USB转TTL后的使用(能识别出/dev/ttyUSB0,但是然后就没有然后。minicom调试根本没法进行。但在Windows + 各类串口调试工具都没问题),所以决定直接连接树莓派的IO。
之前了解到GSM模块可能在工作时消耗较大的功率导致树莓派重启,因此首先找了个某牛叉国产品牌手机的5V3A充电头以便向树莓派供电。然后将GSM模块的VCC接树莓派5V,GND接树莓派GND,u_RX、u_TX接树莓派TX、RX(PIN8、PIN10)。
然后树莓派3B的串口就是一个坑。网上查了一圈得知,3B有两个串口,一个稳定的硬件串口和一个相对不那么稳定的软件串口。下文提到的串口特指硬件串口。硬件串口有几种工作模式,并且只能选一。一种是默认的,分配给蓝牙使用;一种是用于在PC上通过串口进行console配置(类似在PC上用console线配置交换机等设备。这里树莓派相就当于交换机的地位),另一种就是本文关心的场景,与其它串口设备通信。
为了达到这个目的,需要做以下几个步骤:
1、运行命令行版的raspi-config:sudo raspi-config。选择Interfacing Options,然后选Serial。这时候它会问你要不要作为login shell,选“No”,然后继续问要不要作为一个硬件串口,选“Yes”。本质上,这步操作在/boot/config.txt里添加了一行 enable_uart=1,并且去掉 /boot/cmdline.txt中console0的配置。重启。
2、事情还不算完。我们用ls -l /dev/serial* 查看,会发现serial0给了ttyS0,serial1给了ttyAMA0。而我们的目标是要将serial0对应给ttyAMA0。为了达到这个目的,/boot/config.txt里还要加一句:dtoverlay=pi3-disable-bt。副作用就是彻底禁用蓝牙。重启。
3、彻底禁用串口的console登录功能。执行:
sudo systemctl stop [email protected]
sudo systemctl disable [email protected]
再次重启。起来后再次ls -l /dev/serial*,确认serial0已经给了ttyAMA0。
我选用了gammu作为短信发送工具。当然首先安装它:sudo apt-get install gammu
4、接下来的步骤有点意思,姑且称之为A6 GSM模块的开光仪式。
stty -F /dev/ttyAMA0 115200 (是的不需要sudo。如果报没有权限,很可能是console功能没关闭。请检查/boot/cmdline.txt、执行步骤3)
echo -e "at\n" > /dev/ttyAMA0 (不懂,必须要手动激活下模块才行?)
sudo gammu-config,端口写ttyAMA0,波特率选择at115200,其余默认。最后save一下。
sudo gammu --identify。应该返回GSM模块的信息。如果第一次执行报错没发现硬件,可以再来一次试试看。
5、开光仪式圆满完成后就可以发送短信了:
sudo gammu sendsms TEXT 对方手机号码 -text "英文内容"
如果需要中文支持,在手机号码后加一个参数:-unicode。
至此初步测试完成。但这样有一个严重问题:reboot没问题,直接运行发送短信的命令即可,但是如果halt再上电(即冷启动)之后,必须重新开光!哪怕gammu-config什么都不改,也得运行下。(突然想到,usb转ttl是否也需要开光的?找机会试一下。【确实如此】)
不管怎样,至少有了一种稳定的可持续的使用模式。回头把A6 GSM模块的电源独立出来再试试(应该需要共地)。
=============【确实如此】的分割线=============
相对来说GSM模块配上USB转TTL模块就简单多了。无需折腾串口设置,插上树莓派的USB口后用lsusb验证下转换硬件是否是被正确识别,以及ls /dev/ttyUSB*看看是否已被正确映射。然后开个光就能使用了。