70 lines
1.3 KiB
Go
70 lines
1.3 KiB
Go
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})
|
|
}
|
|
|
|
func SendByte(portName string, b byte) error {
|
|
port, err := Open(portName)
|
|
if err != nil {
|
|
return fmt.Errorf("opening %s: %w", portName, err)
|
|
}
|
|
defer port.Close()
|
|
|
|
_, err = port.Write([]byte{b})
|
|
if err != nil {
|
|
return fmt.Errorf("writing to %s: %w", portName, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SendByteAndRead sends a byte and reads the response with a timeout.
|
|
func SendByteAndRead(portName string, b 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([]byte{b})
|
|
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
|
|
}
|