package communication import ( "fmt" "log" "go.bug.st/serial" "go.bug.st/serial/enumerator" ) const ( ST_VID = `0483` ) type physical struct { port serial.Port rx chan byte } func newPhysical() (physical, error) { p := physical{} devices, err := getStSerials() if err != nil { return p, err } if len(devices) != 1 { return p, fmt.Errorf("Require exactly one serial device from STMicroelectronics but %d attached", len(devices)) } device := devices[0] p.port, err = openSerial(device) if err != nil { return p, err } p.rx = make(chan byte) return p, nil } func (p *physical) start() { go p.Receive() } func getStSerials() ([]string, error) { retval := make([]string, 0) ports, err := enumerator.GetDetailedPortsList() if err != nil { return retval, err } for _, port := range ports { if port.IsUSB { if port.VID == ST_VID { retval = append(retval, port.Name) } } } return retval, nil } func openSerial(device string) (serial.Port, error) { var port serial.Port mode := &serial.Mode{ BaudRate: 115200, } port, err := serial.Open(device, mode) if err != nil { return port, err } return port, nil } func (p *physical) Receive() { for { buff := make([]byte, 100) n, err := p.port.Read(buff) if err != nil { log.Fatal(err) } for i := 0; i < n; i++ { p.rx <- buff[i] } } }