Golang 串口通信_golang 串口通讯

简介

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

安装依赖

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

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

打开串口

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

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()
}

在上述代码中,我们首先定义了一个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,


![img](https://img-blog.csdnimg.cn/img_convert/864be30ae1cc2b0dd4a01dca008ca5fd.png)
![img](https://img-blog.csdnimg.cn/img_convert/2ea13c86cf14226df92ecd31cd9e1dbd.png)
![img](https://img-blog.csdnimg.cn/img_convert/b7060d78b6427a6893ea4deb4ef3dd59.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

Name:        "/dev/ttyUSB0",
		BaudRate:        9600,


[外链图片转存中...(img-qxtlUgRq-1725473932753)]
[外链图片转存中...(img-4Q1MGTLU-1725473932753)]
[外链图片转存中...(img-C6Owte6j-1725473932754)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值