Golang 串口通信

简介: Golang 串口通信

简介

串口通信是一种常见的硬件通信方式,用于在计算机和外部设备之间传输数据。Golang(Go语言)作为一种高效、可靠的编程语言,提供了丰富的库和工具用于串口通信。本文将介绍如何使用Golang进行串口通信,包括串口配置、数据读写和错误处理等方面。


安装依赖

在开始之前,我们需要先安装Golang的串口通信库。目前,有很多第三方的串口通信库可供选择,如"go-serial"和"go-serialport"等。你可以通过以下命令安装其中一个库:

go get github.com/jacobsa/go-serial/serial

打开串口

在进行串口通信之前,首先需要打开串口。在Golang中,打开串口可以使用Open()函数,该函数接收一个串口配置参数作为输入。下面是一个打开串口的示例代码:

packpackage main
import (
    "log"
    "github.com/jacobsa/go-serial/serial"
)
func main() {
    // 配置串口参数
    options := serial.OpenOptions{
        PortName:        "/dev/ttyUSB0",
        BaudRate:        9600,
        DataBits:        8,
        StopBits:        1,
        MinimumReadSize: 4,
    }
    // 打开串口
    port, err := serial.Open(options)
    if err != nil {
        log.Fatal(err)
    }
    // 关闭串口
    defer port.Close()
}


在上述代码中,我们首先定义了一个options变量,用于存储串口的配置参数。然后,我们调用serial.Open()函数打开串口,并将返回的port变量存储为串口对象。如果打开串口失败,我们使用log.Fatal()函数输出错误信息并退出程序。最后,我们通过defer关键字在程序结束时关闭串口。


读取数据


打开串口后,我们就可以开始读取串口数据了。在Golang中,可以使用port.Read()函数从串口中读取数据。下面是一个读取串口数据的示例代码:

package main
import (
    "log"
    "github.com/jacobsa/go-serial/serial"
)
func main() {
    // 配置串口参数
    options := serial.OpenOptions{
        PortName:        "/dev/ttyUSB0",
        BaudRate:        9600,
        DataBits:        8,
        StopBits:        1,
        MinimumReadSize: 4,
    }
    // 打开串口
    port, err := serial.Open(options)
    if err != nil {
        log.Fatal(err)
    }
    // 关闭串口
    defer port.Close()
    // 读取数据
    buf := make([]byte, 128)
    n, err := port.Read(buf)
    if err != nil {
        log.Fatal(err)
    }
    // 输出读取到的数据
    log.Printf("Read %d bytes: %v", n, buf[:n])
}

在上述代码中,我们首先定义了一个buf变量,用于存储读取到的数据。然后,我们调用port.Read()函数从串口中读取数据,并将读取到的数据存储到buf中。最后,我们使用log.Printf()函数输出读取到的数据。


写入数据

除了读取数据,我们还可以使用Golang向串口写入数据。在Golang中,可以使用port.Write()函数向串口写入数据。下面是一个向串口写入数据的示例代码:

package main
import (
    "log"
    "github.com/jacobsa/go-serial/serial"
)
func main() {
    // 配置串口参数
    options := serial.OpenOptions{
        PortName:        "/dev/ttyUSB0",
        BaudRate:        9600,
        DataBits:        8,
        StopBits:        1,
        MinimumReadSize: 4,
    }
    // 打开串口
    port, err := serial.Open(options)
    if err != nil {
        log.Fatal(err)
    }
    // 关闭串口
    defer port.Close()
    // 写入数据
    buf := []byte("Hello, Serial!")
    n, err := port.Write(buf)
    if err != nil {
        log.Fatal(err)
    }
    // 输出写入的字节数
    log.Printf("Write %d bytes: %v", n, buf)
}

在上述代码中,我们首先定义了一个buf变量,用于存储要写入的数据。然后,我们调用port.Write()函数向串口写入数据,并将写入的字节数存储到n变量中。最后,我们使用log.Printf()函数输出写入的字节数和写入的数据。


错误处理


在进行串口通信时,可能会遇到各种错误,如串口打开失败、读写错误等。为了保证程序的稳定性和可靠性,我们需要对这些错误进行适当的处理。


在前面的示例代码中,我们使用了log.Fatal()函数来处理错误。该函数会输出错误信息并退出程序。除了log.Fatal()函数,我们还可以使用其他错误处理方式,如使用log.Println()函数输出错误信息而不退出程序,或使用fmt.Errorf()函数返回自定义的错误信息。

