Golang笔记:使用serial包进行串口通讯

文章目录

  • 目的
  • 使用入门
  • 总结

目的

串口是非常常用的一种电脑与设备交互的接口。这篇文章将介绍golang中相关功能的使用。

本文使用的包为 :go.bug.st/serial
https://pkg.go.dev/go.bug.st/serial
https://github.com/bugst/go-serial

另外还有一些常见的包如:tarm/serial
https://pkg.go.dev/github.com/tarm/serial
https://github.com/tarm/serial

使用入门

这个包使用很简单,按照官方说明来其实就差不多了,这里稍微做下记录。

搜索串口

搜索电脑上的串口是最基本的操作:

package main

import (
	"log"

	"go.bug.st/serial"
)

func main() {
	ports, err := serial.GetPortsList()
	if err != nil {
		log.Fatal(err)
	}
	if len(ports) == 0 {
		log.Fatal("No serial ports found!")
	}
	for _, port := range ports {
		log.Printf("Found port: %v\n", port)
	}
}

在这里插入图片描述

上面只能搜索到串口设备,如果是USB模拟的串口设备等的还可以使用别的方式在搜索的同时获取到设备的VID&PID信息:

package main

import (
	"log"

	"go.bug.st/serial/enumerator"
)

func main() {
	ports, err := enumerator.GetDetailedPortsList()
	if err != nil {
		log.Fatal(err)
	}
	if len(ports) == 0 {
		log.Fatal("No serial ports found!")
		return
	}
	for _, port := range ports {
		log.Printf("Found port: %s\n", port.Name)
		if port.IsUSB {
			log.Printf("  VID&PID: %s&%s\n", port.VID, port.PID)
			log.Printf("  SerialNumber: %s\n", port.SerialNumber)
			log.Printf("  Product: %s\n", port.Product)
		}
	}
}

在这里插入图片描述

配置与打开

有了上面的串口名后就可以打开串口,打开时可以设置一些参数,大多数时候只要改个波特率即可:

package main

import (
	"log"

	"go.bug.st/serial"
)

func main() {
	mode := &serial.Mode{
		// default is 9600_8N1
		BaudRate: 115200,
		// DataBits          int              // Size of the character (must be 5, 6, 7 or 8)
		// Parity            Parity           // Parity (see Parity type for more info)
		// StopBits          StopBits         // Stop bits (see StopBits type for more info)
		// InitialStatusBits *ModemOutputBits // Initial output modem bits status (if nil defaults to DTR=true and RTS=true)
	}
	port, err := serial.Open("COM3", mode)
	if err != nil {
		log.Fatal(err)
	}
	
	// err := port.SetMode(mode) // 模式也可以在使用过程中更改
	// if err != nil {
	// 	log.Fatal(err)
	// }
	
	// port.Close() // 关闭串口
}

读写数据

下面是串口读写操作:

package main

import (
	"log"
	"time"

	"go.bug.st/serial"
)

func main() {
	// c := make(chan os.Signal)
	// signal.Notify(c)

	mode := &serial.Mode{
		BaudRate: 115200,
	}

	port, err := serial.Open("COM3", mode)
	if err != nil {
		log.Fatal(err)
	}

	// 下面读写测试时将用来测试的串口的RX和TX引脚外部进行短接,发送什么数据就会收到什么数据

	// 启用一个协程进行读取
	go func() {
		buff := make([]byte, 8)
		for {
			n, err := port.Read(buff) // 开始读取直到至少收到一字节数据
			if err != nil {
				log.Fatal(err)
			}
			log.Printf("Received %v bytes: %X\n", n, buff[:n])
		}
	}()

	// 启用一个协程定期发送数据
	go func() {
		for {
			n, err := port.Write([]byte{0xAA, 0xBB, 0xCC, 0xDD})
			
			// port.Drain() // 等待数据发送完成
			
			if err != nil {
				log.Fatal(err)
			}
			log.Printf("Sent %v bytes\n", n)
			time.Sleep(2 * time.Second)
		}
	}()

	select {}
	// <-c
}

在这里插入图片描述
上面测试可以看到串口数据接收可能会分多次触发。

流控制

这个包的使用很简单,最主要的就是上面一些,剩下的主要还有些流控制相关的操作,这个目前来说用的很少。最常见的是有些用流控制配合晶体管实现自复位电路的应用,这种时候需要特别注意控制串口打开时流控制的设置情况。

总结

用Golang来操作串口还是比较简单的,很多时候比单纯的用C语言来操作要方便很多。不过这其实是麻烦的地方包的开发者都处理封装好了,去查看源码时可以看到各个平台实现串口操作时该麻烦的还是麻烦,不过我们只是拿来用不用关心这么多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/732810.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Junit单元测试

