何力平 發表於 2025-11-30 11:49:38

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 := &amp;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 := &amp;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 &lt; 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]
查看完整版本: GO语言实现串口简单通讯