案例

案例1:发送和接收数据

在这个案例中,我们将演示如何使用Golang进行串口通信来发送和接收数据。我们将通过串口向外部设备发送数据,并从外部设备接收响应。

package main
import (
  "log"
  "time"
  "github.com/jacobsa/go-serial/serial"
)
func main() {
  // 配置串口参数
  options := serial.OpenOptions{
    PortName:        "/dev/ttyUSB0",
    BaudRate:        9600,
    DataBits:        8,
    StopBits:        1,
    MinimumReadSize: 4,
  }
  // 打开串口
  port, err := serial.Open(options)
  if err != nil {
    log.Fatal(err)
  }
  // 关闭串口
  defer port.Close()
  // 发送数据
  sendData := []byte("Hello, Serial!")
  n, err := port.Write(sendData)
  if err != nil {
    log.Fatal(err)
  }
  log.Printf("Sent %d bytes: %v", n, sendData)
  // 接收数据
  buf := make([]byte, 128)
  n, err = port.Read(buf)
  if err != nil {
    log.Fatal(err)
  }
  log.Printf("Received %d bytes: %v", n, buf[:n])
}


在上述代码中,我们首先通过port.Write()函数向串口发送数据。然后,我们使用port.Read()函数从串口接收响应数据。最后,我们使用log.Printf()函数分别输出发送和接收到的数据。

案例2:设置串口超时时间


在某些场景下,我们可能需要设置串口的超时时间。如果在超时时间内没有接收到数据,我们可以选择继续等待或者中断操作。下面是一个设置串口超时时间的示例代码:

package main
import (
  "log"
  "time"
  "github.com/jacobsa/go-serial/serial"
)
func main() {
  // 配置串口参数
  options := serial.OpenOptions{
    PortName:        "/dev/ttyUSB0",
    BaudRate:        9600,
    DataBits:        8,
    StopBits:        1,
    MinimumReadSize: 4,
    InterCharacterTimeout: 500,
  }
  // 打开串口
  port, err := serial.Open(options)
  if err != nil {
    log.Fatal(err)
  }
  // 关闭串口
  defer port.Close()
  // 设置超时时间
  timeoutDuration := 2 * time.Second
  port.SetReadTimeout(timeoutDuration)
  // 读取数据
  buf := make([]byte, 128)
  n, err := port.Read(buf)
  if err != nil {
    log.Fatal(err)
  }
  log.Printf("Received %d bytes: %v", n, buf[:n])
}


在上述代码中,我们通过port.SetReadTimeout()函数设置了串口的读取超时时间为2秒。如果在超时时间内没有读取到数据,port.Read()函数将返回io.EOF错误。这样我们可以根据需要选择继续等待数据或者中断操作。


案例3:配置流控制

有些串口设备可能需要配置流控制来实现数据传输的控制和同步。在这个案例中,我们将演示如何在Golang中配置串口的硬件流控制。

package main
import (
  "log"
  "github.com/jacobsa/go-serial/serial"
)
func main() {
  // 配置串口参数
  options := serial.OpenOptions{
    PortName:        "/dev/ttyUSB0",
    BaudRate:        9600,
    DataBits:        8,
    StopBits:        1,
    MinimumReadSize: 4,
    FlowControl:     serial.HardwareFlowControl,
  }
  // 打开串口
  port, err := serial.Open(options)
  if err != nil {
    log.Fatal(err)
  }
  // 关闭串口
  defer port.Close()
  // 发送数据
  sendData := []byte("Hello, Serial!")
  n, err := port.Write(sendData)
  if err != nil {
    log.Fatal(err)
  }
  log.Printf("Sent %d bytes: %v", n, sendData)
  // 接收数据
  buf := make([]byte, 128)
  n, err = port.Read(buf)
  if err != nil {
    log.Fatal(err)
  }
  log.Printf("Received %d bytes: %v", n, buf[:n])
}


在上述代码中,我们通过options.FlowControl字段设置串口的流控制方式为硬件流控制。这样,串口将根据硬件信号来控制数据传输的节奏和同步。根据外部设备的要求,你可以选择硬件流控制、软件流控制或者不使用流控制。


通过上述案例,我们了解了如何使用Golang进行串口通信,并学习了如何发送和接收数据、设置超时时间以及配置流控制。串口通信在嵌入式系统、物联网和传感器等领域具有广泛的应用,掌握使用Golang进行串口通信的技巧可以帮助我们更好地开发和调试相关应用。Golang提供的丰富的库和工具使得串口通信变得更加便捷和高效。

