首页 > 其他分享 >golang串口通讯

golang串口通讯

时间:2023-02-17 09:47:43浏览次数:39  
标签:00 通讯 err nil time baudRate golang 串口 go

com.go

package main

import (
	"encoding/hex"
	"errors"
	"io"
	"strings"
	"time"

	"github.com/jacobsa/go-serial/serial"
	log "github.com/sirupsen/logrus"
)

/*
定义串口客户端
*/

type SerialClient struct {
	readWriter io.ReadWriteCloser
	OutBuffer  chan string
	PortName   string
	baudRate   uint
}

func NewSerialClient(portName string, baudRate uint) (*SerialClient, error) {
	c := &SerialClient{
		readWriter: nil,
		OutBuffer:  make(chan string, 1024),
		PortName:   portName,
		baudRate:   baudRate,
	}

	r, err := c.open(portName, baudRate)
	if err != nil {
		return nil, err
	}
	c.readWriter = r
	return c, nil
}

func (c *SerialClient) Start() {
	for {
		buf := make([]byte, 1024)
		n, err := c.readWriter.Read(buf)
		if err != nil {
			if err != io.EOF {
				//尝试重新打开
				r, err := c.open(c.PortName, c.baudRate)
				if err != nil {
					time.Sleep(2 * time.Second)
					continue
				}
				c.readWriter = r
			}
			continue
		}

		buf = buf[:n]
		res := hex.EncodeToString(buf)
		if strings.TrimSpace(res) == "" {
			continue
		}
		log.Info("Rx: ", res)
		c.OutBuffer <- res
	}
}

func (c *SerialClient) open(portName string, baudRate uint) (io.ReadWriteCloser, error) {
	options := serial.OpenOptions{
		PortName:        portName,
		BaudRate:        baudRate,
		DataBits:        8,
		StopBits:        1,
		MinimumReadSize: 4,
	}
	r, err := serial.Open(options)
	if err != nil {
		return nil, err
	}
	c.readWriter = r
	return r, err
}

func (c *SerialClient) SendMsg(data string) (int, error) {
	var (
		err error
	)
	if c.readWriter == nil {
		return 0, errors.New("serial port is closed")
	}

	bytes, err := hex.DecodeString(data)
	if err != nil {
		return 0, err
	}

	return c.readWriter.Write(bytes)
}

main.go

package main

import (
	"time"

	"github.com/gogf/gf/frame/g"
)

func main() {
	// 打开端口
	c, err := NewSerialClient("COM4", 1500000)
	if err != nil {
		g.Log().Errorf("打开端口失败, %v", err)
		return
	}

	// 启动
	go c.Start()

	// 发送消息
	c.SendMsg(utils.TrimHexStr("55 00 0A 00 00 00 00 00 42 00 00 E2 03"))

	go func() {
		tick := time.NewTicker(2 * time.Second)
		for {
			select {
			case <-tick.C:
				data := "55 00 0E 00 00 00 00 00 7A 00 04 00 00 00 00 DA 03"
				c.SendMsg(utils.TrimHexStr(data))
			}
		}
	}()

	for {
		select {
		case res := <-c.OutBuffer:
			g.Log().Infof("接收: %v", res)
		default:

		}
	}
}

标签:00,通讯,err,nil,time,baudRate,golang,串口,go
From: https://www.cnblogs.com/jiftle/p/17129037.html

相关文章

  • 嵌入式驱动开发之spi---spi串口通信调试
    一.概念SPI是SerialPeripheralInterface(串型外部接口)的缩写。SPI接口有4根PIN脚,分别是:        *SPICLK  :用于传输数据的同步时钟        ......
  • webim 实现实时通讯的 4 种方式
    本文前半段主要节选自:WebSocket,后半段总结和概括自沈剑大佬的两篇文章和文章评论http如何像tcp一样实时的收消息?、网页端收消息,究竟是推还是拉?,完整参考见文末。webim是......
  • 凤凰架构 - 服务发现、网关路由、客户端负载均衡、流量治理、可靠通讯、可观测性
     一、服务发现 1.所有的远程服务调用都是使用全限定名(FullyQualifiedDomainName,FQDN)、端口号与服务标识所构成的三元组来确定一个远程服务的精确坐标的。全限定名......
  • WorkPlus即时通讯集成工作平台,提效企业一体化管控
    在当今信息化时代,越来越多的企业开始注重数字化办公,WorkPlus正是满足这种需求的应用之一。WorkPlus以即时通讯为核心,将企业内部通讯、日程安排、工作任务等多个功能进行集......
  • 工程监测多通道振弦模拟信号采集仪VTN的通讯协议
    工程监测多通道振弦模拟信号采集仪VTN的通讯协议 寄存器机制VTN4XX内部维护有若干寄存器,在寄存器参数值的控制下完成工作。寄存器的值总是以整数形式存在,基本操作单......
  • Go基础系列 01-Golang简介
    1.什么是GolangGo(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go支持面向对象,而且具有真正的闭包(closures)和反射(reflecti......
  • golang 复杂数据类型
    1.指针一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前你需要声明指针。每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。使用&字符......
  • 如何在 Golang 中打破一长行代码?
    这是StackOverflow上的一个问题,今天同事问我,我发现我也不知道。原问题译文:我不习惯看到超过80列的代码行。所以当我遇到这个时:err:=database.QueryRow("select*f......
  • golang 排序
    排序都使用数组进行元素的保存1.冒泡排序。冒泡排序,从左到右,把后一个元素与前一个元素做比较,小的往前移位。1)一共会经过arr.length-1次的轮数比较,每一轮会确定一个数的......
  • 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v8.4版已发布
    关于MobileIMSDKMobileIMSDK是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持UDP 、TCP 、WebSocket 三种协议,支持iOS、Android、H5、......