问题描述
1. 在实际项目中,我们往往是通过网口直连设备与之通信,但是作者遇到了需要通过串口连接设备,然后与设备之间进行通信
2. 本文参考的库地址为tarm/serial,截止2024/7/25,有1.6k的star,比网上其他回答的库还是要多一些的,自认为更好用,如果读者有其他更好的库,欢迎指教
准备工作
1. 需要串口通信,自然需要知道与我们的电脑连接的设备,name和波特率,我只在设备上查到了波特率,电脑上也可以看到name(希望大家有更好的方法)
2. 在控制面板/设备管理器中,如果没看到端口,那么可以点击查看,然后选择“显示隐藏的设备”,即可看到端口,点进去找到名字,比如COM3
快速自测
1. 这里直接贴上github上官方的示例代码:
package main
import (
"log"
"github.com/tarm/serial"
)
func main() {
c := &serial.Config{Name: "COM45", Baud: 115200} // 刚刚查到的2个值
s, err := serial.OpenPort(c)
if err != nil {
log.Fatal(err)
}
n, err := s.Write([]byte("test"))
if err != nil {
log.Fatal(err)
}
buf := make([]byte, 128)
n, err = s.Read(buf)
if err != nil {
log.Fatal(err)
}
log.Printf("%q", buf[:n])
}
如果主机连接了串口线,但是串口线没连接设备,那么也是属于已连接,openPort可以成功,并且可以往串口中下发数据
2. 而如果你要下发给设备的是字符串数据,那么直接在此处类型转换一下即可,因为Write函数必须传入[]byte类型的数据:
data := "hello"
s.Write([]byte(data))
3. 当然了,也可以弄一个字符串切片,遍历切片,不断的将切片的数据下发给设备:
datas := []string{
"$GNRMC,130324,,,A*71\r\n",
"$GNVTG,22.65,\r\n",}
for _, data := range datas {
n, err := s.Write([]byte(data))
if err != nil {
log.Fatal(err)
}
log.Printf("Wrote %d bytes", n)
}