总结


本文介绍了如何使用Golang进行串口通信。我们学习了如何打开串口、读取数据、写入数据和处理错误。串口通信在物联网、嵌入式系统和传感器等领域具有广泛的应用,掌握使用Golang进行串口通信的技巧可以帮助我们更好地开发和调试相关应用。同时,Golang提供的丰富的库和工具也使得串口通信变得更加便捷和高效。

相关文章
Echarts 热力图自定义开发
Echarts 热力图自定义开发
2202 0
|
Ubuntu 数据安全/隐私保护
百度搜索:蓝易云【ubuntu安装qemu教程】
现在,你已经成功在Ubuntu系统中安装了QEMU。你可以使用QEMU来模拟x86、ARM等体系结构的虚拟机,并在其中运行不同的操作系统。请注意,QEMU的使用可能涉及到一些复杂的参数和配置,具体使用方法可以参考官方文档或相关教程。
735 1
|
2月前
|
人工智能 API 语音技术
AI Agent开发利器百炼CLI跨平台部署实战,Linux/macOS/Windows环境安装,代码集成避坑指南
在大模型应用开发的场景中,开发者经常会遇到一个痛点:不同模态的AI能力分散在不同接口,文本对话、图片生成、视频生成、语音合成需要分别调用独立API,每一类能力都要单独编写鉴权、请求、重试、结果解析代码,在自动化脚本、CI流水线、本地Agent开发场景下,代码冗余严重,维护成本居高不下。百炼CLI是面向开发者推出的全模态AI命令行工具,把平台内各类大模型能力封装为统一的终端指令,支持文本对话、文生图、图像编辑、语音合成、语音识别、视频生成、知识库检索等十余项原子AI能力。开发者可以直接在终端输入指令完成AI任务,也可以嵌入Shell脚本、Python程序,实现AI任务自动化调度,同时原生兼容各类
203 0
|
9月前
|
Prometheus 监控 Cloud Native
Prometheus+Grafana:一站式搞定监控告警全链路
本文详解Prometheus+Grafana监控体系:从核心原理(时序数据、4类指标、Pull采集、PromQL)到完整实战,涵盖服务器、Spring Boot应用监控搭建、告警配置与生产优化,助你构建实时、可视化、可告警的分布式系统“生命线”。
2022 4
|
Unix Linux 数据处理
Linux命令stty详解
`stty`是Linux命令,用于设置和查看终端参数,如波特率、字符处理和控制字符。它直接与终端驱动交互,支持多种选项以适应不同的配置需求。例如,`stty -a`显示当前设置,`stty -echo`关闭回显,`stty 115200 cs8`调整波特率和字符大小。注意修改设置可能影响终端行为,建议先备份(`stty -g`)并谨慎操作。查阅手册页以获取详细信息。
|
开发工具 git
使用Git下载指定版本或指定commit
使用Git下载指定版本或指定commit
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
800 35
|
存储 JSON JavaScript
[go]byte类型, string 类型, json 类型
本文介绍了Go语言中byte类型的基本概念、特点及用法。byte是8位无符号整数,取值范围为0-255,常用于二进制数据操作,如网络通信和文件读写。文章还详细说明了byte与字符串的转换、遍历byte数据以及与其他类型间的转换。此外,探讨了Go中json.Marshal和json.Unmarshal函数实现[]byte与JSON间的转换,并对比了[]byte与JSON的区别,帮助开发者更好地理解其应用场景与差异。
498 2
|
算法 SoC
在写PWM风扇驱动之前:如何透过FG信号,获取风扇转速?
本文介绍了如何通过PWM风扇的FG信号线获取风扇转速的方法,包括风扇规格的解读、FG信号的公式推导、软件算法的解析,以及在全志H713平台上实现风扇转速获取的驱动代码示例。
3917 2
在写PWM风扇驱动之前:如何透过FG信号,获取风扇转速?
|
小程序 JavaScript 前端开发
微信小程序安装和使用 Vant Weapp 组件库
本文介绍了如何在微信小程序中安装和使用Vant Weapp组件库,包括通过npm安装、构建npm、修改配置文件以及在小程序中使用Vant Weapp提供的组件。
微信小程序安装和使用 Vant Weapp 组件库

热门文章

最新文章