diff --git a/framertu.go b/framertu.go index 75b0e11..f980516 100644 --- a/framertu.go +++ b/framertu.go @@ -33,7 +33,6 @@ func NewRTUFrame(packet []byte) (*RTUFrame, error) { Function: uint8(packet[1]), Data: packet[2 : pLen-2], } - return frame, nil } @@ -62,6 +61,11 @@ func (frame *RTUFrame) Bytes() []byte { return bytes } +// GetFunction returns the Modbus function code. +func (frame *RTUFrame) GetAddress() uint8 { + return frame.Address +} + // GetFunction returns the Modbus function code. func (frame *RTUFrame) GetFunction() uint8 { return frame.Function diff --git a/servertu.go b/servertu.go index 3f526de..ab63803 100644 --- a/servertu.go +++ b/servertu.go @@ -9,17 +9,17 @@ import ( // ListenRTU starts the Modbus server listening to a serial device. // For example: err := s.ListenRTU(&serial.Config{Address: "/dev/ttyUSB0"}) -func (s *Server) ListenRTU(serialConfig *serial.Config) (err error) { +func (s *Server) ListenRTU(serialConfig *serial.Config, deviceId uint8) (err error) { port, err := serial.Open(serialConfig) if err != nil { log.Fatalf("failed to open %s: %v\n", serialConfig.Address, err) } s.ports = append(s.ports, port) - go s.acceptSerialRequests(port) + go s.acceptSerialRequests(port, deviceId) return err } -func (s *Server) acceptSerialRequests(port serial.Port) { +func (s *Server) acceptSerialRequests(port serial.Port, deviceId uint8) { for { buffer := make([]byte, 512) @@ -41,10 +41,14 @@ func (s *Server) acceptSerialRequests(port serial.Port) { log.Printf("bad serial frame error %v\n", err) return } + if frame.GetAddress() == deviceId { + request := &Request{port, frame} + s.requestChan <- request + } else { + log.Printf("wrong slave address") + } - request := &Request{port, frame} - - s.requestChan <- request + } } }