沒有真實串列埠裝置時使用"虛擬串列埠驅動"除錯你的串列埠程式碼

janbar發表於2020-11-17

前言

很多時候需要編寫串列埠程式碼,但是又沒有真實串列埠裝置來除錯程式碼。以及本身就是要操作2個串列埠的情況,可以使用“虛擬串列埠驅動”工具方便的除錯程式碼。
使用方法就是點選新增埠,此時“COM1 <-> COM2”是一組,即對COM1寫資料會讓COM2讀到,對COM2寫資料會讓COM1讀到,是不是很方便。
下面是“虛擬串列埠驅動”工具的截圖,我是在網上隨便找的一個漢化版,大家可自行百度下載吧。

示例程式碼

  1. 串列埠收發都是不太好控制的,因此我下面的程式使用“\n”作為結束符,當收到“\n”時認為本次接收資料已完整,傳送資料結尾帶上“\n”。
package main

import (
    "fmt"
    "os"

    "github.com/tarm/serial"
)

/* https://www.eltima.com/products/vspdxp/ : 虛擬串列埠工具 */
func main() {
    if len(os.Args) != 3 {
        return
    }
    com, err := serial.OpenPort(&serial.Config{
        Name:     os.Args[1],
        Baud:     9600,
        Size:     8,
        Parity:   serial.ParityNone,
        StopBits: serial.Stop1,
    })
    if err != nil {
        panic(err)
    }
    defer com.Close()

    var n int
    buf := make([]byte, 128)
    if os.Args[2] == "server" {
        for {
            n, err = readCom(com, buf)
            if err != nil {
                panic(err)
            }
            fmt.Printf("[%s]\n", buf[:n])

            err = writeCom(com)
            if err != nil {
                panic(err)
            }
        }
    } else {
        for {
            err = writeCom(com)
            if err != nil {
                panic(err)
            }

            n, err = readCom(com, buf)
            if err != nil {
                panic(err)
            }
            fmt.Printf("[%s]\n", buf[:n])
        }
    }
}

func readCom(com *serial.Port, buf []byte) (int, error) {
    cnt := 0
    for {
        n, err := com.Read(buf[cnt:])
        if err != nil {
            return 0, err
        }
        for i := cnt + n; i >= cnt; i-- {
            if buf[i] == '\n' {
                // 找到結束標記符,確定是一條完整的資訊
                return i, nil
            }
        }
        cnt += n
    }
}

func writeCom(com *serial.Port) error {
    var send string
    fmt.Scanln(&send)

    var (
        buf   = []byte(send + "\n")
        end   = len(buf)
        start = 0
    )
    for start < end {
        n, err := com.Write(buf[start:])
        if err != nil {
            return err
        }
        start += n
    }
    // 確保所有資料都傳送完成,然後重新整理快取
    return com.Flush()
}
  1. 執行效果

總結

有時候需要除錯串列埠程式碼,但每次接裝置進行除錯很麻煩,使用“虛擬串列埠驅動”工具不僅可以用來除錯程式碼,甚至可以做到單元測試裡面。
畢竟驗證程式碼邏輯還得用上真實裝置不僅麻煩,而且難以控制,使用該工具完美解決問題。

相關文章