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 并过滤发送给虚拟串口.
使用 uStar 解析
观察数据
