技术问询:如何用Golang读取树莓派串口GPS设备
嘿,我来帮你实现用Golang读取树莓派上GPS串口数据的功能!你已经能用Shell命令拿到规范的NMEA输出了,用Go来实现其实很直观。
使用Golang读取树莓派GPS串口数据
首先,你需要用到Go生态里最常用的串口操作库github.com/tarm/serial,先通过下面的命令安装它:
go get github.com/tarm/serial
完整代码示例
下面的代码完全对应你Shell命令里的串口配置(/dev/ttyAMA0、9600波特率、raw模式、8位数据位等),可以直接运行读取GPS输出:
package main import ( "bufio" "fmt" "log" "github.com/tarm/serial" ) func main() { // 配置串口参数,和你Shell命令里的stty设置一一对应 serialConfig := &serial.Config{ Name: "/dev/ttyAMA0", Baud: 9600, Size: 8, // 对应cs8(8位数据位) Parity: serial.ParityNone, // 无校验位 StopBits: serial.Stop1, // 对应-cstopb(1位停止位) ReadTimeout: 0, // 持续读取,不设置超时 } // 打开串口连接 port, err := serial.OpenPort(serialConfig) if err != nil { log.Fatalf("打开串口失败: %v", err) } defer port.Close() // 程序退出前自动关闭串口 // 用bufio.Scanner逐行读取NMEA数据(GPS输出是每行一条标准NMEA语句) scanner := bufio.NewScanner(port) for scanner.Scan() { nmeaLine := scanner.Text() fmt.Println(nmeaLine) // 这里可以添加你自己的业务逻辑,比如解析NMEA语句里的经纬度、时间等信息 } // 检查读取过程中是否出现错误 if err := scanner.Err(); err != nil { log.Fatalf("读取串口数据出错: %v", err) } }
关键参数说明
Name: "/dev/ttyAMA0":指定GPS设备连接的串口路径,和你Shell命令里的目标设备一致Baud: 9600:串口波特率,匹配GPS模块的默认输出速率Size: 8:对应stty命令里的cs8,表示8位数据位StopBits: serial.Stop1:对应stty命令里的-cstopb,表示使用1位停止位(清除2位停止位的设置)ReadTimeout: 0:设置为0表示持续监听串口数据,不会因为超时停止读取,适合GPS这种持续输出的设备
额外实用提示
- 权限问题处理:如果运行时提示无法访问
/dev/ttyAMA0,可以把当前用户加入dialout组获取串口访问权限:
sudo usermod -aG dialout $USER
修改后重新登录系统即可生效。
- NMEA数据解析:如果需要把原始的NMEA字符串转换成结构化的经纬度、时间等数据,可以使用专门的解析库
github.com/adrianmo/go-nmea,示例代码如下:
import "github.com/adrianmo/go-nmea" // 在读取到nmeaLine之后添加解析逻辑 msg, err := nmea.Parse(nmeaLine) if err != nil { log.Printf("解析NMEA语句失败: %v", err) return } // 解析$GNRMC语句示例 if rmcMsg, ok := msg.(nmea.RMC); ok { fmt.Printf("当前纬度: %v, 经度: %v, 时间: %v\n", rmcMsg.Latitude, rmcMsg.Longitude, rmcMsg.Time) }
内容的提问来源于stack exchange,提问作者joedborg
相关产品推荐
相关产品推荐

