diff --git a/framertu.go b/framertu.go index 75b0e11..0144298 100644 --- a/framertu.go +++ b/framertu.go @@ -29,8 +29,8 @@ func NewRTUFrame(packet []byte) (*RTUFrame, error) { } frame := &RTUFrame{ - Address: uint8(packet[0]), - Function: uint8(packet[1]), + Address: packet[0], + Function: packet[1], Data: packet[2 : pLen-2], } @@ -39,8 +39,8 @@ func NewRTUFrame(packet []byte) (*RTUFrame, error) { // Copy the RTUFrame. func (frame *RTUFrame) Copy() Framer { - copy := *frame - return © + rtuFrame := *frame + return &rtuFrame } // Bytes returns the Modbus byte stream based on the RTUFrame fields diff --git a/frametcp.go b/frametcp.go index 7c89d4b..2fd15a3 100644 --- a/frametcp.go +++ b/frametcp.go @@ -26,8 +26,8 @@ func NewTCPFrame(packet []byte) (*TCPFrame, error) { TransactionIdentifier: binary.BigEndian.Uint16(packet[0:2]), ProtocolIdentifier: binary.BigEndian.Uint16(packet[2:4]), Length: binary.BigEndian.Uint16(packet[4:6]), - Device: uint8(packet[6]), - Function: uint8(packet[7]), + Device: packet[6], + Function: packet[7], Data: packet[8:], } @@ -41,8 +41,8 @@ func NewTCPFrame(packet []byte) (*TCPFrame, error) { // Copy the TCPFrame. func (frame *TCPFrame) Copy() Framer { - copy := *frame - return © + tcpFrame := *frame + return &tcpFrame } // Bytes returns the Modbus byte stream based on the TCPFrame fields diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..9f7a954 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/zing-dev/mbserver + +go 1.15 + +require ( + github.com/goburrow/modbus v0.1.0 + github.com/goburrow/serial v0.1.0 +) diff --git a/server.go b/server.go index 0020dd6..33e4320 100644 --- a/server.go +++ b/server.go @@ -15,7 +15,7 @@ type Server struct { listeners []net.Listener ports []serial.Port requestChan chan *Request - function [256](func(*Server, Framer) ([]byte, *Exception)) + function [256]func(*Server, Framer) ([]byte, *Exception) DiscreteInputs []byte Coils []byte HoldingRegisters []uint16 @@ -84,8 +84,10 @@ func (s *Server) handle(request *Request) Framer { func (s *Server) handler() { for { request := <-s.requestChan - response := s.handle(request) - request.conn.Write(response.Bytes()) + go func() { + response := s.handle(request) + request.conn.Write(response.Bytes()) + }() } } diff --git a/servertu.go b/servertu.go index 3f526de..a47939f 100644 --- a/servertu.go +++ b/servertu.go @@ -1,6 +1,7 @@ package mbserver import ( + "bytes" "io" "log" @@ -20,30 +21,31 @@ func (s *Server) ListenRTU(serialConfig *serial.Config) (err error) { } func (s *Server) acceptSerialRequests(port serial.Port) { + buffer := bytes.Buffer{} for { - buffer := make([]byte, 512) - - bytesRead, err := port.Read(buffer) + buf := make([]byte, 512) + bytesRead, err := port.Read(buf) + log.Println("[mbserver] buffer", buf[:bytesRead]) if err != nil { if err != io.EOF { log.Printf("serial read error %v\n", err) } return } - - if bytesRead != 0 { - - // Set the length of the packet to the number of read bytes. - packet := buffer[:bytesRead] - - frame, err := NewRTUFrame(packet) + buffer.Write(buf[:bytesRead]) + for buffer.Len() > 5 { + b := make([]byte, buffer.Len()) + _, err := buffer.Read(b) + if err != nil { + log.Printf("buffer read error %v\n", err) + break + } + frame, err := NewRTUFrame(b) if err != nil { log.Printf("bad serial frame error %v\n", err) return } - request := &Request{port, frame} - s.requestChan <- request } }