就是针对最小的功能单元,编写测试代码对其进行正确性测试 Junit单元测试框架 public class StringUtil {public static void printNumber(String name) {if(name null){System.out.println(0);return; //停掉方法}System.out.println("名字长度是:" name.length(…

基于支持向量机的垃圾邮件分类,使用SVM+flask+vue

sms-classify 基于支持向量机的垃圾邮件分类&#xff0c;使用SVMflaskvue 数据集和源码地址 数据集 SMS Spam Collection Data Set 来源于 UCI。样例被分为非垃圾邮件&#xff08;86.6%&#xff09;和垃圾邮件&#xff08;13.4%&#xff09;&#xff0c;数据格式如下&#xff…

Why RAG is slower than LLM?

I used RAG with LLAMA3 for AI bot. I find RAG with chromadb is much slower than call LLM itself. Following the test result, with just one simple web page about 1000 words, it takes more than 2 seconds for retrieving: 我使用RAG&#xff08;可能是指某种特定的…

高考志愿填报,二个准备三个重点四个原则

对于高考生而言&#xff0c;高考完毕并不是可以轻松地开始&#xff0c;接下来需要研究怎么报考的问题。如何在理想和现实中取得平衡&#xff1f;如何根据就业和专业的前景做合适的安排&#xff0c;对于还处于青少年阶段的高考生们来说不是容易的事情&#xff0c;要掌握哪些技巧…

第2章 Android应用的界面编程

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

后端路线指导(4):后端春招秋招经验分享

后端春招&秋招经验分享 春招(暑期实习) /秋招是应届生非常重要的应聘时间,每一个想就业的同学一定要有所了解! 本篇内容&#xff0c;老白将与大家分享暑期实习和秋招如何应对招聘的个人经验&#xff0c;希望每个同学看完都能有所收获! 首先说明一下老白对于面试核心竞争力的…

Java比较运算符

关系运算符和比较运算符适用于条件判断类型。 相当于布尔值&#xff0c;只有True和False两个 符号 说明ab,判断a的值是否等于b的值&#xff0c;条件成立为true,不成立为false ! a!b,判断a和b的值是否不相等&#xff0c;条件成立为true,不成立为false > …

spring注解驱动系列-- spring容器创建原理

从源码开始探究spring容器的创建原理&#xff0c;下面是源码总步骤 Override public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();// Tell the subc…

Shell编程规范与变量-01

一、Shell脚本概述 在一些复杂的 Linux 维护工作中&#xff0c;大量重复性的输入和交互操作不仅费时费力&#xff0c;而且容易出错&#xff0c;而编写一个恰到好处的 Shell 脚本程序&#xff0c;可以批量处理、自动化地完成一系列维护任务&#xff0c;大大减轻管理员的负担。 1…

【数据结构与算法】线索二叉树 详解

为什么可在不增加指针域的情况下&#xff0c;对二叉树进行线索化&#xff1f; 不增加指针域&#xff1a;因为可以利用n1个空链域。 在线索二叉树中&#xff0c;为每个节点添加两个标志位&#xff0c;分别表示左指针和右指针是普通的孩子指针还是线索&#xff08;前驱或后继&a…

WPS没保存关闭了怎么恢复数据?4个方法(更新版)

想象一下&#xff0c;你正在用WPS奋笔疾书&#xff0c;灵感如泉水般涌出&#xff0c;突然间&#xff0c;电脑却跟你开了个玩笑——啪地一下&#xff0c;文档未保存就关闭了&#xff01;是不是感觉像是被泼了一盆冷水&#xff0c;所有的热情瞬间熄灭&#xff1f;别急&#xff0c…

Vue78-缓存路由组件

一、需求 路由切走的时候&#xff0c;组件会被销毁&#xff0c;路由切回来&#xff0c;组件被挂载&#xff01; 需要&#xff1a;路由切走的时候&#xff0c;组件不会被销毁。 二、代码实现 若是不加include属性&#xff0c;则在<router-view>里面展示的路由&#xff0c…

【MySQL进阶之路 | 高级篇】InnoDB存储结构(页的内部结构)

1. 数据库的存储结构 : 页 索引结构给我们提供了高效的索引方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的.确切说是存储在页结构中.另一方面&#xff0c;索引是在存储引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入操作.不同的存…

MQTTfx连接阿里云(详细版)

1、介绍 作为物联网开放平台&#xff0c;阿里云可谓是吸引大多数嵌入式爱好者的平台。物联网MQTT协议火热的今天&#xff0c;你使用过阿里云吗&#xff1f;本篇文章带你接触阿里云&#xff0c;实现MQTT通信。 我们在测试MQTT之前先了解下什么是MQTT协议。大家都知道它是一种发…

面向对象修炼手册(一)(类与对象)(Java宝典)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;面向对象修炼手册 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 思想 代理和团体 类 1 基本概…

什么是N卡和A卡?有什么区别?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、什么是N卡和A卡&#xff1f;有什么区别&#xff1f;…

Qt creator day3练习

2、升级优化自己应用程序的登录界面。 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 widget…

WordPress插件:子比zibll主题插件 炙焰美化全开源插件V3.2——让你的网站瞬间焕发光彩

随着互联网的普及&#xff0c;越来越多的企业和个人开始拥有自己的网站。然而&#xff0c;一个美观、专业的网站却并非易事。幸运的是&#xff0c;现在市场上有许多优秀的WordPress插件可以帮助我们快速实现这一目标。今天&#xff0c;我们要介绍的就是一款名为“子比zibll主题…

告别手抖尴尬!教你轻松缓解手部震颤的小秘诀!

在我们的日常生活中&#xff0c;手抖这个现象可能并不罕见。不论是因为紧张、疲劳还是某些健康问题&#xff0c;手抖都会给我们的生活带来诸多不便。今天&#xff0c;就让我们一起探讨如何缓解手部震颤&#xff0c;让你告别手抖的尴尬&#xff01; 一、手抖的成因及影响 手抖&…

解两道四年级奥数题(等差数列)玩玩

1、1&#xff5e;200这200个连续自然数的全部数字之和是________。 2、2&#xff0c;4&#xff0c;6&#xff0c;……&#xff0c;2008这些偶数的所有各位数字之和是________。 这两道题算易错吧&#xff0c;这里求数字之和&#xff0c;比如124这个数的全部数字之和是1247。 …