M5StackC plusからのMyfareカードのUID情報をUSBシリアル使ってGoで受信してみます。
参考は、
https://zenn.dev/nnabeyang/articles/d54f18cc39dc4a654c7a
USBシリアルのVID/PIDをMacBook Airからシステム情報/USBで引くと、以下のように見える。USB経由でファイル(USBストレージ)とシリアルインターフェースが見えるようになっています。
0x403と0x6001を使うが、これでは該当するポートが見つからないと言われる。
VID/PIDを調べるために取得スクリプトを、
https://pkg.go.dev/go.bug.st/serial/enumerator
のexampleから引っ張ってくる。参考までにPortDetails構造体の中身見ると、型が数値ではなく文字列だから16進表記じゃだめです。まあ、元々が文字列じゃないか、
if port.IsUSB {
fmt.Printf(" USB ID %s:%s\n", port.VID, port.PID)
fmt.Printf(" USB serial %s\n", port.SerialNumber)
-->
USB ID 0403:6001
USB serial AD5232ED16
type PortDetails struct {
Name string
IsUSB bool
VID string
PID string
SerialNumber string
// Product is an OS-dependent string that describes the serial port, it may
// be not always available and it may be different across OS.
Product string
}
VID/PIDの文字列をそのまま使って、
package main
import (
"bufio"
"errors"
"fmt"
"log"
"os"
"go.bug.st/serial"
"go.bug.st/serial/enumerator"
)
func getPortName() (string, error) {
ports, error := enumerator.GetDetailedPortsList()
if error != nil {
return "", error
}
for _, port := range ports {
/*
if port.IsUSB {
fmt.Printf(" USB ID %s:%s\n", port.VID, port.PID)
fmt.Printf(" USB serial %s\n", port.SerialNumber)
*/
if port.IsUSB && port.VID == "0403" && port.PID == "6001" {
return port.Name, nil
}
}
return "", errors.New("M5Stack cplus is not conntected")
}
func main() {
portName, err := getPortName()
if err != nil {
log.Fatal(err)
os.Exit(1)
}
mode := &serial.Mode{
BaudRate: 115200,
}
port, err := serial.Open(portName, mode)
if err != nil {
log.Fatal(err)
os.Exit(1)
}
scanner := bufio.NewScanner(port)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
これでちゃんと読めた。
admin