Go语言 serial串口自动成帧
2020-09-14 本文已影响0人
阿巴砝特
引言:
上一篇提到当用"github.com/tarm/seria"库,编写go 的serial程序时。我们用Read方法读取串口数据,对方一个帧发出的数据,我们通常得到多个帧。无法满足实际的需求。一直在尝试寻找解决方案,最终通过数据拼接的方式算实现了。
思路:
串口配置参数加入ReadTimeout,改成非阻塞式。
超时无数据,Read会产生错误EOF错误
EOF错误出现之前的数据进行append在一个buff里面
当出现EOF,将buff的数据取出返回,并清空。返回的数据就一个完整的帧了!
代码如下:
package main
import (
"github.com/tarm/serial"
"io"
"log"
"time"
)
func main() {
//设置串口编号
ser := &serial.Config{Name: "COM2", Baud: 9600, ReadTimeout: time.Millisecond * 10}
//打开串口
conn, err := serial.OpenPort(ser)
if err != nil {
log.Fatal(err)
}
//启动一个协程循环发送
go func() {
for {
revData := []byte("123456")
_, err := conn.Write(revData)
if err != nil {
log.Println(err)
continue
}
log.Printf("Tx:%x \n", revData)
time.Sleep(time.Second)
}
}()
//保持数据持续接收
for {
var buf []byte
for {
b := make([]byte, 1024)
lens, err := conn.Read(b)
if err != nil {
switch err {
case io.EOF:
if buf != nil {
log.Printf("Rx:%x \n", buf)
buf = nil
break
}
default:
log.Println(err)
buf = nil
break
}
}
buf = append(buf, b[:lens]...)
}
}
}