大数据

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]...)
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读