po 主是苦逼码农一枚,软件工程师,做服务端方向,主要写 nodejs & golang 偶尔写点 python,所以这是一篇刚刚拥有第一个开发板的小白写的小白文,以上是背景
前段时间为了改善生活买了一块树莓派3,装了 debian 8 jessie。
1. 换清华的源:
sudo vi /etc/apt/sources.list
注释掉其他的源插入这两个:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main non-free contrib
同时注释掉下面这个文件里面的源,不然还是会优先读这个
sudo vi /etc/apt/sources.list.d/raspi.list
2. 使用 ssh-tunnel 做内网穿透 (远程控制自己家里的树莓派):
主要参照的是 这篇文章 ,大致思路如下
利用 ssh 反向隧道的方式,通过一台外网 vps 做跳板,远程直接通过 ssh 连接到放在 NAT 之后的树莓派
有两个奇妙的点
- 使用 autossh 保持 ssh 隧道,因为 ssh 会超时断开,所以用 autossh 来保持连接
- 实测发现 autossh 的 -f 后台模式有点问题,暂时通过 tmux 保证这个 autossh 持续运行,接下来准备做成系统服务开机启动
3. 连接 SIM 900
淘宝链接就不放了,不过就算做硬广应该也没人看见吧 (手动滑稽
大致思路如下
Raspberry pi 3 GPIO Pins 里面的 8/10 口连 SIM 900 的 TTL 接口,使用 minicom 监控 SIM 900 的输出,调试的时候可以直接向串口里面写 AT 指令
这是最坑的一个步骤,因为网上大部分的资料都是说的 pi 3 早期系统,或者直接就是 pi 2。
根!本!就!没!用!(来自小白浪费两天时间的咆哮
碰到的问题如下:
-
pi 3 集成了蓝牙,占据了主要的 uart 口,所以没法儿像 pi 2 一样直接使用 TTL 需要的 TXD & RXD。
-
网上大部分现有的文档,都是在教大家怎么禁用蓝牙模块,然后将 ttyAMA0 重新映射到 TXD & RXD 口上。
但是!我想用蓝牙啊!为啥我要放弃蓝牙!(其实是尝试了好几种方法都不成功万般无奈
-
有一种方法是将内核频率降低 core_freq=250,用来避免频率波动,从而顺利使用 uart1 接口,不过也是牺牲了一定的性能。
禁用蓝牙模块是有效的,推荐看 这篇文章 反正我是尝试失败了才推荐给大家的。
重头戏来了
看了这几篇之后 帖一 帖二 帖三 才有点明白 pi 3 里面 uart 接口的关系,主要是二、三,引用一段:
The Broadcom SOC's in all Pi's come with 2 serial ports, a full port and a mini port. Before the model 3, neither of theses were used internally, so the full port was routed out to the GPIO connector, and called ttyAMA0.
The Pi 3 requires a serial port to talk to it's Bluetooth device, and the Pi's engineers decided to use the full serial port to talk to the Bluetooth chip as it was more capable then the mini serial port, and so the mini serial port was brought out to the GPIO connector, and called ttyS0. This has caused a few problems.
The mini serial port's baud rate is hard wired to the GPU's clock, and so when the GPU's clock speed changed, the baud rate of ttyS0 changed as well. The Pi 3 adjusts it's clock frequencies as demand goes up and down, and with it, ttyS0's baud rate. This is probably what caused the scrambled data in your first post.
The first fix for this problem was to lock down the GPU's clock to a fixed frequency. This was done by adding the line: "core_freq=250" to 'config.txt'. This locks the baud rate of ttyS0, at the cost of a small decrease in the Pi's performance.
The second fix the Pi engineers came up with, was the problem of software backward compatibility with previous model Pi's. Any software written using ttyAMA0 would not work on a Pi 3B, as it calls it's port ttyS0. The second fix was to rename the serial ports on all models to 'serial0', and 'serial1'. On a Pi 3, ttyS0 is mapped to serial0, and on previous models ttyAMA0 is mapped to serial0. This means that software which refers to serial0 will work on all models.
Finally, the line "enable_uart=1" automatically locks the core frequency in a Pi 3, so "core_freq=250" is no longer required. Enabling the serial port in "Preferences" (raspi-config) will automatically add this line if required.
So, to summarize, to use the serial port on all model Pi's running an updated OS, add the line: "enable_uart=1" to '/boot/config.txt, and refer to the port as '/dev/serial0' in code. SystemD normally starts a terminal on this serial port which you are using but, if you don't want a terminal remove the section "console=serial0,115200" from '/boot/cmdline.txt'.
Using this procedure, Bluetooth works normally on the Pi 3.
简而言之就是:
pi 3 现在是有两个 uart 口的,主要的 uart 给了蓝牙模块,所以正常来说 ttyAMA0 也就是 serial1 是不推荐使用的。
推荐使用 pi 3 的 mini-uart,而且是可以不用手动降频使用的,因为新版本里面如果打开了 uart 口,其实是会锁定内核频率的。我们要连的还是 RXD TXD,只不过 pi 3 里面这两个口被映射到了 mini-uart (ttyS0 | serial0)。
在系统设置里面 enable serial port,或者把 enable_uart=1 加到 /boot/config.txt 里面,mini-uart 就可以正常访问了。
po 主直接把 minicom 的串口设为 '/dev/serial0' 也就是 mini-uart,波特率不变还是 115200 8N1,可以达到 pi 2 里面使用 ttyAMA0 类似的效果。
未完待续
- 接下来要完善 autossh 稳定内网穿透。
- 在 vps 上再搞一个隧道(开个口,文章的说法)做到可以远程直接连 vps 固定端口就转到了 pi 3 上,不用现在的这种先 ssh 到 vps 上,再 ssh 到 pi 3。
- 在 SIM 900 上搞点事情
有疑问加站长微信联系(非本文作者)