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 } func Open(portName string) (serial.Port, error) { return serial.Open(portName, &serial.Mode{BaudRate: 115200}) } // SendAndReceive sends data and reads the response with a timeout. func SendAndReceive(portName string, data []byte, timeout time.Duration) ([]byte, error) { port, err := Open(portName) if err != nil { return nil, fmt.Errorf("opening %s: %w", portName, err) } defer port.Close() port.SetReadTimeout(timeout) _, err = port.Write(data) if err != nil { return nil, fmt.Errorf("writing to %s: %w", portName, err) } var resp []byte buf := make([]byte, 256) for { n, err := port.Read(buf) if n > 0 { resp = append(resp, buf[:n]...) } if err != nil || n == 0 { break } } return resp, nil }