golang串口通讯
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:
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2018-02-17 DLL编写中extern “C”和__stdcall的作用
2018-02-17 为什么 Windows API 使用 stdcall 调用约定?
2017-02-17 jsp版ueditor图片在线管理返回绝对路径
2017-02-17 jfinal渲染器FileRender完整路径文件不正确的问题
2017-02-17 百度编辑器UEditor不能插入音频视频的解决方法
2017-02-17 从程序员的角度来看为什么我们需要工作流