golang串口通讯
Golang 通讯 串口
2023-09-27 14:22:01 时间
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:
}
}
}
相关文章
- Golang 如何从socket读出所有数据
- Golang go-redis cluster模式下不断创建新连接,效率下降问题解决
- [转]Go语言(golang)开源项目大全
- Golang 环境配置建议(Atom)
- [golang]svg图片默认按照左上角旋转,改为按中心旋转,重新计算中心偏移量
- Golang加密md5
- 【GoLang】3.2 数组
- GoLang 连接 Mysql 数据库
- JAVA开发者的Golang快速指南
- 自定义架构实现基于golang中web开发与异步系统调用等方法进行mock在不同环境运行或测试
- golang 实现程序运行时函数动态替换,举例说明动态注入和替换本地方法、系统库方法、第三方库方法,附完整源码实现