Golang 串口通信_golang 串口通讯,2024年最新带你一起探究Golang事件分发机制

48 阅读5分钟
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提供的丰富的库和工具使得串口通信变得更加便捷和高效。


### 总结




![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/ec3f6381ecb14302ad763ccd70a08d90~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1770647664&x-signature=WcnKR3qg%2FFha3SsEUCFYY5Ca8PU%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c233229d8f174289a3976902141f76e5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1770647664&x-signature=RUxOxXLsbU7YmexWDYWPn7Klki0%3D)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://gitee.com/vip204888)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**