Go语言串口读取去除 及实现类似Python readline方法
在Go中处理串口读取的换行符与按行读取
刚上手Go做串口通信确实会遇到这类和Python不一样的细节问题,别担心,我给你拆解清楚这两个需求~
一、实现类似Python readline()的按行读取功能
在Go里,我们可以借助bufio包的缓冲阅读器来实现按行读取,和Python的readline()逻辑完全对应。首先你需要一个常用的串口库tarm/serial(可以通过go get github.com/tarm/serial安装),以下是完整的示例流程:
- 先配置并打开串口:
package main import ( "bufio" "fmt" "strings" "github.com/tarm/serial" ) func main() { // 配置串口参数,根据你的Arduino实际参数调整 cfg := &serial.Config{ Name: "/dev/ttyUSB0", // Windows下可能是"COM3"这类端口名 Baud: 9600, } // 打开串口 port, err := serial.OpenPort(cfg) if err != nil { fmt.Printf("打开串口失败: %v\n", err) return } defer port.Close() // 确保程序退出时自动关闭串口
- 创建缓冲阅读器,实现按行读取:
// 创建bufio阅读器,串口对象本身实现了io.Reader接口,可直接传入 reader := bufio.NewReader(port) // 循环读取每一行,逻辑和Python的while line := line.readline()一致 for { // ReadString('\n')会持续缓冲数据,直到遇到'\n'才返回整行,返回的字符串包含'\n'本身 line, err := reader.ReadString('\n') if err != nil { fmt.Printf("读取串口数据失败: %v\n", err) break } fmt.Printf("原始读取内容: %q\n", line) } }
bufio.NewReader的ReadString('\n')方法会帮你自动处理数据流的缓冲,完美实现按行读取的需求。
二、去除输出中的\r和\n字符
从你的示例输出"arduinoLED"}\r\n{"temperature"来看,Arduino输出的是Windows风格的换行(\r\n),我们有两种可靠的清理方式:
方法1:精准去除结尾的\r\n
如果确定每一行的结尾固定是\r\n,用strings.TrimSuffix()最精准,不会误删内容里的其他字符:
cleanLine := strings.TrimSuffix(line, "\r\n")
方法2:兼容多种换行格式并清理首尾空白
如果不确定换行符是\r\n还是单独的\n,或者想顺便去掉行首行尾的空格、制表符等空白字符,可以用strings.TrimSpace():
cleanLine := strings.TrimSpace(line)
把清理逻辑加到读取循环里,完整的处理代码如下:
for { line, err := reader.ReadString('\n') if err != nil { fmt.Printf("读取串口数据失败: %v\n", err) break } // 选择一种清理方式 cleanLine := strings.TrimSuffix(line, "\r\n") // 或者用:cleanLine := strings.TrimSpace(line) fmt.Printf("清理后内容: %q\n", cleanLine) }
这样处理后,你就能得到没有\r和\n的干净传感器数据了。
内容的提问来源于stack exchange,提问作者Melissa
相关产品推荐
相关产品推荐

