uStar
是 和芯星通
的专业 GNSS
上位机, 一般用于串口直连 GNSS
芯片调测芯片数据.
uStar
软件很强大, 但是只支持 NMEA
报文日志或串口作为输入, 终端的 GNSS
芯片串口没有暴露, 所以目前只能通过抓 NMEA
日志的方式回放数据.
最近定位的问题略多, 希望通过 uStar
软件实时分析芯片数据, 然后和系统的输出对比分析问题.
正好AP日志里面默认有打印 NMEA
数据, 想了想可以通过虚拟串口喂给 uStar
.
准备虚拟串口
虚拟串口可以使用大名鼎鼎的 VSPD
.
虚拟串口软件通过向系统添加一对串口设备的方式, 实现模拟物理设备. 可以理解为一条串口线缆, 都接到了同一台电脑, 一端发送一端就能收到数据.
其意义在于可以通过这样的方式向一些读写串口的程序进行测试.
安装软件
过程略.
创建虚拟设备
如图, 给 First port
和 Second port
分配一对串口名称, 注意不要和系统已经存在的设备重复, 然后 Add pair
就行了.
然后查看系统确认已经增加了一对串口设备.
过滤转发GNSS报文
这里通过一个 Python
脚本来实现, 环境 Python 3
, 需要 pyserial
支持, 注意其中的串口号请酌情修改:
#!/usr/bin/env python
# coding:utf-8
import re
import signal
import serial
import serial.tools.list_ports
import subprocess
def start_logcat():
global progress
progress = subprocess.Popen('adb logcat', stdout=subprocess.PIPE, encoding='utf8')
def stop_logcat():
global progress
progress.close()
def open_serial():
global uart
# port_list = serial.tools.list_ports.comports()
# port_select = port_list[0]
# serial_port = port_select.device
uart = serial.Serial("COM100", 115200)
def close_serial():
global uart
uart.close()
def start_forward():
global uart
global forward
forward = True
while forward:
try:
line = progress.stdout.readline()
except UnicodeDecodeError:
continue
match = re.match( r'^.*(\$(GP|GL|GA|BD|GB|GN).*)$', line, re.M|re.I)
if match:
gnss = match.group(1).replace(" ", "")
uart.write(bytes('%s\r\n' % (gnss), encoding='utf-8'))
print(gnss)
def stop_forward():
global forward
forward = False
def handler_signal(signal, frame):
stop_forward()
close_serial()
stop_logcat()
if __name__ == '__main__':
signal.signal(signal.SIGINT, handler_signal)
start_logcat()
open_serial()
start_forward()
执行这个 python
脚本, 自动开始读取 logcat
并过滤发送给虚拟串口.