GO语言实现串口简单通讯
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">背景</a></li><li><a href="#_label1">串口通讯代码</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">代码块分解解析</a></li></ul><li><a href="#_label2">完整代码</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">运行结果</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>背景</h2><p>最近再学习 go 语言,在某宝用5块钱买了个教学视频 8 日速成,目前看到了第3天的视频,进度龟速。。。。。这周末加油!<br />然后,学习 go 语言的目的是想用 go 做自动测试,我是只学过 C ,感觉 go 语言和 C 比较相近,学起来比较简单、迅速。</p>
<p class="maodian"><a name="_label1"></a></p><h2>串口通讯代码</h2>
<p>golang 串口源码:<a href="https://github.com/huin/goserial" rel="external nofollow"target="_blank">https://github.com/huin/goserial</a></p>
<p>对于 go 的串口通讯要求如下:</p>
<ol><li>Data Bits:8</li><li>Stop Bits:1</li><li>Parity:None</li><li>Hardware Flow Control:None</li><li>Software Flow Control:None</li></ol>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>代码块分解解析</h3>
<ol><li>设置串口号和波特率</li></ol>
<div class="jb51code"><pre class="brush:go;">c := &serial.Config{Name: "COM5", Baud: 115200}
</pre></div>
<p>Config 是一个结构体。原型如下:</p>
<div class="jb51code"><pre class="brush:go;">type Config struct {
Name string
Baud int
Size ByteSize
Parity ParityMode
StopBits StopBits
// RTSFlowControl bool
// DTRFlowControl bool
// XONFlowControl bool
CRLFTranslate bool // Ignored on Windows.
// TimeoutStuff int
}
</pre></div>
<ol start="2"><li>打开串口<br />OpenPort 函数用于打开串口。传参 c 是 Config 结构体的指针。返回结果有两个:s 和 err。s 是个句柄,err 是打开结果。err = nil 表示打开失败。</li></ol>
<div class="jb51code"><pre class="brush:go;"> s, err := serial.OpenPort(c)
if err != nil {
log.Fatal(err)
}
</pre></div>
<ol start="3"><li>发送串口数据</li></ol>
<div class="jb51code"><pre class="brush:go;"> n, err := s.Write([]byte("012345"))
if err != nil {
log.Fatal(err)
}
</pre></div>
<ol start="4"><li>接收串口数据</li></ol>
<div class="jb51code"><pre class="brush:go;"> buf := make([]byte, 128)
n, err = s.Read(buf)
if err != nil {
log.Fatal(err)
}
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>完整代码</h2>
<div class="jb51code"><pre class="brush:go;">package main
import (
"fmt"
"log"
"time"
"github.com/tarm/goserial"
)
func main() {
//设置串口编号
c := &serial.Config{Name: "COM5", Baud: 115200}
//打开串口
s, err := serial.OpenPort(c)
if err != nil {
log.Fatal(err)
}
// 写入字符串“012345”
n, err := s.Write([]byte("012345"))
if err != nil {
log.Fatal(err)
}
//延时100
time.Sleep(100)
buf := make([]byte, 128)
n, err = s.Read(buf)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Read %d Bytes\r\n", n)
for i := 0; i < n; i++ {
fmt.Printf("buf[%d]=%c\r\n", i, buf)
}
}
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>运行结果</h2>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025113011501156.png" /></p>
頁:
[1]