虽然工作量不大,但不知道为什么网络上的其他文章对我而言统统不管用,只好摸索出一条自己的实现道路
1.sudo nano /boot/firmware/config.txt
在底部加入如下代码
dtparam=spi=on
dtoverlay=pi3-disable-bt
core_freq=250
enable_uart=1
force_turbo=1
ctrl+x保存退出
2.sudo nano /boot/firmware/cmdline.txt
先把原来的文件内容备份桌面防止以后要用
然后粘贴以下代码替代原来的文件内容
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
3.ls -s /dev/tty*
查询我们现在的串口映射关系,看看serial0对应的是ttyS0还是ttyAMA0
笔者用的是ttyS0,于是依次在命令行窗口输入以下指令
sudo systemctl stop serial-getty@ttys0.service
sudo systemctl disable serial-getty@ttys0.service
如果朋友们用的是AMA0那么就把S0改成AMA0就好了
然后输入以下指令:
sudo systemctl enable serial-getty@ttys0.service
4.sudo apt-get install minicom
5.sudo cat /dev/ttyAMA0
6.若串口cat数据接受无误则继续下一步,编写python代码解析nmea2格式的数据
import serial
def parse_loc_val(val, d):
v = float(val) / 100
v = int(v) + (v - int(v)) * 100 / 60
if d == 'S' or d == 'W':
v = -v
return v
def parse_gprmc(data):
li = data.decode().replace('$GPRMC,', '').strip().split(',')
lat = log = speed = direct = None
if li[1] == 'A':
if li[2] and li[3]:
lat = parse_loc_val(li[2], li[3])
if li[4] and li[5]:
log = parse_loc_val(li[4], li[5])
if li[6]:
speed = float(li[6]) * 1.852
if li[7]:
direct = float(li[7])
return lat, log, speed, direct
def read_serial_data(port, baudrate):
ser = serial.Serial(port, baudrate)
while True:
if ser.in_waiting > 0:
data = ser.readline()
lat, lon, speed, direction = parse_gprmc(data)
if lat is not None and lon is not None:
if lat > 1 and lon > 1:
print("Latitude:", lat)
print("Longitude:", lon)
print("Speed:", speed)
print("Direction:", direction)
ser.close()
# 调用函数并指定串口和波特率
read_serial_data('/dev/ttyS0', 9600)
最后输出得到的值应该就是我们的经纬度
下一步我们将利用requests库和flask技术完成第三方服务器接受数据并完成实时位置的传送与可视化