package picoserial import ( "fmt" "time" "go.bug.st/serial" "go.bug.st/serial/enumerator" ) func FindDevice() (string, error) { ports, err := enumerator.GetDetailedPortsList() if err != nil { return "", fmt.Errorf("enumerating ports: %w", err) } for _, p := range ports { if p.IsUSB { return p.Name, nil } } return "", nil } type SerialTransport struct { port serial.Port } func Open(portName string) (*SerialTransport, error) { port, err := serial.Open(portName, &serial.Mode{BaudRate: 115200}) if err != nil { return nil, fmt.Errorf("opening %s: %w", portName, err) } return &SerialTransport{port: port}, nil } func (t *SerialTransport) Send(data []byte) error { _, err := t.port.Write(data) return err } func (t *SerialTransport) Receive(timeout time.Duration) ([]byte, error) { t.port.SetReadTimeout(timeout) var resp []byte buf := make([]byte, 256) for { n, err := t.port.Read(buf) if n > 0 { resp = append(resp, buf[:n]...) } if err != nil || n == 0 { break } } return resp, nil } func (t *SerialTransport) Close() error { return t.port.Close() }