使用Advanced Navigation Spatial FOG Dual USB GPS接收器为NVIDIA Jetson设置系统时钟失败求助
我来帮你排查这个时钟设置失败的问题,咱们一步步分析可能的原因和对应的解决办法:
权限问题是首要排查点:设置系统时钟需要root权限,如果你用普通用户运行脚本,
date -s命令会默默失败。解决办法:要么用sudo执行整个脚本(比如sudo ./your_script.sh),要么在脚本里的date -s前加上sudo。确认GPS设备路径是否正确:脚本里写的
/dev/ttyUSB0不一定是你的GPS接收器实际挂载的路径。你可以运行ls /dev/ttyUSB*看看当前有哪些USB串口设备,或者用dmesg | grep USB查看设备连接时的日志,找到正确的设备名(比如可能是ttyUSB1)。给GPS足够的信号获取时间:原脚本里只等了2秒,GPS接收器可能还没完成搜星和时间同步,导致
gpspipe拿不到有效的时间数据。建议把sleep 2改成sleep 10甚至更长,给设备足够时间锁定卫星信号。验证gpspipe的输出有效性:手动在终端运行
gpspipe -w | head -20 | grep TPV,看看输出里有没有包含"time"字段的有效数据。如果没有输出,说明gpsd没正确连接到设备,或者GPS信号弱。处理时间格式的兼容性:GPS输出的时间是UTC格式,用
date -u -s "$GPSDATE"来设置时钟会更准确,避免时区导致的误差。
另外,我给你修改了原脚本,增加了错误检查和权限验证,这样更容易定位问题:
#!/bin/bash # 检查是否以root身份运行 if [ "$(id -u)" -ne 0 ]; then echo "请使用root权限运行此脚本(sudo ./script.sh)" exit 1 fi # 停止相关服务 pkill ntpd pkill gpsd # 等待服务完全停止 sleep 2 # 定义GPS设备路径,先确认设备存在 GPS_DEVICE="/dev/ttyUSB0" if [ ! -c "$GPS_DEVICE" ]; then echo "错误:未找到设备 $GPS_DEVICE,请检查USB连接和设备路径" exit 1 fi gpsd "$GPS_DEVICE" # 延长等待时间,确保GPS获取到有效时间 sleep 10 # 获取GPS时间,只取第一条有效TPV数据 GPSDATE=$(gpspipe -w | grep -m 1 TPV | sed -r 's/.*"time":"([^"]*)".*/\1/') if [ -z "$GPSDATE" ]; then echo "错误:未能从GPS获取时间,请检查GPS信号强度和设备连接" exit 1 fi echo "获取到的GPS UTC时间:$GPSDATE" # 使用UTC时间设置系统时钟 date -u -s "$GPSDATE" # 可选:重新启动ntpd服务(如果需要保持后续同步) # /usr/sbin/ntpd echo "系统时钟已成功更新为GPS时间"
最后还有个小细节:确保你的用户账号在dialout组里,这样不需要root也能访问串口设备。可以运行sudo usermod -aG dialout $USER,然后注销重新登录生效。
备注:内容来源于stack exchange,提问作者gabriel92

