GO-serial

作者: Bug2Coder | 来源:发表于2020-05-24 20:01 被阅读0次

    GO串口通信实现

    1、包名称github.com/tarm/serial

    2、简单实现

    package main
    
    import (
        "fmt"
        "github.com/tarm/serial"
        "go/types"
        "log"
        "sync"
        "time"
    )
    
    type SerialManager struct {
        serialClient *serial.Port // 串口客户端
        SendCh       chan []byte  // 发送通道
        RecvCh       chan []byte  // 接收通道
    }
    
    //  构造函数
    func NewSerial(Name string, Baud int) *SerialManager {
        c := serial.Config{Name: Name, Baud: Baud}
        //打开串口
        s, err := serial.OpenPort(&c)
    
        if err != nil {
            fmt.Println(err)
        }
        sendCh := make(chan []byte, 1000)
        recvCh := make(chan []byte, 1000)
        return &SerialManager{serialClient: s, SendCh: sendCh, RecvCh: recvCh}
    }
    
    // 读取特定长度的字节数据
    func (sm SerialManager) read(len int, fullBuf *[]byte) error {
        if len <= 0 {
            return types.Error{}
        }
        l := 0
        for {
            var buf = make([]byte, 1)
            _, err := sm.serialClient.Read(buf)
            if err != nil {
                fmt.Println("err", err)
                return err
            }
            l += 1
            *fullBuf = append(*fullBuf, buf...)
            if l == len {
                return nil
    
            }
    
        }
    }
    
    // 数据读取
    func (sm SerialManager) readThread() {
        go func() {
            for {
                var buf []byte
                err := sm.read(16, &buf)
                if err != nil {
                    contiune
                }
                sm.RecvCh <- buf
            }
        }()
    }
    
    // 数据发送
    func (sm SerialManager) sendThread() {
        go func() {
            for x := range sm.SendCh {
                fmt.Printf("发送数据:%q\n", x)
                _, err := sm.serialClient.Write(x)
                if err != nil {
                    log.Fatal(err)
                }
                time.Sleep(time.Second)
            }
        }()
    }
    
    // 启动服务
    func (sm SerialManager) Start() {
        go sm.readThread()
        go sm.sendThread()
    }
    

    相关文章

      网友评论

          本文标题:GO-serial

          本文链接:https://www.haomeiwen.com/subject/wcajahtx.html